<b>3.4打包和运行</b>
将项目进行编译、测试之后,下一个重要步骤就是打包(package)。hello world的pom中没有指定打包类型,使用默认打包类型jar。简单地执行命令 mvn clean package 进行打包,可以看到如下输出:…
tests run: 1, failures: 0, errors: 0, skipped:
[info] [jar:jar {execution: defaultjar}]
[info] building jar: d:\code\helloworld\target\helloworld1.0snapshot.jar
[info]
------------------------------------------------------------------------
[info] build successful
…类似地,maven会在打包之前执行编译、测试等操作。这里看到jar:jar任务负责打包,实际上就是jar插件的jar目标将项目主代码打包成一个名为helloworld1.0snapshot.jar的文件。该文件也位于target/输出目录中,它是根据artifactversion.jar规则进行命名的,如有需要,还可以使用finalname来自定义该文件的名称,这里暂且不展开,后面会详细解释。
至此,我们得到了项目的输出,如果有需要的话,就可以复制这个jar文件到其他项目的classpath中从而使用helloworld类。但是,如何才能让其他的maven项目直接引用这个jar呢?还需要一个安装的步骤,执行 mvn clean install:…
[info] building jar: d: \code\helloworld\target\helloworld1.0snapshot.jar
[info] [install:install {execution: defaultinstall}]
[info] installing d:\code\helloworld\target\helloworld1.0snapshot.jar to c:\users\juven\.m2\repository\com\juvenxu\mvnbook\helloworld\1.0snapshot\helloworld1.0snapshot.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文件中的metainf/manifest.mf文件,将无法看到mainclass一行)。为了生成可执行的jar文件,需要借助mavenshadeplugin,配置该插件如下:<plugin>
<groupid>org.apache.maven.plugins</groupid>
<artifactid>mavenshadeplugin</artifactid>
<version>1.2.1</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.
manifestresourcetransformer">
<mainclass>com.juvenxu.mvnbook.helloworld.helloworld</mainclass>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin> plugin元素在pom中的相对位置应该在<project><build><plugins>下面。我们配置了mainclass为com.juvenxu.mvnbook.helloworld.helloworld,项目在打包时会将该信息放到manifest中。现在执行 mvn clean install,待构建完成之后打开target/目录,可以看到helloworld1.0snapshot.jar和originalhelloworld1.0snapshot.jar,前者是带有mainclass信息的可运行jar,后者是原始的jar,打开helloworld1.0snapshot.jar的metainf/manifest.mf,可以看到它包含这样一行信息:mainclass: com.juvenxu.mvnbook.helloworld.helloworld现在,在项目根目录中执行该jar文件:d: \code\helloworld>javajar target\helloworld1.0snapshot.jar
hello maven控制台输出为hello maven,这正是我们所期望的。
本小节介绍了hello world项目,侧重点是maven而非java代码本身,介绍了pom、maven项目结构以及如何编译、测试、打包等。