maven 的 Build lifecycle

本文详细介绍了Maven构建过程中的三个核心生命周期:default、clean和site。解析了各个阶段的任务及其绑定的目标,阐述了如何通过配置<packaging>元素来定制打包阶段,并探讨了插件及其目标如何与构建阶段绑定。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

build 生命周期定义了building,testing,distributing等,是maven project的核心

3个内置的lifecycle  : default,clean,site

 

default lifecycle

   包含20 build phases,

   validate : 检查所有的project information是可用的并且是正确的

   initialize  初始化状态,如设置properties或者创建目录

   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     : 运行unit tests

   prepare-package

   package  : distribution format打包编译好的代码

   pre-integration-test

   Integration-test : 集成测试

   post-integration-test

   verify  :  检查集成测试的结果

   install : package 安装到local repository

   deploy  : package 安装到remote repository

 

当你执行一个build phase,所有以前的phases都会顺序执行

mvn install

mvn clean deploy

clean lifecycle

 负责项目清理

  pre-clean  执行clean前要求的processes

  clean       删除以前builds 产生的所有文件

  post-clean  执行完成clean后要求的processes

 

site lifecycle

  负责产生和部署project site documentation

 

pre-site: site动作前需要执行的processes

site:  产生项目的site documentation

Post-site : site后要执行的processes并准备布署

Site-deploy : 布署文档到指定的web server

 

plugin goals

  每个build phase 可以通过绑定不同的plugin goals 来完成不同的行为

一个plugin goal代表一个特定的task,它的范围比build phase要小; 一个plugin goal可以梆定到0个或者多个build phases. 没有绑定到任何build phasegoal可以通过直接调用在build lifecycle外执行;执行的顺序依赖于goalsbuild phases 调用的顺序。

 

mvn clean dependency:copy-dependencies package

如果一个goal 绑定到一个或多个build phases,在所有的这些phases执行时,这个goal都会被调用

一个build phase可以绑定0个或多个goals

maven 2.0.5及以后, 绑定到一个phase中的多个goals按照它们在pom中声明的顺序执行,但是

同一个pluginmultiple instances 是不支持的,maven 2.0.11及以后同一个pluginmultiple

instances 成为一组并按顺序一起执行

 

通常并不从命令行调用某些phases,因为它们之前或之后可能绑定了一些goal,pre-*,post-*或者process-*

 

使用

Packaging

   通过pom中的<packaging> 元素来定义package phase,合法的值包括jar,war,ear,pom,默认是jar

   每个packaging 包含了一些绑定到特定phasegoals,例如jar packaging 会绑定下面的goals到默认的

lifecyclebuild phases

 

process-resources           resources:resources

compile                       compiler:compile

process-test-resources   resources:testResources

test-compile               compiler:testCompile

test                       surefire:test

package                        jar:jar

install                        install:install

deploy                        deploy:deploy

 

 

packaging 的值是pom时,只给install deploy 绑定goals,

为了使某些packing types 可用,可能也需要在<build>节点指明

<extensions>true</extensions> for that plugin

 

 

Plugins

plugins 是给maven提供goalsartifacts.  每个plugin 可以有一个或多个goals.

如果每个phase 绑定了多个goals,来自于packaging 的先执行,在pom中配置的后执行。可以使用

<executions> 节点来获得更多的控制权

 

放在<build>节点的<plugins>节点的<plugin>节点里面

 

Built-in Lifecycle Bindings

一些phase 默认绑定了一些goals,对于default lifecycle,这些绑定依赖于packaging value.

 

clean                       clean:clean

 

Default Lifecycle Bindings - Packaging ejb / ejb3 / jar / par / rar / war

 

process-resources               resources:resources

compile                         compiler:compile

process-test-resources         resources:testResources

test-compile                     compiler:testCompile

test                             surefire:test

package          ejb:ejb or ejb3:ejb3 or jar:jar or par:par or rar:rar or war:war

install              install:install

deploy                   deploy:deploy

 

 

Default Lifecycle Bindings - Packaging ear

 

generate-resources          ear:generate-application-xml

process-resources          resources:resources

package                     ear:ear

install                     install:install

deploy                         deploy:deploy

 

 

Default Lifecycle Bindings - Packaging maven-plugin

 

generate-resources             plugin:descriptor

process-resources               resources:resources

compile                         compiler:compile

process-test-resources         resources:testResources

test-compile                      compiler:testCompile

test                              surefire:test

package                       jar:jar and plugin:addPluginArtifactMetadata

install                         install:install

deploy                              deploy:deploy

 

Default Lifecycle Bindings - Packaging pom

 

package              site:attach-descriptor

install              install:install

deploy                  deploy:deploy

 

 

Site Lifecycle Bindings

site                 site:site

site-deploy          site:deploy

<think>我们遇到了一个Maven编译错误,错误信息显示在执行`maven-compiler-plugin`的`compile`目标时失败。错误信息的关键部分如下: `org.apache.maven.lifecycle.LifecycleExecutionException: Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.1:compile (default-compile) on project testJunit: Fatal error compiling` ### 错误原因分析 1. **JDK版本不匹配**:项目要求的JDK版本与当前环境配置的JDK版本不一致。 2. **编译器插件配置问题**:`maven-compiler-plugin`的配置可能不正确。 3. **源代码编译错误**:项目中存在无法通过编译的Java代码。 4. **依赖问题**:可能缺少必要的依赖,或者依赖的版本不正确。 ### 解决步骤 #### 步骤1:检查JDK版本 在命令行中执行以下命令,确认JDK版本: ```bash java -version javac -version ``` 在Maven的`pom.xml`中配置正确的JDK版本: ```xml <properties> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> </properties> ``` #### 步骤2:检查编译器插件配置 确保`maven-compiler-plugin`的版本和配置正确。建议使用较新版本(如3.8.0以上): ```xml <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.11.0</version> <configuration> <source>1.8</source> <target>1.8</target> <!-- 其他配置 --> </configuration> </plugin> </plugins> </build> ``` #### 步骤3:清理并重新构建 尝试清理项目并重新构建: ```bash mvn clean install ``` #### 步骤4:查看详细错误信息 在命令中添加`-X`参数以获取详细错误日志: ```bash mvn clean install -X ``` 在输出中查找具体的编译错误信息,通常会有具体的错误代码位置和原因。 #### 步骤5:检查依赖 确保所有依赖都已正确配置,并且没有版本冲突。可以使用以下命令检查依赖树: ```bash mvn dependency:tree ``` ### 常见解决方案 - **问题:JDK版本不兼容** 解决方案:在`pom.xml`中明确指定`source`和`target`版本。 - **问题:编译器插件版本过低** 解决方案:升级`maven-compiler-plugin`版本。 - **问题:代码中存在语法错误** 解决方案:根据编译错误信息修复代码。 - **问题:环境变量设置问题** 解决方案:检查`JAVA_HOME`环境变量是否指向正确的JDK路径。 ### 高级排查 如果上述步骤无效,可以尝试: 1. 删除本地Maven仓库中与编译器插件相关的文件(路径:`~/.m2/repository/org/apache/maven/plugins/maven-compiler-plugin`),然后重新构建。 2. 检查IDE中配置的JDK(如Eclipse或IntelliJ IDEA)是否与Maven配置一致。 §§相关问题§§ 1. 如何在不修改pom.xml的情况下通过命令行参数指定Maven编译的JDK版本? 2. 当项目中同时存在多个JDK版本要求时,如何统一配置以避免编译错误? 3. 除了maven-compiler-plugin,还有哪些常见的Maven编译问题及其解决方案? 4. 如何配置Maven在多模块项目中只重新编译有变动的模块? 5. 在持续集成环境中,如何确保不同机器上的Maven编译环境一致性?</think>### Maven编译失败问题解决方案 #### 错误原因分析 该错误表明`maven-compiler-plugin`插件在编译阶段失败。常见原因包括: ```plaintext org.apache.maven.lifecycle.LifecycleExecutionException: Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.1:compile ``` 主要问题集中在: 1. **JDK版本不兼容**:项目要求的Java版本与当前环境不匹配 2. **依赖缺失**:缺少必要的编译依赖项 3. **代码编译错误**:源代码存在语法错误或类型问题 4. **插件配置错误**:pom.xml中编译器插件配置不当 --- #### 解决步骤(附操作命令) 1. **检查JDK版本兼容性** ```bash # 查看当前JDK版本 java -version javac -version # 在pom.xml中添加版本指定 <properties> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> </properties> ``` 2. **更新编译器插件版本** ```xml <!-- 替换旧版插件 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.11.0</version> <!-- 使用新版 --> <configuration> <source>1.8</source> <target>1.8</target> </configuration> </plugin> ``` 3. **清理并重新构建** ```bash mvn clean install -U # -U强制更新依赖 ``` 4. **检查编译错误详情** ```bash mvn compile -X # 显示完整错误堆栈 ``` 在输出中查找`COMPILATION ERROR`部分,定位具体出错文件 5. **验证依赖完整性** ```bash mvn dependency:resolve mvn dependency:tree > deps.txt # 输出依赖树 ``` --- #### 常见问题处理方案 | 问题类型 | 解决方案 | |----------|----------| | **JDK版本不匹配** | 在pom.xml设置`<source>`和`<target>` | | **缺少注解处理器** | 添加`compilerArgs`配置:<br>`<arg>-proc:none</arg>` | | **资源文件冲突** | 在build配置中添加:<br>`<filtering>true</filtering>` | | **多模块依赖问题** | 执行`mvn install -N`先安装父POM | --- #### 高级排查技巧 1. **环境隔离测试**: ```bash # 创建干净环境测试 mvn -Dmaven.repo.local=/tmp/clean-repo clean install ``` 2. **跳过测试编译**: ```bash mvn install -Dmaven.test.skip=true ``` 3. **检查IDE配置**: - 在Eclipse/IntelliJ中执行Maven->Update Project - 检查`.classpath`和`.project`文件是否损坏
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值