Maven的构建生命周期

构建生命周期

构建生命周期基础


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为例

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的值,下面是详细的说明。

Clean

Packaging ejb / ejb3 / jar / par / rar / war

Packaging ear

Packaging maven-plugin

Packaging pom

Site

额外信息可以参考这份文档

https://maven.apache.org/ref/3.5.3/maven-core/lifecycles.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值