天天看点

Maven实战. 3.3编写测试代码

<b>3.4打包和运行</b>

将项目进行编译、测试之后,下一个重要步骤就是打包(package)。hello world的pom中没有指定打包类型,使用默认打包类型jar。简单地执行命令 mvn clean package 进行打包,可以看到如下输出:…

tests run: 1, failures: 0, errors: 0, skipped:

[info] [jar:jar {execution: defaultjar}]

[info] building jar: d:\code\helloworld\target\helloworld1.0snapshot.jar

[info]

------------------------------------------------------------------------

[info] build successful

…类似地,maven会在打包之前执行编译、测试等操作。这里看到jar:jar任务负责打包,实际上就是jar插件的jar目标将项目主代码打包成一个名为helloworld1.0snapshot.jar的文件。该文件也位于target/输出目录中,它是根据artifactversion.jar规则进行命名的,如有需要,还可以使用finalname来自定义该文件的名称,这里暂且不展开,后面会详细解释。

至此,我们得到了项目的输出,如果有需要的话,就可以复制这个jar文件到其他项目的classpath中从而使用helloworld类。但是,如何才能让其他的maven项目直接引用这个jar呢?还需要一个安装的步骤,执行 mvn clean install:…

[info] building jar: d: \code\helloworld\target\helloworld1.0snapshot.jar

[info] [install:install {execution: defaultinstall}]

[info] installing d:\code\helloworld\target\helloworld1.0snapshot.jar to c:\users\juven\.m2\repository\com\juvenxu\mvnbook\helloworld\1.0snapshot\helloworld1.0snapshot.jar

…在打包之后,又执行了安装任务install:install。从输出可以看到该任务将项目输出的jar安装到了maven本地仓库中,可以打开相应的文件夹看到hello world项目的pom和jar。之前讲述junit的pom及jar的下载的时候,我们说只有构件被下载到本地仓库后,才能由所有maven项目使用,这里是同样的道理,只有将hello world的构件安装到本地仓库之后,其他maven项目才能使用它。

我们已经体验了maven最主要的命令:mvn clean compile、mvn clean test、mvn clean package、mvn clean install。执行test之前是会先执行compile的,执行package之前是会先执行test的,而类似地,install之前会执行package。可以在任何一个maven项目中执行这些命令,而且我们已经清楚它们是用来做什么的。

到目前为止,还没有运行hello world项目,不要忘了helloworld类可是有一个main方法的。默认打包生成的jar是不能够直接运行的,因为带有main方法的类信息不会添加到manifest中(打开jar文件中的metainf/manifest.mf文件,将无法看到mainclass一行)。为了生成可执行的jar文件,需要借助mavenshadeplugin,配置该插件如下:&lt;plugin&gt;

&lt;groupid&gt;org.apache.maven.plugins&lt;/groupid&gt;

&lt;artifactid&gt;mavenshadeplugin&lt;/artifactid&gt;

&lt;version&gt;1.2.1&lt;/version&gt;

&lt;executions&gt;

&lt;execution&gt;

&lt;phase&gt;package&lt;/phase&gt;

&lt;goals&gt;

&lt;goal&gt;shade&lt;/goal&gt;

&lt;/goals&gt;

&lt;configuration&gt;

&lt;transformers&gt;

&lt;transformer implementation="org.apache.maven.plugins.shade.resource.

manifestresourcetransformer"&gt;

&lt;mainclass&gt;com.juvenxu.mvnbook.helloworld.helloworld&lt;/mainclass&gt;

&lt;/transformer&gt;

&lt;/transformers&gt;

&lt;/configuration&gt;

&lt;/execution&gt;

&lt;/executions&gt;

&lt;/plugin&gt; plugin元素在pom中的相对位置应该在&lt;project&gt;&lt;build&gt;&lt;plugins&gt;下面。我们配置了mainclass为com.juvenxu.mvnbook.helloworld.helloworld,项目在打包时会将该信息放到manifest中。现在执行 mvn clean install,待构建完成之后打开target/目录,可以看到helloworld1.0snapshot.jar和originalhelloworld1.0snapshot.jar,前者是带有mainclass信息的可运行jar,后者是原始的jar,打开helloworld1.0snapshot.jar的metainf/manifest.mf,可以看到它包含这样一行信息:mainclass: com.juvenxu.mvnbook.helloworld.helloworld现在,在项目根目录中执行该jar文件:d: \code\helloworld&gt;javajar target\helloworld1.0snapshot.jar

hello maven控制台输出为hello maven,这正是我们所期望的。

本小节介绍了hello world项目,侧重点是maven而非java代码本身,介绍了pom、maven项目结构以及如何编译、测试、打包等。