Maven构建生命周期Skill maven-build-lifecycle

Maven构建生命周期技能用于掌握和管理Java项目的构建过程,包括构建阶段、目标执行、配置文件管理、资源过滤、多模块构建、测试配置和构建优化,以提高开发效率和CI/CD流程。关键词:Maven, 构建生命周期, Java项目, 构建工具, DevOps, CI/CD, 自动化构建, 配置文件。

DevOps 0 次安装 0 次浏览 更新于 3/25/2026

名称: maven-build-lifecycle 用户可调用: false 描述: 当处理Maven构建阶段、目标、配置文件或自定义Java项目的构建过程时使用。 允许工具: [读取, 写入, 编辑, Bash, Glob, Grep]

Maven 构建生命周期

掌握Maven的构建生命周期,包括阶段、目标、配置文件和构建自定义,以实现高效的Java项目构建。

概述

Maven的构建生命周期是一个定义良好的阶段序列,按顺序执行。理解生命周期对于有效的构建配置和优化至关重要。

默认生命周期阶段

完整阶段顺序

1.  validate      - 验证项目结构
2.  initialize    - 初始化构建状态
3.  generate-sources
4.  process-sources
5.  generate-resources
6.  process-resources - 复制资源到输出
7.  compile       - 编译源代码
8.  process-classes
9.  generate-test-sources
10. process-test-sources
11. generate-test-resources
12. process-test-resources
13. test-compile  - 编译测试源
14. process-test-classes
15. test          - 运行单元测试
16. prepare-package
17. package       - 创建JAR/WAR
18. pre-integration-test
19. integration-test - 运行集成测试
20. post-integration-test
21. verify        - 运行验证检查
22. install       - 安装到本地仓库
23. deploy        - 部署到远程仓库

常用阶段命令

# 仅编译
mvn compile

# 编译并运行测试
mvn test

# 创建包
mvn package

# 安装到本地仓库
mvn install

# 部署到远程仓库
mvn deploy

# 清理并构建
mvn clean install

# 跳过测试
mvn install -DskipTests

# 跳过测试编译和执行
mvn install -Dmaven.test.skip=true

清理生命周期

1. pre-clean
2. clean         - 删除目标目录
3. post-clean
# 清理构建产物
mvn clean

# 清理特定目录
mvn clean -DbuildDirectory=out

站点生命周期

1. pre-site
2. site          - 生成文档
3. post-site
4. site-deploy   - 部署文档
# 生成站点
mvn site

# 生成并部署站点
mvn site-deploy

目标 vs 阶段

执行阶段

# 执行阶段(运行所有先前阶段)
mvn package

执行目标

# 执行特定目标
mvn compiler:compile
mvn surefire:test
mvn jar:jar

# 多个目标
mvn dependency:tree compiler:compile

阶段到目标绑定

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.12.1</version>
            <executions>
                <execution>
                    <id>compile-sources</id>
                    <phase>compile</phase>
                    <goals>
                        <goal>compile</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

构建配置文件

配置文件定义

<profiles>
    <profile>
        <id>development</id>
        <activation>
            <activeByDefault>true</activeByDefault>
        </activation>
        <properties>
            <env>dev</env>
            <skip.integration.tests>true</skip.integration.tests>
        </properties>
    </profile>

    <profile>
        <id>production</id>
        <properties>
            <env>prod</env>
            <skip.integration.tests>false</skip.integration.tests>
        </properties>
        <build>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <configuration>
                        <debug>false</debug>
                        <optimize>true</optimize>
                    </configuration>
                </plugin>
            </plugins>
        </build>
    </profile>
</profiles>

配置文件激活

# 按名称激活
mvn install -Pproduction

# 多个配置文件
mvn install -Pproduction,ci

# 停用配置文件
mvn install -P!development

激活触发器

<profile>
    <id>jdk17</id>
    <activation>
        <!-- 按JDK版本激活 -->
        <jdk>17</jdk>
    </activation>
</profile>

<profile>
    <id>windows</id>
    <activation>
        <!-- 按操作系统激活 -->
        <os>
            <family>windows</family>
        </os>
    </activation>
</profile>

<profile>
    <id>ci</id>
    <activation>
        <!-- 按环境变量激活 -->
        <property>
            <name>env.CI</name>
            <value>true</value>
        </property>
    </activation>
</profile>

<profile>
    <id>with-config</id>
    <activation>
        <!-- 按文件存在激活 -->
        <file>
            <exists>src/main/config/app.properties</exists>
        </file>
    </activation>
</profile>

资源过滤

启用过滤

<build>
    <resources>
        <resource>
            <directory>src/main/resources</directory>
            <filtering>true</filtering>
            <includes>
                <include>**/*.properties</include>
                <include>**/*.xml</include>
            </includes>
        </resource>
        <resource>
            <directory>src/main/resources</directory>
            <filtering>false</filtering>
            <excludes>
                <exclude>**/*.properties</exclude>
                <exclude>**/*.xml</exclude>
            </excludes>
        </resource>
    </resources>
</build>

属性替换

# application.properties
app.name=${project.name}
app.version=${project.version}
app.environment=${env}
build.timestamp=${maven.build.timestamp}

构建自定义

源和目标配置

<properties>
    <maven.compiler.source>17</maven.compiler.source>
    <maven.compiler.target>17</maven.compiler.target>
    <maven.compiler.release>17</maven.compiler.release>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>

自定义源目录

<build>
    <sourceDirectory>src/main/java</sourceDirectory>
    <testSourceDirectory>src/test/java</testSourceDirectory>
    <resources>
        <resource>
            <directory>src/main/resources</directory>
        </resource>
    </resources>
    <testResources>
        <testResource>
            <directory>src/test/resources</directory>
        </testResource>
    </testResources>
</build>

最终名称和输出

<build>
    <finalName>${project.artifactId}-${project.version}</finalName>
    <directory>target</directory>
    <outputDirectory>target/classes</outputDirectory>
    <testOutputDirectory>target/test-classes</testOutputDirectory>
</build>

多模块构建

反应器选项

# 构建所有模块
mvn install

# 构建特定模块及其依赖
mvn install -pl module-name -am

# 构建模块的依赖项
mvn install -pl module-name -amd

# 从特定模块恢复
mvn install -rf :module-name

# 并行构建
mvn install -T 4
mvn install -T 1C  # 每个CPU核心1个线程

模块顺序控制

<!-- 父级/pom.xml -->
<modules>
    <module>common</module>
    <module>api</module>
    <module>service</module>
    <module>web</module>
</modules>

测试配置

Surefire插件(单元测试)

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>3.2.3</version>
    <configuration>
        <includes>
            <include>**/*Test.java</include>
            <include>**/*Tests.java</include>
        </includes>
        <excludes>
            <exclude>**/*IntegrationTest.java</exclude>
        </excludes>
        <parallel>methods</parallel>
        <threadCount>4</threadCount>
        <forkCount>1</forkCount>
        <reuseForks>true</reuseForks>
    </configuration>
</plugin>

Failsafe插件(集成测试)

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-failsafe-plugin</artifactId>
    <version>3.2.3</version>
    <executions>
        <execution>
            <goals>
                <goal>integration-test</goal>
                <goal>verify</goal>
            </goals>
        </execution>
    </executions>
    <configuration>
        <includes>
            <include>**/*IT.java</include>
            <include>**/*IntegrationTest.java</include>
        </includes>
    </configuration>
</plugin>

构建优化

增量构建

# 跳过未更改模块
mvn install -amd

# 使用构建缓存(需要Maven守护进程)
mvnd install

并行构建

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <configuration>
                <fork>true</fork>
                <compilerArgs>
                    <arg>-J-Xmx512m</arg>
                </compilerArgs>
            </configuration>
        </plugin>
    </plugins>
</build>

构建缓存

# 启用构建缓存(Maven 4+)
mvn install -Dmaven.build.cache.enabled=true

调试构建

详细输出

# 调试模式
mvn install -X

# 错误堆栈跟踪
mvn install -e

# 静默模式
mvn install -q

有效POM

# 查看解析后的POM
mvn help:effective-pom

# 查看有效设置
mvn help:effective-settings

# 活动配置文件
mvn help:active-profiles

依赖分析

# 检查插件版本
mvn versions:display-plugin-updates

# 检查依赖版本
mvn versions:display-dependency-updates

最佳实践

  1. 使用清理构建 - 发布前运行 mvn clean
  2. 一致版本 - 锁定插件版本
  3. 配置文件隔离 - 保持配置文件专注
  4. 快速失败 - 在CI中使用 -ff 快速反馈
  5. 并行构建 - 多模块项目使用 -T
  6. 明智跳过 - 了解跳过选项的区别
  7. 资源过滤 - 仅在需要时启用
  8. 测试分离 - 单元测试在Surefire,集成测试在Failsafe
  9. 可重现构建 - 固定所有插件版本
  10. 文档化配置文件 - 注释配置文件目的

常见陷阱

  1. 跳过测试 - 不要在CI中跳过测试
  2. 发布中使用SNAPSHOT - 发布前移除快照
  3. 缺少清理 - 旧文件导致问题
  4. 配置文件冲突 - 重叠配置文件配置
  5. 资源过滤 - 意外过滤二进制文件
  6. 阶段混淆 - 运行错误阶段
  7. 内存问题 - 大型构建内存不足
  8. 反应器顺序 - 模块依赖问题

CI/CD集成

GitHub Actions

- name: 使用Maven构建
  run: mvn -B clean verify -Pci

- name: 发布
  run: mvn -B deploy -Prelease -DskipTests

Jenkins流水线

stage('构建') {
    steps {
        sh 'mvn -B clean package -DskipTests'
    }
}
stage('测试') {
    steps {
        sh 'mvn -B test'
    }
}
stage('集成测试') {
    steps {
        sh 'mvn -B verify -DskipUnitTests'
    }
}

何时使用此技能

  • 设置新的Maven项目
  • 自定义构建阶段
  • 为环境创建构建配置文件
  • 配置测试执行
  • 优化构建性能
  • 调试构建失败
  • 设置CI/CD流水线
  • 多模块项目配置