Maven-lifecycle、phase、goal

对一个项目进行打包时,maven分别执行了 validate->compile->test->package,这个过程就是生命周期(lifecycle)。在生命周期的过程中会有很多的阶段(phase),这些阶段按照既定的顺序执行来完成一个项目的构建。

在生命周期中,各个阶段的工作由插件(plugin)来完成,一个插件通常可以完成一个或者多个阶段的工作。每个阶段的工作对应插件中的一个目标(goal)。不同的插件结合起来,就完成了整个项目的构建。

生命周期-lifecycle

maven的生命周期可以分为三大类:

  1. Clean Lifecycle:在进行真正的构建之前进行一些清理工作
  2. Default Lifecycle:构建的核心部分,编译,测试,打包,部署等等
  3. Site Lifecycle:生成项目报告,站点,发布站点

Clean Lifecycle

生命周期Clean Lifecycle包含的阶段(phase)

  • pre-clean:执行一些需要在clean之前完成的工作
  • clean:移除所有上一次构建生成的文件
  • post-clean:执行一些需要在clean之后立刻完成的工作

Default Lifecycle

生命周期Default Lifecycle包含的阶段(phase)

  • validate:验证工程是否正确,所需的信息是否完整
  • initialize:初始化构建平台,例如:设置properties或创建目录
  • generate-sources
  • process-sources
  • generate-resources
  • process-resources:复制并处理资源文件,至目标目录,准备打包
  • compile:编译源代码
  • process-classes:源码编译后的后期处理,比如java字节码的增强(优化?)
  • generate-test-sources
  • process-test-sources
  • generate-test-resources
  • process-test-resources
  • test-compile:编译测试源代码(默认是test目录下)
  • process-test-class
  • test:执行单元测试
  • prepare-package
  • package:将工程文件打包为指定的格式,例如JAR,WAR等
  • pre-integration-test
  • integration-test:集成测试
  • post-integration-test
  • verify:检查package是否有效、符合标准
  • install:将包安装至本地仓库,以让其它项目依赖。
  • deploy:将最终的包复制到远程的仓库,以让其它开发人员与项目共享。

Site Lifecycle

生命周期Site Lifecycle包含的阶段(phase)

  • pre-site:执行一些需要在生成站点文档之前完成的工作
  • site:生成项目的站点文档
  • post-site:执行一些需要在生成站点文档之后完成的工作,并且为部署做准备
  • site-deploy:将生成的站点文档部署到特定的服务器上

注:执行一个phase将会执行这个lifecycle前面的所有phase

goal

执行phase实际执行的是goal。如果一个phase没有绑定goal,那这个phase就不会被执行。一些phase默认已经绑定了一些goal。例如:阶段compile绑定的goal是compiler:compile、阶段package绑定的goal是jar:jar。
所以,phase其实就是goal的容器,实际被执行的都是goal。phase被执行时,实际执行的都是被绑定到该phase的goal。

例子:

mvn clean dependency:copy-dependencies package
  • clean是phase。
  • dependency:copy-dependencies是goal。maven-dependency-plugin插件的copy-dependencies(goal目标)。
  • package也是一个phase。

maven会顺序执行这3个对象中包含的所有goal。clean阶段会首先执行(包括在它以前的阶段),然后是dependency:copy-dependencies插件目标,最后package阶段被执行(包括它之前的阶段)。

注:dependency:copy-dependencies是一种 “前缀:目标” 的简写方式。默认情况下,Maven通过去除artifactId的maven和plugin来确定插件前缀

  • maven-${prefix}-plugin:官方插件使用的artifactId
  • ${prefix}-maven-plugin:其他来源的插件(如 tomcat 插件:tomcat7-maven-plugin)

所以,dependency:copy-dependencies表示使用maven-dependency-plugin插件的copy-dependencies目标。

自定义plugin

我们可以通过在project中使用plugin,将各种各样的goal加入到Maven的phase中,从而根据自己的实际需求,灵活实现各种定制功能。

如何将display-maven-plugin中的goal time绑定到process-test-resources这个phase中

<project xmlns="http://maven.apache.org/POM/4.0.0"     
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"     
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0http://maven.apache.org/maven-v4_0_0.xsd">    
   
   ...
   
   <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>
</project>

在编译时执行HelloWord类的man方法

<project xmlns="http://maven.apache.org/POM/4.0.0"     
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"     
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0http://maven.apache.org/maven-v4_0_0.xsd">    
   
   ...
   <plugin>
       <groupId>org.codehaus.mojo</groupId>
       <artifactId>exec-maven-plugin</artifactId>
       <version>1.2.1</version>
       <executions>
           <execution>
               <!-- 绑定到编译的生命周期 -->
               <phase>compile</phase>
               <goals>
                   <!-- 执行目标java -->
                   <goal>java</goal>
               </goals>
               <configuration>
                   <mainClass>x.x.x.HelloWord</mainClass>
               </configuration>
           </execution>
       </executions>
   </plugin>
</project>

如果想知道插件中包含哪些goal:

mvn help:describe -Dplugin=org.apache.maven.plugins:maven-eclipse-plugin:2.10

输出:

### Maven PMD 插件在 Nacos 项目中的错误分析与解决方案 在使用 Maven 构建工具时,`maven-pmd-plugin` 是一个用于静态代码分析的插件。然而,在某些情况下,该插件可能会因不支持特定的 `targetJdk` 值而抛出错误。例如,当尝试将 `targetJdk` 设置为 `'21'` 时,可能会遇到如下错误: ``` [ERROR] Failed to execute goal org.apache.maven.plugins:maven-pmd-plugin:3.20.0:pmd (pmd) on project nacos-api: Unsupported targetJdk value '21' ``` 此问题的根本原因在于 `maven-pmd-plugin` 的版本限制。截至当前版本(3.20.0),该插件可能尚未完全支持 Java 21 或更高版本[^1]。 以下是解决此问题的详细方法: --- #### 方法一:降级 JDK 版本 如果项目允许,可以考虑将目标 JDK 版本从 `21` 降级到受支持的版本(如 `17` 或 `11`)。修改 `pom.xml` 文件中的配置如下: ```xml <properties> <maven.compiler.source>17</maven.compiler.source> <maven.compiler.target>17</maven.compiler.target> </properties> ``` 同时,确保 `maven-pmd-plugin` 的配置中指定正确的 `targetJdk` 值: ```xml <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-pmd-plugin</artifactId> <version>3.20.0</version> <configuration> <targetJdk>17</targetJdk> </configuration> </plugin> ``` --- #### 方法二:升级 PMD 插件版本 如果必须使用 JDK 21,则需要检查是否有更新版本的 `maven-pmd-plugin` 支持 Java 21。可以通过访问 [Maven Central Repository](https://search.maven.org/) 检查最新版本。 假设最新版本为 `3.25.0`,可以在 `pom.xml` 中更新插件版本: ```xml <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-pmd-plugin</artifactId> <version>3.25.0</version> <configuration> <targetJdk>21</targetJdk> </configuration> </plugin> ``` 如果仍无法解决问题,可能需要等待官方发布支持 Java 21 的新版本。 --- #### 方法三:禁用 PMD 插件 如果上述方法均不可行,并且 PMD 分析并非项目的核心需求,可以选择暂时禁用该插件。通过以下配置跳过 PMD 执行: ```xml <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-pmd-plugin</artifactId> <version>3.20.0</version> <executions> <execution> <phase>none</phase> </execution> </executions> </plugin> ``` 或者在命令行中添加 `-Dpmd.skip=true` 参数运行 Maven: ```bash mvn clean install -Dpmd.skip=true ``` --- #### 方法四:自定义 PMD 规则集 如果需要继续使用 PMD 插件,但希望避免因 `targetJdk` 不匹配导致的问题,可以尝试定义自定义规则集文件(`.xml` 格式)。通过规则集文件忽略与 JDK 版本相关的规则。 创建一个规则集文件 `custom-ruleset.xml`: ```xml <?xml version="1.0"?> <ruleset name="Custom Ruleset"> <rule ref="rules/java/unusedcode"/> <rule ref="rules/java/naming"/> </ruleset> ``` 然后在 `pom.xml` 中引用该规则集: ```xml <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-pmd-plugin</artifactId> <version>3.20.0</version> <configuration> <rulesets> <ruleset>custom-ruleset.xml</ruleset> </rulesets> </configuration> </plugin> ``` --- ### 示例代码块 以下是一个完整的 `pom.xml` 配置示例,适用于方法二(升级 PMD 插件版本): ```xml <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-pmd-plugin</artifactId> <version>3.25.0</version> <configuration> <targetJdk>21</targetJdk> </configuration> </plugin> </plugins> </build> ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不会叫的狼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值