Maven的核心概念除了坐标、依赖及仓库之外还有两个核心的概念即生命周期和插件,对于Maven的生命周期是抽象的概念,其实际行为是由插件完成的,命令行的输入其实对应了插件的执行,如mvn package就表示执行默认的package阶段的任务,其行为由maven-jar-plugin完成。由此我们可知生命周期和插件两者是协同工作的,密不可分,本文将主要对插件其进行详细的介绍。
1.生命周期
项目构建的生命周期的概念在Maven出现之前就有了,软件开发人员每天都在对项目进行清理、编译、测试及部署。项目总是以手动或是脚本的方式反复的进行,没有统一的规范,Maven在不断的思考中总结了一套高度完善的、易扩展的生命周期。 这个生命周期包含了项目的清理、初始化、编译、测试、打包、集成测试、验证、部署和站点生成等。生命周期和插件的关系如图1.1所示
图1.1
也就是生命周期的行为其实和对应的插件是联系在一起的,插件执行命令行任务。
2.插件的绑定
Maven的生命周期与插件相互绑定,用以完成实际的构建任务。具体而言,是生命周期的阶段与插件的目标绑定。例如项目编译这一任务,它对应了default生命周期的compile阶段,而maven-compiler-plugin这一插件的compile目标就能完成这一任务,因此将它们绑定就能实现编译。
可能初学者会疑惑,自己并没有去绑定maven-compiler-plugin这个插件,为何还是能执行编译。其实maven为了让用户不用做任何配置就能构建maven项目,已经做了内置绑定,maven核心为主要生命周期阶段绑定了许多插件的目标,当用户通过命令调用生命周期阶段的时候,maven会检查是否用户的本地仓库有无这些绑定的插件,没有的话就会从远程仓库下载,这样对应的插件就会执行相应的任务了。
当然有内置绑定自然也有自定义绑定,用户可以根据自己项目需要选择某个插件的某个目标绑定到某个阶段。比如项目中我们经常要打source包,此时可以利用maven-source-plugin的jar-no-fork目标绑定到default生命周期的verify阶段上,具体配置如下所示:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>2.1.1</version>
<executions>
<execution>
<id>attach-sources</id>
<phase>verify</phase>
<goals>
<goal>jar-no-fork</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
3.插件的配置使用
3.1、命令行配置插件
在maven的使用过程中,我们经常会使用命令来执行maven命令,同样的很多插件也支持命令行配置来改变其某个行为,比如我们有时install时不想进行test阶段,那么此时我们就只需改变maven-surefire-plugin的maven.test.skip参数就可以做到:
$ mvn install -Dmaven.test.skip=true
参数-D是java自带的,其功能就是设置一个java系统属性
3.2、POM中插件全局配置
命令行设置有时是挺方便的,它改变的是少量插件的几个属性参数而已,但有些插件的参数从整个项目创建到发布都不会改变,那么POM的配置比命令行就方便了。以下列出了一些常用的插件的配置:
(1)Complier插件
该插件artifactId为maven-compiler-plugin,作用是编译工程源码(包含测试源码),默认使用JDK的javac命令进行编译。一个默认的配置如下所示:
由于compile实际调用的还是java命令,所以在编译的时候还需要配置如下的Compiler参数传递给java编译器:
执行命令:mvn compile
(2)Surefire插件
该插件的artifactId为maven-surefire-plugin,作用是执行单 元测试,可参考的配置如下所示:
特殊的可选配置如下:
1)忽略测试
在<configuration />下打开<skip>true</skip>,可以忽略测试 (与命令行的配置效果相同);
2)包含或者排除测试
<configuration>
<!—包含的测试用例-->
<includes>
<include>sample.java</include>
</ includes >
<!—排除的测试用例-->
<excludes>
<exclude>**/circleTest.java</exclude>
</ excludes >
< /configuration >
执行命令:mvn test
(3)War插件
该插件artifactId为maven-war-plugin,主要作用是负责收集依赖、类和资源然后进行打包。参考配置如下:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>2.1-alpha-1</version>
<configuration>
<!—排除的不需要的jar-->
<warSourceExcludes>
*/lib/analyzer- 2.0.4.jar
</warSourceExcludes>
<webResources>
<resource>
<directory>
src/main/webapp/WEB-INF
</directory>
<!-- 目标路径 -->
<targetPath>WEB-INF</targetPath>
</resource>
</webResources>
</configuration>
</plugin>
执行命令:mvn war
(4)Jar插件
该插件artifactId为maven-jar-plugin,主要作用是建立和部署jar包,默认绑定生命周期阶段的包,参考配置如下:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.4</version>
<configuration>
<classesDirectory>
project1/WEB-INF/classes
</classesDirectory>
<finalName>project1</finalName>
<outputDirectory>target</outputDirectory> </configuration>
</plugin>
执行命令:mvn jar
(5)Clean插件
该插件artifactId为maven-clean-plugin,主要用于清理构建过程中产生的文件,它只有一个目标(goal)即clean,常见的配置如下:
<plugin>
<artifactId>maven-clean-plugin</artifactId> <version>2.4.1</version>
<configuration>
<!—跳过clean-->
<skip>true</skip>
<!—忽略错误-->
<failOnError>false</failOnError>
</configuration>
</plugin>
执行命令:mvn clean
(6)Install插件
该插件artifactId为maven-install-plugin,主要作用是将项目部署至本地仓库,参考配置如下:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-install-plugin</artifactId>
<version>2.3.1</version>
<configuration>
<!-- 是否要创建校验-->
<createChecksum>false</createChecksum>
<!-- 是否更新元数据-->à <updateReleaseInfo>true</updateReleaseInfo>
</configuration>
</plugin>
执行命令:mvn install
(7)Deploy插件
该插件artifactId为maven-deploy-plugin,主要作用是将构件部署至远程仓库或共享仓库,参考配置如下:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-deploy-plugin</artifactId>
<version>2.4</version>
<configuration>
<!—选择远程仓库-->
<altDeploymentRepository>
<id>NewtouchProduct</id>
<name>NewtouchProduct</name>
<url> http://192.168.17.200:8081/nexus/content
/repositories/newtouchOneProject
</url>
</altDeploymentRepository>
<!—选择是否更新元数据,作为release版本发布-->
<updateReleaseInfo>true</updateReleaseInfo>
</configuration>
</plugin>
执行命令:mvn deploy
(8)Ant Run插件
该插件artifactId为maven-antrun-plugin,它有一个目标run,可以用来在maven中调用Ant任务,参考配置如下:
(9)Release插件
该插件artifactId为maven-release-plugin,主要用于版本的自动化发布,发布一个版本需要两步:prepare和release,参考配置如下:
1)为项目发布版本首先需要添加正确的版本控制系统信息 ,也就是说需要告诉release插件源码的位置,所以需要配置SCM信息
2)上述的配置只告诉了maven当前代码的位置,而版本发布还要 涉及标签的操作,因此还需要配置标签的基础目录,在版本发布的过程中,maven会从源码位置checkout一个副本至tags下,在此目录下操作,而不是在源码目录下操作,配置如下:
注意点:
a)系统必须提供svn命令行工具,maven执行过程中需要svn命 令行工具执行相关操作。
b)Pom必须配置了可用的部署仓库。
(10)Jetty插件
该插件artifactId为jetty-maven-plugin,它能周期性的检查项目的内容,发现变更后自动更新到内置的Jetty Web容器中,这时我们就可以直接测试web页面了,参考配置如下:
注意:
由于jetty-maven-plugin的groupId是org.mortbay.jetty,默认情况 下maven是不支持它的命令调用的,所以需要配置setting.xml:
<settings>
<pluginGroups>
<pluginGroup>org.mortbay.jetty</pluginGroup>
<pluginGroups>
<settings>
启动命令:mvn jetty:run
默认端口是8080,如果希望修改可以添加如下参数:
mvn jetty:run -Djetty.port=9999
附:插件获取信息
Maven的插件主要来源于Apache、Codehaus和Googlecode
Apache:http://maven.apache.org/plugins/index.html
Codehaus:http://mojo.codehaus.org/plugins.html
Googlecode:http://code.google.com/hosting/search?q=maven+plugin+label%3Amaven&projectsearch=Serach+Projects