Maven常用插件示例
0. resources管理
<resources> <resource> <directory>src/main/java</directory> <includes> <include>**/*.java</include> <include>**/*.xml</include> </includes> </resource> <resource> <directory>src/main/resources</directory> <includes> <include>**/*.txt</include> <include>**/*.properties</include> <include>**/*.xml</include> </includes> </resource> </resources> <testResources> <testResource> <directory>src/test/java</directory> <includes> <include>**/*.java</include> </includes> </testResource> <testResource> <directory>src/test/resources</directory> <includes> <include>**/*.txt</include> <include>**/*.xml</include> <include>**/*.properties</include> </includes> </testResource> </testResources>
一.maven-source-plugin
生成源码包, http://maven.apache.org/plugins/maven-source-plugin/ 。<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-source-plugin</artifactId> <version>2.2.1</version> <executions> <execution> <id>attach-source</id><!-- 名称随意指定 --> <phase>package</phase><!-- 要绑定到的生命周期的阶段 --> <goals> <goal>jar-no-fork</goal><!-- 要绑定的插件的目标 --> </goals> </execution> </executions> </plugin>这样在mvn package后便会在target目录下生成*-sources.jar源码包。
二. maven-javadoc-plugin
生成javadoc文档, http://maven.apache.org/plugins/maven-javadoc-plugin/ 。<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-javadoc-plugin</artifactId> <version>2.7</version> <executions> <execution> <id>attach-javadocs</id> <phase>package</phase> <goals> <goal>jar</goal> </goals> </execution> </executions> </plugin>这样在mvn package后便会在target目录下生成*-javadoc.jar文档包。
三. maven-compiler-plugin
指定JDK版本和编码
maven 2.1默认用jdk 1.3来编译,maven3 貌似是用jdk 1.5,如果项目用的jdk 1.6也会有问题,compiler插件可以指定JDK版本为1.6。
windows默认使用GBK编码,java项目经常编码为utf8,也需要在compiler插件中指出,否则中文乱码可能会出现编译错误。
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.1</version> <configuration> <source>1.6</source> <target>1.6</target> <encoding>UTF8</encoding> </configuration> </plugin>
四.maven-surefire-plugin
maven是使用surefire插件执行测试的,它按照指定格式的类名来查找匹配的测试类。
默认包含的测试类:
- **/*Test.java
- **/Test*.java
- **/*TestCase.java
默认排除的测试类:
- **/Abstract*Test.java
- **/Abstract*TestCase.java
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>2.16</version> <configuration> <argLine>-Xms128m -Xmx1024m -XX:PermSize=256m -XX:MaxPermSize=256m</argLine><!-- 设置单元测试时虚拟机内存 --> <includes> <include>**/*Test.java</include> </includes> <excludes> <exclude>**/TestConstants.java</exclude> </excludes> <forkMode>always</forkMode> </configuration> </plugin>forkMode:Maven运行测试用例时,是通过调用maven的surefire插件并fork一个子进程来执行用例的。forkmode属性中指明是要为每个测试创建一个进程,还是所有测试在同一个进程中完成。forkMode可设置值有 “never”, “once”, “always” 和 “pertest”。pretest: 每一个测试创建一个新进程,为每个测试创建新的JVM是单独测试的最彻底方式,但也是最慢的,不适合hudson上持续回归。once:在一个进程中进行所有测试。once为默认设置,在Hudson上持续回归时建议使用默认设置。always:在一个进程中并行的运行脚本,Junit4.7以上版本才可以使用,
使用该插件需要指定如下内容:
<testSourceDirectory>src/test/java</testSourceDirectory> <testOutputDirectory>target/test-classes</testOutputDirectory> <testResources> <testResource> <directory>src/test/java</directory> <includes> <include>**/*.xml</include> <include>**/*.properties</include> <include>**/*.java</include> </includes> </testResource> <testResource> <directory>src/test/resources</directory> <includes> <include>**/*.xml</include> <include>**/*.properties</include> </includes> </testResource> </testResources>
跳过单元测试
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <configuration> <skipTests>true</skipTests> </configuration> </plugin>skip=true,表示跳过单元测试,相当于-Dmaven.test.skip=true。
但是在执行mvn test -Dtest时,也会被跳过。解决方法是用excludes跳过所有测试,而不是用skipTests.
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>2.16</version> <configuration> <!-- <skipTests>true</skipTests> --> <excludes> <exclude>**/*.java</exclude> </excludes> </configuration> </plugin>即跳过所有test。这样再执行mvn test -Dtest就没有问题了。
五.maven-shade-plugin
构建包含依赖的jar包,http://maven.apache.org/plugins/maven-shade-plugin/。
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>1.4</version> <executions> <execution> <phase>package</phase><!-- 要绑定到的生命周期的阶段 --> <goals> <goal>shade</goal><!-- 要绑定的插件的目标 --> </goals> <configuration> <transformers> <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> <mainClass>com.adu.mvn_test.HelloWorld</mainClass><!-- 指定可执行jar包的主程序入口 --> </transformer> </transformers> </configuration> </execution> </executions> </plugin>mvn clean package后,target下可以看到 mvn-test-0.0.1-SNAPSHOT.jar 和 original-mvn-test-0.0.1-SNAPSHOT.jar 两个jar包,前者是带有依赖包(会解压)和Main-Class信息的可运行jar包,后者是原始的jar包(不包含依赖及Main-Class信息)。
打开mvn-test-0.0.1-SNAPSHOT.jar/META-INF/MANIFEST.MF可看到Main-Class: com.adu.mvn_test.HelloWorld信息。
可运行jar包的执行:$java -jar mvn-test-0.0.1-SNAPSHOT.jar 或者直接双击。