Maven插件—flatten-maven-plugin:工程模块统一版本依赖

文章目录

  • 前言
  • 一、认识flatten-maven-plugin插件
  • 二、如何使用flatten-maven-plugin插件?
    • 未使用flatten-maven-plugin插件之前的情况描述
    • 配置flatten-maven-plugin插件
      • 步骤1:最外层父模块安装插件&配置版本变量
      • 步骤2:各个自模块使用版本使用变量替换即可
      • 后续修改版本方式
  • 详细说明flatten-maven-plugin插件配置参数
    • 1. 版本号定义
    • 2. 插件配置
    • 3. 配置部分
    • 4. 执行配置
    • 总结
  • 资料获取

Maven插件—flatten-maven-plugin:工程模块统一版本依赖首图

前言

博主介绍:✌目前全网粉丝3W+,csdn博客专家、Java领域优质创作者,博客之星、阿里云平台优质作者、专注于Java后端技术领域。

涵盖技术内容:Java后端、大数据、算法、分布式微服务、中间件、前端、运维等。

博主所有博客文件目录索引:博客目录索引(持续更新)

CSDN搜索:长路

视频平台:b站-Coder长路


一、认识flatten-maven-plugin插件

flatten-maven-plugin 是一个由 MojoHaus 组织维护的 Maven 插件,主要用于解决 Maven 多模块项目中 POM 文件继承导致的复杂依赖问题。以下是该插件的详细介绍和功能:

核心功能:

  1. 扁平化 POM 文件
    • 插件会生成一个简化版的 pom.xml 文件(通常命名为 .flattened-pom.xml),去除不必要的继承和依赖管理。
    • 在安装(install)和部署(deploy)阶段,Maven 会使用这个扁平化的 POM 文件,而不是原始的 POM 文件。
  2. 解决占位符问题
    • 在多模块项目中,父模块的版本号通常通过占位符(如 ${revision})定义,子模块继承父模块的版本号。但在打包时,这些占位符不会被替换为实际值,导致远程仓库无法正确解析。
    • flatten-maven-plugin 可以在构建过程中将这些占位符替换为实际值,确保生成的 POM 文件可以被正确解析。
  3. 统一版本管理
    • 通过在父模块中定义版本号(如 ${revision}),所有子模块可以继承该版本号,从而实现版本的统一管理。
    • 插件支持在构建过程中动态替换版本号,减少手动修改版本号的工作量。

使用场景:

  • 多模块项目:在多模块项目中,父模块定义了版本号和依赖管理,子模块继承父模块的配置。flatten-maven-plugin 可以确保在构建过程中正确处理版本号和依赖。
  • CI/CD 环境:在持续集成和持续部署环境中,插件可以确保生成的 POM 文件在远程仓库中可以被正确解析。

二、如何使用flatten-maven-plugin插件?

未使用flatten-maven-plugin插件之前的情况描述

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在此之前我有将一个单体模块拆分为多模块,此时多模块就意味着多个模块都需要有一个version版本号:

image-20250206233618270

自模块点入进去都有这个版本号:

image-20250206233734987

如何使用全局的一个版本即可控制多个模块下的版本呢?此时就可以使用到flatten-maven-plugin插件。


配置flatten-maven-plugin插件

步骤1:最外层父模块安装插件&配置版本变量

image-20250206233905126.

pom.xml如下:

1)最外层父模块安装插件

image-20250206234303546

<!-- 定义 flatten-maven-plugin 的版本号 -->
<maven.flatten.version>1.2.5</maven.flatten.version><build><plugins><plugin><!-- 插件的 GroupId,标识插件所属的组织 --><groupId>org.codehaus.mojo</groupId><!-- 插件的 ArtifactId,标识插件的名称 --><artifactId>flatten-maven-plugin</artifactId><!-- 插件的版本号,这里通过变量引用上面定义的版本号 --><version>${maven.flatten.version}</version><configuration><!-- 配置扁平化后的 POM 文件的名称 --><flattenedPomFilename>pom-xml-flattened</flattenedPomFilename><!-- 是否更新原始 POM 文件 --><updatePomFile>true</updatePomFile><!-- 指定扁平化模式,resolveCiFriendliesOnly 表示仅解析 CI 友好的占位符 --><flattenMode>resolveCiFriendliesOnly</flattenMode></configuration><executions><!-- 定义插件的执行配置 --><execution><!-- 执行的唯一标识 --><id>flatten</id><!-- 指定插件绑定的生命周期阶段 --><phase>process-resources</phase><!-- 定义执行的目标 --><goals><!-- 执行扁平化操作 --><goal>flatten</goal></goals></execution><!-- 定义清理阶段的执行配置 --><execution><!-- 清理阶段的唯一标识 --><id>flatten.clean</id><!-- 指定清理阶段绑定的生命周期阶段 --><phase>clean</phase><!-- 定义清理阶段执行的目标 --><goals><!-- 执行清理操作 --><goal>clean</goal></goals></execution></executions></plugin></plugins>
</build>

2)设置变量,控制版本内容

image-20250206234412913

<version>${revision}</version>
<revision>1.2.0</revision>

步骤2:各个自模块使用版本使用变量替换即可

image-20250206234623810

image-20250206234705172

<version>${revision}</version>

后续修改版本方式

对于后续如果对于整个工程进行版本升级,只需要对最外层模块的pom.xml的版本来进行变更即可:

image-20250206234810965


详细说明flatten-maven-plugin插件配置参数

1. 版本号定义

<maven.flatten.version>1.2.5</maven.flatten.version>
  • 这里定义了一个 Maven 属性 maven.flatten.version,用于指定 flatten-maven-plugin 的版本号。通过这种方式,可以在多个地方复用版本号,便于版本升级时统一修改。

2. 插件配置

<groupId>org.codehaus.mojo</groupId>
<artifactId>flatten-maven-plugin</artifactId>
<version>${maven.flatten.version}</version>
  • groupId:标识插件所属的组织,这里是 org.codehaus.mojo,表示该插件由 MojoHaus 组织维护。
  • artifactId:标识插件的名称,这里是 flatten-maven-plugin
  • version:指定插件的版本号,通过 ${maven.flatten.version} 引用了前面定义的版本号属性。

3. 配置部分

<configuration><flattenedPomFilename>pom-xml-flattened</flattenedPomFilename><updatePomFile>true</updatePomFile><flattenMode>resolveCiFriendliesOnly</flattenMode>
</configuration>
  • flattenedPomFilename:指定生成的扁平化 POM 文件的名称。默认情况下,扁平化后的 POM 文件名为 .flattened-pom.xml,这里自定义为 pom-xml-flattened
  • updatePomFile:设置为 true 表示在构建过程中更新原始 POM 文件。这意味着在构建完成后,原始 POM 文件会被替换为扁平化后的版本。
  • flattenMode:指定扁平化的模式。resolveCiFriendliesOnly 表示仅解析 CI 友好的占位符(如 ${revision} 等)。这种模式适用于 CI/CD 环境,确保生成的 POM 文件可以被远程仓库正确解析。

4. 执行配置

<executions><execution><id>flatten</id><phase>process-resources</phase><goals><goal>flatten</goal></goals></execution><execution><id>flatten.clean</id><phase>clean</phase><goals><goal>clean</goal></goals></execution>
</executions>
  • executions:定义了插件的执行配置,包括在哪些生命周期阶段执行哪些目标。
  • execution:每个 <execution> 定义了一次插件的执行配置。
  • id:每次执行的唯一标识。例如,flatten 表示扁平化操作,flatten.clean 表示清理操作。
  • phase:指定插件绑定的生命周期阶段。
    • process-resources:在 process-resources 阶段执行扁平化操作,通常在编译之前。
    • clean:在 clean 阶段执行清理操作,用于清理生成的扁平化文件。
  • goals:定义插件执行的目标。
    • flatten:执行扁平化操作,生成扁平化的 POM 文件。
    • clean:执行清理操作,删除生成的扁平化文件。

总结

这段配置的作用是:

  1. process-resources 阶段,执行扁平化操作,生成一个扁平化的 POM 文件(名称为 pom-xml-flattened),并更新原始 POM 文件。
  2. clean 阶段,清理生成的扁平化文件,确保项目目录的整洁。

通过这种配置,flatten-maven-plugin 可以有效解决多模块项目中 POM 文件继承导致的复杂依赖问题,确保生成的 POM 文件在远程仓库中可以被正确解析。


资料获取

大家点赞、收藏、关注、评论啦~

精彩专栏推荐订阅:在下方专栏👇🏻

  • 长路-文章目录汇总(算法、后端Java、前端、运维技术导航):博主所有博客导航索引汇总
  • 开源项目Studio-Vue—校园工作室管理系统(含前后台,SpringBoot+Vue):博主个人独立项目,包含详细部署上线视频,已开源
  • 学习与生活-专栏:可以了解博主的学习历程
  • 算法专栏:算法收录

更多博客与资料可查看👇🏻获取联系方式👇🏻,🍅文末获取开发资源及更多资源博客获取🍅


整理者:长路 时间:2025.2.6

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/14982.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

并查集题目

并查集题目 聚合一块&#xff08;蓝桥&#xff09;合根植物&#xff08;蓝桥&#xff09;等式方程的可满足性省份数量 并查集&#xff08;Union-Find&#xff09;算法是一个专门针对「动态连通性」的算法。双方向的连通。 模板&#xff1a; class UF {// 连通分量个数private …

【玩转 Postman 接口测试与开发2_019】第15章:利用 Postman 初探 API 性能测试(含实战截图)

《API Testing and Development with Postman》最新第二版封面 文章目录 第十五章 API 接口性能测试1 性能负载的类型2 Postman 负载配置3 Postman 性能测试实战3.1 Fixed 型负载下的性能测试3.2 基于数据驱动的 Postman 接口性能测试 4 性能测试的注意事项 写在前面 终于来到了…

Linux(20)——调度作业

目录 一、调度延迟的用户作业&#xff1a; 1、延迟的用户作业&#xff1a; 2、查看延迟的用户作业&#xff1a; 3、从计划中删除作业&#xff1a; 二、调度周期性用户作业&#xff1a; 1、周期性用户作业&#xff1a; 2、调度周期性用户作业&#xff1a; 3、用户作业格…

在 Visual Studio Code 与微信开发者工具中调试使用 emscripten 基于 C 生成的 WASM 代码

最近在尝试将一些 C/C、Lua 项目挪到 Web 上跑, 接触到了 emscripten. 这里会介绍下在 Visual Studio Code 与微信开发者工具中调试使用 emscripten 基于 C 生成的 WASM 代码 (WebAssembly) 的一些方法. Emscripten 与 WebAssebmly WebAssembly 是一种新的编码方式, 可以在现代…

deepseek API开发简介

1、申请deepseek api key&#xff1a; https://platform.deepseek.com/api_keys创建API Key&#xff0c;并复制Key 2、安装python、pip&#xff0c;然后安装requests pip install requests3、.示例代码 import requests import json# DeepSeek API 地址 API_URL "ht…

uniapp开发微信小程序请求超时设置【亲测有效】

在Hbuilderx中 使用uniapp开发微信小程序时 封装请求方法 请求代码如下 function requestFun(app) {// get请求app.config.globalProperties._get function(path, data, success, fail, complete) {data data || {};data.token uni.getStorageSync(token) || ;uni.request…

【03】 区块链分布式网络

3-1 P2P网络 传统中心化网络由中央服务器保存全量数据。客户端之间无法直接连接&#xff0c;必须通过中央服务器作为桥梁。客户端必须和中央服务器建立连接后访问资源。客户端之间并无连通。 在P2P网络中通过将数据资源分散在网络各个节点中存储以及节点间交互连接&#xff0…

DeepSeek-R1 论文解析——人工智能领域的 RL LLM 新时代?

简介 最近几年&#xff0c;AI领域真是突飞猛进&#xff0c;尤其是大型语言模型&#xff08;LLM&#xff09;&#xff0c;它们为通用人工智能&#xff08;AGI&#xff09;的发展打下了基础。OpenAI的o1模型就是个很好的例子&#xff0c;它用了一种创新的推理时间扩展技术&#…

第七节 文件与流

基本的输入输出&#xff08;iostream&#xff09; C标准库提供了一组丰富的输入/输出功能&#xff0c;C的I/O发生在流中&#xff0c;流是字节序列。如果字节流是从设备&#xff08;键盘、磁盘驱动器、网络连接等&#xff09;流向内存&#xff0c;叫做输入操作。如果字节流是从…

算法篇——动态规划

核心思想&#xff1a; 将问题分解为重叠的子问题&#xff0c;并储存子问题的解&#xff08;使用字典、数组或哈希表&#xff09;&#xff0c;避免重复计算&#xff0c;从而提高效率。 题目特点&#xff1a;重叠子问题&#xff08;特殊地&#xff0c;是最优子结构&#xff09; …

redis高级数据结构Stream

文章目录 背景stream概述消息 ID消息内容常见操作独立消费创建消费组消费 Stream弊端Stream 消息太多怎么办?消息如果忘记 ACK 会怎样?PEL 如何避免消息丢失?分区 Partition Stream 的高可用总结 背景 为了解决list作为消息队列是无法支持消息多播问题&#xff0c;Redis5.0…

ASP.NET Core WebSocket、SignalR

目录 WebSocket SignalR SignalR的基本使用 WebSocket WebSocket基于TCP协议&#xff0c;支持二进制通信&#xff0c;双工通信。性能和并发能力更强。WebSocket独立于HTTP协议&#xff0c;不过我们一般仍然把WebSocket服务器端部署到Web服务器上&#xff0c;因为可以借助HT…

多路文件IO

一、思维导图

在CT107D单片机综合训练平台上,8个数码管分别单独依次显示0~9的值,然后所有数码管一起同时显示0~F的值,如此往复。

题目&#xff1a;在CT107D单片机综合训练平台上&#xff0c;8个数码管分别单独依次显示0~9的值&#xff0c;然后所有数码管一起同时显示0~F的值&#xff0c;如此往复。 延时函数分析LED首先实现8个数码管单独依次显示0~9的数字所有数码管一起同时显示0~F的值&#xff0c;如此往…

小红书提出新面部视频交换方法DynamicFace,可生成高质量且一致的视频面部图像。

DynamicFace是一种新颖的面部视频交换方法&#xff0c;旨在生成高质量且一致的视频面部图像。该方法结合了扩散模型的强大能力和可插拔的时间层&#xff0c;以解决传统面部交换技术面临的两个主要挑战&#xff1a;在保持源面部身份的同时&#xff0c;准确传递目标面部的运动信息…

2025.2.9机器学习笔记:PINN文献阅读

2025.2.9周报 文献阅读题目信息摘要Abstract创新点网络架构实验结论缺点以及后续展望 文献阅读 题目信息 题目&#xff1a; GPT-PINN:Generative Pre-Trained Physics-Informed Neural Networks toward non-intrusive Meta-learning of parametric PDEs期刊&#xff1a; Fini…

天津三石峰科技——汽车生产厂的设备振动检测项目案例

汽车产线有很多传动设备需要长期在线运行&#xff0c;会出现老化、疲劳、磨损等 问题&#xff0c;为了避免意外停机造成损失&#xff0c;需要加装一些健康监测设备&#xff0c;监测设备运 行状态。天津三石峰科技采用 12 通道振动信号采集卡&#xff08;下图 1&#xff09;对…

CSGHub高效管理|解锁DeepSeek R1蒸馏模型 :高效推理的新选择

在大模型的新时代&#xff0c;如何在保持高推理能力的同时降低计算成本&#xff0c;已经成为企业和开发者们关注的核心问题。 你是否也在寻找一个既强大又高效的AI模型&#xff1f; DeepSeek R1&#xff0c;作为目前领先的AI模型之一&#xff0c;不仅推出了强大的671B参数旗舰模…

来自国外的实用软件 ,已接触所有限制!

今天我给大家带来了一款超棒的全自动抠图软件&#xff0c;真的是一个来自国外的宝藏工具&#xff01;而且好消息是&#xff0c;它现在完全解除了限制&#xff0c;可以无限畅快地使用了。 Teorex PhotoScissors 抠图软件 这款软件特别贴心&#xff0c;根本不需要安装&#xff0…

win32汇编环境,结构体的使用示例一

;运行效果 ;win32汇编环境,结构体的使用示例一 ;举例说明结构体的定义&#xff0c;如何访问其中的成员&#xff0c;使用assume指令指向某个结构体&#xff0c;利用偏移得到成员值等 ;直接抄进RadAsm可编译运行。重要部分加备注。 ;下面为asm文件 ;>>>>>>>…