构建生命周期
构建生命周期基础
Maven 提倡了一个构建生命周期的中心概念。这意味着一个项目的构建过程和发布都是已经被清楚的。对于那些构建项目的人来说,这意味着只需要学习少许命令就能编译大多数maven项目,并且从pom中可以拿到所有他们需要的东西。
这里有三个内置的构建周期: default, clean 和 site。 default 用于处理你项目的发布; clean 用于清理你的项目构建过程的产出物; site用于创建项目的文档。
构建的声明周期是由Phases构成的
每一个生命周期都被定义成不同的 构建阶段(build phases)集合。举个例子,default 构建周期y由下面的阶段组成。
- validate:验证项目是否正确以及所有必须的信息是否有效
- compile:编译项目的源码
- test:执行测试代码
- package:打包
- verify:执行并检查集成测试的结果
- install:安装项目到本地仓库
- deploy:发布到远程仓库
这些构建阶段(还有些阶段没有展示)将被依次执行,构成一个完整的default 构建周期。
一个构建阶段由一系列Plugin Goals 组成
虽然,一个构建阶段为一个构建生命周期的特定步骤负责,但对于不同的周期,它们履行的职责是不尽相同的。而这些是通过设置绑定到具体阶段的plugin goals(插件目标)完成的。一个plugn goal(插件目标)代表一个特定的任务,参与到项目的构建管理过程中。他可以绑定到零个或多个构建阶段。就算一个目标没有绑定到任何的构建阶段,它也可以通过外部命令直接执行。目标执行的顺序取决于目标和构建阶段。举个例子,下面的这条命令
mvn clean dependency:copy-dependencies package
clean 和 package 参数都是构建阶段,而dependency:copy-dependencies 是一个插件的目标。
命令执行的时候,clean 阶段首先会执行(这意味着所有在clean阶段前面的构建阶段都会被依次执行,包括 clean阶段),然后是dependency:copy-dependencies目标,然后才是package。
如果一个目标被绑定在了多个阶段,这个目标在每一个阶段中都会被执行。
此外,一个构建阶段可以有零个或多个构建目标。如果没有,那么这个构建阶段将该不会被执行。
有些构建阶段不常会在命令行中调用
以“-”连字符命名的阶段 phases,如(pre-,post-,process-*),通常不会直接在命令中调用的。这些,这些阶段是构建序列中的一部分,但是产出只作为中间件,不会被外部所用。
设置你项目的构建生命周期
Packaging
首先,大多数常见的方式是修改项目的打包类型 pom.xml 中的 。它的取值可以是 jar, war, ear 和 pom。如果没有提供,则默认 jar 。
每一种打包类型,都会有自己专属的阶段目标,以jar为例
Plugins
第二种修改的方式是添加 插件的goal(目标)到构建阶段中。plugin (插件)是goal(目标)的提供者。此外,一个插件可以有一个或多个目标。比如说,compiler plugin (编译插件)就有两个goals(目标):compile 和 testCompile。第一个是编译源代码,第二个是编译测试代码。
plugin 可以指定将自己的目标绑定到构建周期的哪个阶段。
新绑定的阶段会被追加到 前面所说的packaging 类型定义好的目标列表中。默认情况下会先执行内置的目标,然后才是追加的目标。但是你可以通过元素获取到更多执行的控制。
举个例子,Modello 插件默认绑定 目标 modello:java 到 generate-sources 阶段(modello:java目标是生成java源码)。所以想使用Modello插接件让它从模型中生成代码,并且让它协作到构建当中,你需要增加以下插件到 中。
...
<plugin>
<groupId>org.codehaus.modello</groupId>
<artifactId>modello-maven-plugin</artifactId>
<version>1.8.1</version>
<executions>
<execution>
<configuration>
<models>
<model>src/main/mdo/maven.mdo</model>
</models>
<version>4.0.0</version>
</configuration>
<goals>
<goal>java</goal>
</goals>
</execution>
</executions>
</plugin>
...
你可能会好奇为什么节点会在这里。这是因为你可以执行一个目标多次,如果有必要的话。每一个可以给一个Id, 当需要继承或想要控制应用的构建喜好文件是,可以管理一个目标是否被合并执行或扔掉。
当多个被绑定到了同一个阶段,他们将会安装绑定的顺序执行,顺序即在pom中的声明顺序。
在modello:java这个例子中,它只会在generate-sources阶段起作用。但是有些目标可以被用在其他阶段,虽然看起来不那么明智哈。再举个例子,如果你想展示一些构建中的实践,你有一个目标 display:time, 并且向让它在process-test-resources阶段执行。你需要如下的配置。
...
<plugin>
<groupId>com.mycompany.example</groupId>
<artifactId>display-maven-plugin</artifactId>
<version>1.0</version>
<executions>
<execution>
<phase>process-test-resources</phase>
<goals>
<goal>time</goal>
</goals>
</execution>
</executions>
</plugin>
...
内置的构建周期捆绑目标
一些阶段是有默认绑定的目标的。这些绑定的目标去觉得packaging的值,下面是详细的说明。
Packaging ejb / ejb3 / jar / par / rar / war
额外信息可以参考这份文档
https://maven.apache.org/ref/3.5.3/maven-core/lifecycles.html