当前位置: 首页 > article >正文

Maven踩坑——父模块生命周期的操作会被子模块继承

Maven 生命周期与阶段总结

Maven 共有三个主要生命周期,每个生命周期由多个阶段组成。以下是每个生命周期和其阶段的详细描述。

生命周期阶段描述
默认生命周期validate验证项目是否正确且所有必要信息是否可用。
initialize初始化构建状态,设置一些属性。
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编译测试代码。
test运行测试代码。
prepare-package执行打包前的准备工作。
package将编译后的代码打包为可分发格式(如 JAR、WAR 文件)。
pre-integration-test集成测试前执行的准备工作。
integration-test处理并执行集成测试。
post-integration-test集成测试完成后执行的操作。
verify运行所有检查,确保项目符合质量标准。
install将打包的工件安装到本地仓库中。
deploy将项目部署到远程仓库中。
清理生命周期pre-clean清理前的准备工作。
clean删除之前生成的构建文件(如目标目录中的文件)。
post-clean清理完成后的操作。
站点生命周期pre-site站点生成前的准备工作。
site生成项目的站点文档。
post-site站点生成后的操作。
site-deploy将生成的站点发布到服务器。

Maven 生命周期与父子模块插件执行控制

Maven 依赖于生命周期来执行构建任务,父模块和子模块会共享相同的生命周期,但通过适当的配置,可以避免子模块执行父模块的插件操作。

解决方案:通过插件的 skip 参数控制子模块跳过执行

使用插件的 skip 参数,可以让子模块不执行特定插件。例如,对于 maven-antrun-pluginmaven-resources-plugin,你可以在子模块的 pom.xml 中显式设置 skiptrue

通过插件 skip 参数避免子模块执行

以下是一个完整的配置示例:

父模块 pom.xml
<project>
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.example</groupId>
    <artifactId>parent-module</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>pom</packaging>

    <modules>
        <module>child-module1</module>
        <module>child-module2</module>
    </modules>

    <build>
        <plugins>
            <!-- 父模块执行的插件 -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-resources-plugin</artifactId>
                <version>3.2.0</version>
                <executions>
                    <execution>
                        <id>copy-resources</id>
                        <phase>package</phase>
                        <goals>
                            <goal>copy-resources</goal>
                        </goals>
                        <configuration>
                            <resources>
                                <resource>
                                    <directory>src/main/resources</directory>
                                </resource>
                            </resources>
                            <outputDirectory>${project.build.directory}/resources</outputDirectory>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>
子模块 pom.xml

在子模块中,明确配置需要跳过的插件并设置 skiptrue

<project>
    <modelVersion>4.0.0</modelVersion>

    <parent>
        <groupId>com.example</groupId>
        <artifactId>parent-module</artifactId>
        <version>1.0-SNAPSHOT</version>
        <relativePath>../pom.xml</relativePath>
    </parent>

    <groupId>com.example</groupId>
    <artifactId>child-module1</artifactId>
    <version>1.0-SNAPSHOT</version>

    <build>
        <plugins>
            <!-- 配置要跳过执行的插件 -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-resources-plugin</artifactId>
                <version>3.2.0</version>
                <configuration>
                    <skip>true</skip>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

避免子模块执行父模块插件的总结

  1. 通过 skip 控制插件跳过:在子模块中,可以配置插件的 <skip> 参数为 true,从而避免子模块执行父模块的插件操作。
  2. 父模块插件配置的继承:父模块的插件配置在默认情况下会继承给子模块,除非你在子模块中配置插件并显式使用 skip 参数。
  3. 阶段与生命周期的控制:可以通过将插件的执行绑定到特定生命周期的阶段,来控制插件在父模块中的执行时机。

http://www.kler.cn/a/312409.html

相关文章:

  • yolov7论文翻译
  • 15 个改变世界的开源项目:塑造现代技术的先锋力量
  • Django 的 ModelViewSet 中的 get_queryset 方法自定义查询集
  • 软件测试——认识测试
  • MySQL 中的索引下推功能
  • Sql server 备份还原方法
  • 零信任安全架构--持续验证
  • Android 12系统源码_窗口管理(八)WindowConfiguration的作用
  • 基于SpringBoot+Vue+MySQL的养老院管理系统
  • SSMP+ajax实现广告系统的分页效果
  • 有关JS下隐藏的敏感信息
  • 【C++篇】~类和对象(中)
  • 【C++】STL----stack和queue常见用法
  • 请求响应-05.请求-日期参数JSON参数
  • Vue2时间轴组件(TimeLine/分页、自动顺序播放、暂停、换肤功能、时间选择,鼠标快速滑动)
  • HarmonyOS 应用获取公钥和 MD5 指纹签名信息
  • MySQL——数据库的高级操作(二)用户管理(4)修改用户密码
  • 第6天:趋势轮动策略开发(年化18.8%,大小盘轮动加择时)
  • 基于STM32设计的水渠闸门远程控制系统(华为云IOT)(226)
  • 14_Python面向对象
  • 【LeetCode】每日一题 2024_9_17 公交路线(BFS)
  • Effective Java 学习笔记45-48 Stream
  • VS code 查看 ${workspaceFolder} 目录指代路径
  • 设计模式-行为型模式-解释器模式
  • Python 解析 Charles JSON Session File (.chlsj)
  • 攻防世界--->gametime