Maven生命周期和插件的关系
前面说了,Maven定义了3套相互独立的生命周期。每套生命周期中都包含着一系列的阶段(phase)。这些phase就相当于Maven提供的统一的接口,然后这些phase的实现由Maven的插件来完成。
我们在输入mvn命令的时候 比如 mvn clean,clean对应的就是Clean生命周期中的clean阶段。但是clean的具体操作是由maven-clean-plugin来实现的。
所以说Maven生命周期的每一个阶段的具体实现都是由Maven插件实现的。
插件目标(Plugin Goal)
插件能够为Maven提供不同的功能,而一个插件可能包含多个插件目标(goals),目标可以说是Maven中的最小工作单元。
比如compile:compile 表示执行compile插件的 compile目标。
一个插件通常可以完成多个任务,每一个任务就叫做插件的一个目标。如执行mvn install命令时,调用的插件和执行的插件目标如下:
每个插件都有哪些个目标,官方文档有更详细的说明:Maven Plugins
插件的运行
1. 直接调用插件的目标 mvn plugin:goals
例如
mvn compile:compile
mvn clean:clean
2. 绑定到生命周期的phase中
- 首先Maven默认绑定了一些插件到phase中比如
phase | goals |
---|---|
clean | clean:clean |
phase | goals |
---|---|
process-resources | resources:resources |
compile | compiler:compile |
process-test-resources | resources:testResources |
test-compile | compiler:testCompile |
test | surefire:test |
package | ejb:ejb或ejb3:ejb3或jar:jar或par:par或rar:rar或war:war |
install | install:install |
deploy | deploy:deploy |
在当packaging设置为ejb/ejb3/jar/par/rar/war 其中之一的时候,default lifecycle只有下面phase绑定了goal。
phase | goals |
---|---|
process-resources | resources:resources |
compile | compiler:compile |
process-test-resources | resources:testResources |
test-compile | compiler:testCompile |
test | surefire:test |
package | ejb:ejb或ejb3:ejb3或jar:jar或par:par或rar:rar或war:war |
install | install:install |
deploy | deploy:deploy |
phase | goals |
---|---|
site | site:site |
site-deploy | site:deploy |
- 上面是部分Maven已经默认绑定的目标。
- 在默认情况下,并不是所有的phase都绑定了goal,比如clean这个lifecycle是有三个phase的,但是只有其中的一个名为clean的phase默认绑定了一个clean:clean goal,其它两个phase默认没有绑定任何goal。
其他默认的插件目标绑定请参考Maven官方文档。
- 自定义绑定插件
可以在pom.xml中进行绑定配置
<project>
...
<build>
<plugins>
<plugin>
<!-- groupId artifactId version 是maven的坐标 -->
<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>
...
</project>
以上示例中,声明了maven-source-plugin(使用groupId、artifactId、version指定)。然后在<executions>元素下指定多个任务<execution>,通过指定多个<execution>,就可以把相同插件的目标绑定到不同的生命周期阶段。
<id>指定任务名称(在一个插件中必须唯一),
<phase>指定到的生命周期阶段,
<goal>指定插件目标。
如果没有指定<phase>,那么就会绑定到插件默认的生命周期阶段上。如果插件没有默认生命周期阶段,那么插件目标将不会被执行。
通过以上的配置,现在执行mvn verify将看到maven-source-plugin的jar-no-fork目标被执行。
以后在执行mvn package命令打包项目时,在package阶段之后会执行源代码打包,生成如:ehcache-core-2.5.0-sources.jar形式的源码包。
3. 配置插件
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.7</source>
<target>1.7</target>
</configuration>
</plugin>
maven compile插件默认使用的编译版本是1.5,可以通过配置修改编译版本。
也可以对插件的各个目标进行更具体的配置。Configuring Plug-ins