1.maven的生命周期
maven的生命周期,其实是对项目构建生命周期的抽象与统一。命令行的输入,就是对应了生命周期,例如mvn package就是执行默认生命周期的package阶段。以下的模板方法可以体现出maven生命周期的概念:
public abstract class AbstractBuild { public void build() { initialize(); compile(); test(); package(); integrationTest(); deploy(); } protected abstract void initialize(); protected abstract void compile(); protected abstract void test(); protected abstract void package(); protected abstract void integrationTest(); protected abstract void deploy(); }
maven的生命周期不是一个整体,而是有三套相互独立的生命周期,分别是clean(清理项目)、default(构建项目)和site(建立项目站点)。而每个生命周期有包含了不同的阶段,下面来列出(阶段是按执行顺序来排列的):
- clean:pre-clean/clean/post-clean
- default:validate/initialize/generate-sources/process-sources/generate-resources/process-resources/compile/process-classes/generate-test-sources/process-test-sources/generate-test-resources/process-test-resources/test-compile/process-test-classes/test/prepare-package/package/pre-integration-test/integration-test/post-integration-test/verify/install/deploy
- site:pre-site/site/post-site/site-deploy
maven的三个生命周期之间是独立的,但是一个生命周期的每个阶段是前后依赖的。例如,当执行mvn clean时,实际上执行的是pre-clean和clean两个阶段。当执行mvn install时,实际上执行了install前的所有阶段,但它不会执行clean生命周期。
再回到上面的模板方法,maven的生命周期其实是抽象的,本身不会做任何的工作。实际工作都是交给插件来完成的,如package阶段的任务会由maven-jar-plugin来完成。
2.maven中的插件
(1)插件目标
上面提到,maven生命周期中的具体工作是由插件完成的。具体来说,是生命周期的阶段与插件的目标相互绑定,以完成某个具体的构建任务。那什么是插件目标呢?
对于插件而言,为了能够代码复用,往往都具有多个功能。比如maven-dependency-plugin,它能分析项目依赖,能列出项目的依赖树,还能够列出项目已解析的依赖等等。我们不能够为每个功能来编写一个插件,因为这样代码无法复用。所以把这些功能聚集在一个插件里,每个功能就是一个目标。
(2)插件绑定
下面的配置给出了怎样将生命周期的阶段与插件的目标相互绑定。
<plugin> <groupId>org.apache.avro</groupId> <artifactId>avro-maven-plugin</artifactId> <version>1.7.6</version> <configuration> <sourceDirectory>${project.basedir}/source/</sourceDirectory> <outputDirectory>${project.basedir}/target/</outputDirectory> </configuration> <executions> <execution> <phase>generate-sources</phase> <goals> <goal>schema</goal> </goals> </execution> </executions> </plugin>
使用groupId、artifactId和version三个标签指定使用的maven插件,phase标签表示生命周期的某个阶段,goal标签设置插件的目标,configuration标签用来对插件进行配置(不同的插件有不同的配置项)。
(3)内置绑定
使用maven时,几乎不用配置便可以构建项目。这是因为maven为一些重要的生命周期阶段预先绑定了很多插件的目标。例如clean生命周期的clean阶段,预先与maven-clean-plugin:clean绑定。default生命周期的compile阶段,预先与maven-compiler-plugin:compile阶段绑定。我们可以在pom重新配置内置插件。
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.2</version> <configuration> <source>1.8</source> <target>1.8</target> </configuration> </plugin>
上面的插件设置了jdk版本为1.8(默认为1.5)。
运行maven,在控制台上可以看到生命周期阶段与插件目标的绑定关系。
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ test --- [INFO] Using 'UTF-8' encoding to copy filtered resources. [INFO] Copying 0 resource [INFO] [INFO] --- maven-compiler-plugin:3.2:compile (default-compile) @ test --- [INFO] Changes detected - recompiling the module! [INFO] Compiling 5 source files to /Users/zhengyi/Desktop/workspace/test/target/classes [INFO] [INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ test --- [INFO] Using 'UTF-8' encoding to copy filtered resources. [INFO] skip non existing resourceDirectory /Users/zhengyi/Desktop/workspace/test/src/test/resources [INFO] [INFO] --- maven-compiler-plugin:3.2:testCompile (default-testCompile) @ test --- [INFO] Nothing to compile - all classes are up to date [INFO] [INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ test --- [INFO] [INFO] --- maven-jar-plugin:2.4:jar (default-jar) @ test --- [INFO] Building jar: /Users/zhengyi/Desktop/workspace/test/target/test-0.0.1-SNAPSHOT.jar [INFO] [INFO] --- maven-install-plugin:2.4:install (default-install) @ test --- [INFO] Installing /Users/zhengyi/Desktop/workspace/test/target/test-0.0.1-SNAPSHOT.jar to /Users/zhengyi/.m2/repository/com/ee/test/0.0.1-SNAPSHOT/test-0.0.1-SNAPSHOT.jar [INFO] Installing /Users/zhengyi/Desktop/workspace/test/pom.xml to /Users/zhengyi/.m2/repository/com/ee/test/0.0.1-SNAPSHOT/test-0.0.1-SNAPSHOT.pom
最近在弄maven打包相关的活,楼主的这几篇文章真的是解决了我很多的困惑,感谢!
好文章!666,学习了