摘要:本文介绍maven的几个重要的插件:解压压缩包的插件(maven-dependency-plugin)、复制,删除,移动文件插件(maven-antrun-plugin)、执行任务插件(exec-maven-plugin)、打war包插件(maven-war-plugin)、打jar包插件(maven-jar-plugin)、打源码包插件(maven-source-plugin)。
--------------------------------------------------------解压压缩文件war(maven-dependency-plugin)--------------------------------------------------------------------------
一、解压压缩文件war(maven-dependency-plugin)
<!--解压文件-->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>unpack</id>
<phase>process-sources</phase>
<goals>
<goal>unpack</goal>
</goals>
<configuration>
<artifactItems>
<!-- 解压 ${test-artifactId}-${test-version}.war包-->
<artifactItem>
<groupId>com.hikvision</groupId>
<artifactId>${test-artifactId}</artifactId>
<version>${test-version}</version>
<type>war</type>
<classifier>war</classifier>
<overWrite>true</overWrite>
<outputDirectory>${resource-webapp}/${test-context}</outputDirectory>
<includes>**/*.*</includes>
<excludes>**/maven/,**/lib/</excludes>
</artifactItem>
<!-- 解压${test1-artifactId}-${test1-version}.war包-->
<artifactItem>
<groupId>com.hikvision</groupId>
<artifactId>${test1-artifactId}</artifactId>
<version>${test1-version}</version>
<type>war</type>
<overWrite>true</overWrite>
<outputDirectory>${resource-webapp}/${test1-context}</outputDirectory>
<includes>**/*.*</includes>
<excludes>**/maven/,**/lib/</excludes>
</artifactItem>
</artifactItems>
</configuration>
</execution>
</executions>
</plugin>
---------------------------------------------------------------------复制,删除,移动文件插件(maven-antrun-plugin)----------------------------------------------------------
二、复制,删除,移动文件插件(maven-antrun-plugin)
<!--拷贝文件-->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<version>1.8</version>
<executions>
<execution>
<id>copy</id>
<phase>generate-resources</phase>
<goals>
<goal>run</goal>
</goals>
<configuration>
<tasks>
<!-- 复制 -->
<copy todir="${test-webapp}/META-INF" overwrite="true">
<fileset dir="${test-webapp}/${test-context}/META-INF" />
<fileset dir="${test1-webapp}/${test1-context}/META-INF" />
</copy> <delete dir="${test-webapp}/${test-context}/META-INF"/>
<move file="${test-webapp}/${test-context}/WEB-INF/classes/version.properties" tofile="${test-webapp}/WEB-INF/classes/version/test.properties"/>
<move todir="${resource-webapp}/${br-context}">
<fileset dir="${resource-webapp}/${br-context}/${br-context}"/>
</move>
<copyfile src="${test-webapp}/${test-context}/fav.ico" dest="${test-webapp}/fav.ico"/>
</tasks>
</configuration>
</execution>
</executions>
</plugin>
---------------------------------------------------------------------------执行任务插件(exec-maven-plugin)-------------------------------------------------------------------------
三、执行任务插件(exec-maven-plugin)
说明:maven构建过程中,有时候需要执行一些脚本或者程序达到我们的特殊目的,执行任务插件(exec-maven-plugin)就是做这个用的。
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>1.1.1</version>
<executions>
<execution>
<id>genVersion</id>
<phase>compile</phase>
<goals>
<goal>java</goal>
</goals>
<configuration>
<mainClass>com.test.core.utils.svn.SVNVersionBuild</mainClass>
<arguments>
<argument>test</argument>
<argument>8.2.0</argument>
</arguments>
</configuration>
</execution>
</executions>
</plugin>
备注:com.test.core.utils.svn.SVNVersionBuild是一个java类,该类有main方法,同时该main方法需要两个参数。
---------------------------------------------------------------------------打war包插件(maven-war-plugin)-------------------------------------------------------------------------------
四、打war包插件(maven-war-plugin)
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>2.3</version>
</plugin>
</plugins>
</pluginManagement>
备注:默认打出来的war包名字为${artifactId}.war。参见文章:
-----------------------------------------------------------------打jar包插件(maven-jar-plugin)--------------------------------------------------------------------------------
五、打jar包插件(maven-jar-plugin)
说明:有时候我们需要将一个maven工程打成一个war包,同时需要将一部分代码以及资源打到一个jar包里面供其它项目使用,打jar包插件(maven-jar-plugin)就是做这个用的。
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<executions>
<execution>
<id>classJar</id>
<phase>package</phase>
<goals>
<goal>jar</goal>
</goals>
<configuration>
<classifier>classes</classifier>
<excludes>
<exclude>struts.xml</exclude>
</excludes>
</configuration>
</execution>
</executions>
</plugin>
备注:打出来的jar包名字为${artifactId}-${version}-${classifier}.jar
-----------------------------------------------------------------------打源码包插件(maven-source-plugin)----------------------------------------------------------------------------------
六、打源码包插件(maven-source-plugin)
说明:maven工程默认打出来的包里面只有class文件,有时候为了调试项目的需要,我们需要打出一个jar包带有java源文件,打源码包插件(maven-source-plugin)就是做这个用的。
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<executions>
<execution>
<id>attach-sources</id>
<goals>
<goal>jar</goal>
</goals>
</execution>
</executions>
</plugin>
备注:打出来的包名字为${artifactId}-${version}-sources.jar
-------------------------------------------------------------------findbugs-maven-plugin--------------------------------------------------------------------------------------------------
七、findbugs-maven-plugin插件
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>findbugs-maven-plugin</artifactId>
<version>2.3.2</version>
<configuration>
<excludeFilterFile>tools/findbugs/findbugs-exclude.xml</excludeFilterFile>
<threshold>High</threshold>
<effort>Default</effort>
</configuration>
</plugin>
运行findbugs任务前请先运行“mvn package”编译工程。
1、mvn findbugs:help 查看findbugs插件的帮助
2、mvn findbugs:check 检查代码是否通过findbugs检查,如果没有通过检查,检查会失败,但检查不会生成结果报表
3、mvn findbugs:findbugs 检查代码是否通过findbugs检查,如果没有通过检查,检查不会失败,会生成结果报表保存在target/findbugsXml.xml文件中
4、mvn findbugs:gui 检查代码并启动gui界面来查看结果
可以提高findbugs检查规则文件来使用用户自己的规则。
<configuration>
excludeFilterFile>findbugs-exclude.xml</excludeFilterFile>
<includeFilterFile>findbugs-include.xml</includeFilterFile>
</configuration>
具体findbugs插件的配置项可以参考:http://mojo.codehaus.org/findbugs-maven-plugin/findbugs-mojo.html
备注:findbugs与maven兼容性
maven V3.0.4与findbugs V2.3.2兼容,同时findbugs插件依赖于groovy-all这个jar包,版本为V2.3.5,配置如下:
<dependency>
<groupId>org.codehaus.groovy</groupId>
<artifactId>groovy-all</artifactId>
<version>2.3.5</version>
</dependency>
运行:findbugs:findbugs会生成findbugsXml.xml这个文件。
-------------------------------------------------------------build-helper-maven-plugin配置多个source resource文件----------------------------------
八、build-helper-maven-plugin插件
1、maven默认的源文件夹及资源文件夹的配置代码
<sourceDirectory > src/main/java </sourceDirectory >
<testSourceDirectory > src/test/java </testSourceDirectory >
<resources>
<resource>
<directory>src/main/resources<directory>
</resource>
</resources>
<testResources>
<testResource>
<directory>src/test/resources<directory>
</testResource>
</testResources>
2、配置多个源文件夹
从上面Maven的默认配置来看,原文件夹和测试源文件夹都只能配置一个,要配置多个源文件夹比较困难。这里我们先展示如何配置多个资源文件夹。
<resources>
<resource>
<directory>src/main/resources<directory>
</resource>
<resource>
<directory>src/labs/resources<directory>
</resource>
</resources>
配置好以后,IDE(eclipse)不会识别我们的配置,我们需要更新项目的配置:右击工程->Maven->update Project Configuration,更新后,在eclipse下项目资源文件夹src/labs/resources会展示成资源包。
有人会认为,在Eclipse下将这些文件夹都设置为源文件夹不就OK了吗?其实不然,Maven在构建的时候并不会去
读取任何IDE的配置信息,所以他不会知道我们再eclipse下指定的源文件夹,也不会将这些源文件夹下的代码编译打包。
3、配置读取源文件夹里面的资源文件
为了让Maven能够从元文件夹下读取资源文件(或将所有资源文件配置到源文件夹下),我们可以这样配置:
< resources >
< resource >
< directory > src/main/resources </ directory >
</ resource >
< resource >
< directory > src/labs/resources </ directory >
</ resource >
< resource >
< directory > src/main/java </ directory >
< includes >
< include > **/*.hbm.xml </ include >
</ includes >
</ resource >
< resource >
< directory > src/labs/java </ directory >
< includes >
< include > **/*.hbm.xml </ include >
</ includes >
</ resource >
</ resources >
这样,不仅 src/main/resources 和 src/labs/resources 这两个目录下的文件会作为资源文件被打包, src/main/java 和 src/labs/java 目录下的所有 .hbm.xml 文件也都会作为资源文件被打包。否则,Maven 构建时不会打包这两个目录下的 .hbm.xml 文件,导致运行时因为找不到资源文件而抛异常。
4、配置多个源文件夹
为了在Maven构建生命周期内为项目添加源文件夹:
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>build-helper-maven-plugin</artifactId>
<version>1.4</version>
<executions>
<execution>
<id>add-source</id>
<phase>generate-sources</phase>
<goals>
<goal>add-source</goal>
</goals>
<configuration>
<sources>
<source>${basedir}/src/labs/java</source>
<!-- 我们可以通过在这里添加多个source节点,来添加任意多个源文件夹 -->
</sources>
</configuration>
</execution>
还可以加resources:
<execution>
<id>add-resource</id>
<phase>generate-sources</phase>
<goals>
<goal>add-test-resource</goal>
</goals>
<configuration>
<resources>
< resource >
< directory >${basedir} src/labs/resource </ directory >
< /resource >
</resources>
</configuration>
</execution>
更新项目配置,就可以在eclipse中展现出正常的目录了。
-------------------------------------------------------------maven-surefire-plugin(测试用的maven插件)---------------------------------------
九、maven-surefire-plugin(测试用的maven插件)
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<argLine>-Xms512m -Xmx2048m -XX:PermSize=256m -XX:MaxPermSize=512m -Dfile.encoding=utf-8</argLine>
<includes>
<include>**/*TestSuite.java</include>
</includes>
<excludes>
<exculde>**/*Test.java</exculde>
</excludes>
</configuration>
</plugin>
备注:
Maven运行测试用例时,是通过调用maven的surefire插件并fork一个子进程来执行用例的。forkmode属性中指明是要为每个测试创建一个进程,还是所有测试在同一个进程中完成。
forkMode 可设置值有 “never”, “once”, “always” 和 “pertest”。
pretest: 每一个测试创建一个新进程,为每个测试创建新的JVM是单独测试的最彻底方式,但也是最慢的,不适合hudson上持续回归。
once:在一个进程中进行所有测试。once为默认设置,在Hudson上持续回归时建议使用默认设置。
always:在一个进程中并行的运行脚本,Junit4.7以上版本才可以使用,surefire的版本要在2.6以上提供这个功能,其中 threadCount:执行时,指定可分配的线程数量。只和参数parallel配合使用有效。默认:5。
<parallel>methods</parallel>
<threadCount>4</threadCount></span>
surefire里还有其它一些有趣的参数,如果有兴趣,你可以访问
http://maven.apache.org/plugins/maven-surefire-plugin/examples/inclusion-exclusion.html 来了解更多信息。
----------------------------------------------------------------maven-compiler-plugin----------------------------------------------------------------------------------------------------------
十、maven-compiler-plugin
用了一段时间maven了,但命令行跑maven命令还比较少,这一跑,还有好多问题。使用maven-compiler-plugin指定JDK版本和编码,才解决
mvn compile的错误。
compiler插件能解决:
1:maven 2.1默认用jdk 1.3来编译,maven 3 貌似是用jdk 1.5,如果项目用的jdk 1.6也会有问题,compiler插件可以指定JDK版本为1.6。
2:windows默认使用GBK编码,java项目经常编码为utf8,也需要在compiler插件中指出,否则中文乱码可能会出现编译错误。
如:
未结束的字符串字面值
需要 ';'
非法的表达式开始
需要 ';'
pom增加插件配置
<plugins>
<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>
</plugins>
然后mvn compile就没有以上错误了。
idea增加maven支持很简单,在module上右键--Add framework support,选上maven就可以了。还有idea中,依赖的scope如果是test的话,如果测试代码写在main/java下也会出错,确实对junit的依赖。idea的源码文件夹中直接有测试源码文件夹这种类型,测试类不能随便放。而eclipse则没有这个限制。
maven-compiler-plugin还可以更改编译jdk
<profiles>
[...]
<profile>
<id>compiler</id>
<properties>
<JAVA_1_4_HOME>C:\Program Files\Java\j2sdk1.4.2_09</JAVA_1_4_HOME>
</properties>
</profile>
</profiles>
dependencyManagement
pluginExecutionFilter
cobertura-maven-plugin
maven-assembly-plugin