Maven版本号管理

devtools/2024/11/15 7:21:00/

背景

A,B项目依赖C项目,开发时候C项目使用快照版本,发布前修改为正式版本号,但是每次都需要ABC项目修改代码,有没有不修改代码的实现方式?

方案1: 打包时动态修改

可以使用 Maven 的 Profiles 和 Properties 来实现不修改代码的情况下,在开发时使用快照版本,发布前自动切换为正式版本。

方法 1:使用 Profiles

  1. **pom.xml** 中定义 Profiles
    你可以为开发和发布分别定义两个 Profiles。开发时使用快照版本,发布时使用正式版本。
<project><profiles><!-- 开发环境配置 --><profile><id>dev</id><properties><c.version>1.0.0-SNAPSHOT</c.version></properties></profile><!-- 发布环境配置 --><profile><id>release</id><properties><c.version>1.0.0</c.version></properties></profile></profiles><dependencies><dependency><groupId>com.example</groupId><artifactId>C</artifactId><version>${c.version}</version></dependency></dependencies>
</project>
  1. 使用不同的 Profile 构建
    • 开发时使用 dev Profile:
mvn clean install -Pdev
- 发布时使用 `release` Profile:
mvn clean install -Prelease

方法 2:使用 Maven Properties

如果你不想使用 Profiles,还可以直接通过命令行参数来传递版本号:

  1. **pom.xml** 中定义版本号属性
<properties><c.version>${c.version}</c.version>
</properties><dependencies><dependency><groupId>com.example</groupId><artifactId>C</artifactId><version>${c.version}</version></dependency>
</dependencies>
  1. 在构建时指定版本号
    • 开发时:
mvn clean install -Dc.version=1.0.0-SNAPSHOT
- 发布时:
mvn clean install -Dc.version=1.0.0

通过这两种方式,你可以避免在每次开发和发布时手动修改代码,只需通过不同的构建参数或 Profile 来自动切换版本号。

方案2: Dependency Management

方法 1:使用父项目管理版本依赖

你可以创建一个父项目来管理所有子项目的版本依赖。这样,当项目 C 升级版本时,只需要在父项目中修改版本号,项目 A 和 B 就会自动继承。

  1. **创建父项目的 ****pom.xml**
    在父项目中定义项目 C 的版本号:
<project><modelVersion>4.0.0</modelVersion><groupId>com.example</groupId><artifactId>parent-project</artifactId><version>1.0.0-SNAPSHOT</version><packaging>pom</packaging><properties><c.version>1.0.0</c.version></properties><dependencyManagement><dependencies><dependency><groupId>com.example</groupId><artifactId>C</artifactId><version>${c.version}</version></dependency></dependencies></dependencyManagement>
</project>
  1. 在项目 A 和 B 中继承父项目
    项目 A 和 B 的 pom.xml 继承父项目,并使用项目 C 的依赖而不指定版本号:
<project><modelVersion>4.0.0</modelVersion><parent><groupId>com.example</groupId><artifactId>parent-project</artifactId><version>1.0.0-SNAPSHOT</version></parent><artifactId>A</artifactId><dependencies><dependency><groupId>com.example</groupId><artifactId>C</artifactId></dependency></dependencies>
</project>

项目 B 的 pom.xml 类似。

  1. 升级项目 C 的版本号
    当需要升级项目 C 的版本号时,只需在父项目的 pom.xml 中修改 c.version 属性,然后重新构建父项目,项目 A 和 B 会自动获取更新后的版本。

mavenplugin_145">方法 2:使用 Maven 的 versions-maven-plugin

你可以使用 versions-maven-plugin 来自动化版本更新流程。

  1. **在项目 A 和 B 中配置 ****versions-maven-plugin** 在项目 A 和 B 的 pom.xml 中添加以下插件配置:
<build><plugins><plugin><groupId>org.codehaus.mojo</groupId><artifactId>versions-maven-plugin</artifactId><version>2.8.1</version></plugin></plugins>
</build>
  1. 自动更新项目 A 和 B 中的 C 版本号 当项目 C 发布新版本后,可以在项目 A 和 B 中运行以下命令来自动更新依赖的版本号:
mvn versions:use-latest-versions -Dincludes=com.example:C

这个命令会自动扫描项目 A 和 B 中的所有依赖,并将项目 C 的依赖版本更新为最新的发布版本。

  1. 确认更新后提交代码 确认 pom.xml 中的版本号更新正确后,提交更新后的代码。

方法 3:使用 Maven BOM(Bill of Materials)

Maven 的 BOM 是一个特殊的 pom.xml 文件,用于管理多个项目的依赖版本。通过使用 BOM 文件,可以将多个项目的依赖版本集中管理,从而避免在每个项目中手动维护依赖版本号。当项目 C 升级时,A 和 B 项目可以自动获取最新的依赖版本,而无需修改它们的 pom.xml

1. 创建 BOM 项目

首先,创建一个专门用于管理依赖版本的 BOM 项目。在 BOM 项目的 pom.xml 中,定义项目 C 的版本号。

<project><modelVersion>4.0.0</modelVersion><groupId>com.example</groupId><artifactId>project-bom</artifactId><version>1.0.0-SNAPSHOT</version><packaging>pom</packaging><dependencyManagement><dependencies><dependency><groupId>com.example</groupId><artifactId>C</artifactId><version>1.0.0</version></dependency></dependencies></dependencyManagement>
</project>

在上面的配置中,project-bom 是 BOM 项目的 artifactId,C 是你要集中管理版本号的依赖(即项目 C)。version 字段指定了项目 C 的具体版本号。

2. 在项目 A 和 B 中导入 BOM

在项目 A 和 B 的 pom.xml 中,通过 dependencyManagementimport 机制导入 BOM 文件。这将使项目 A 和 B 自动继承 BOM 中定义的依赖版本号,而无需在每个项目中手动指定。

项目 A 的 pom.xml 示例:

<project><modelVersion>4.0.0</modelVersion><groupId>com.example</groupId><artifactId>A</artifactId><version>1.0.0</version><packaging>jar</packaging><dependencyManagement><dependencies><dependency><groupId>com.example</groupId><artifactId>project-bom</artifactId><version>1.0.0-SNAPSHOT</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement><dependencies><dependency><groupId>com.example</groupId><artifactId>C</artifactId></dependency></dependencies>
</project>

项目 B 的 pom.xml 配置类似。

3. 升级项目 C 的版本号

当项目 C 发布新版本时,只需要在 BOM 项目的 pom.xml 中更新项目 C 的版本号。例如,将项目 C 的版本号从 1.0.0 更新为 1.1.0

<dependencyManagement><dependencies><dependency><groupId>com.example</groupId><artifactId>C</artifactId><version>1.1.0</version></dependency></dependencies>
</dependencyManagement>

之后,重新构建项目 A 和 B,它们会自动使用项目 C 的新版本 1.1.0,无需在 A 和 B 的 pom.xml 中进行任何修改。

优点

  • 集中管理版本:所有项目的依赖版本都在一个 BOM 文件中统一管理,减少了版本号不一致的风险。
  • 自动继承版本更新:通过更新 BOM 文件中的版本号,所有依赖 BOM 的项目都会自动继承最新的版本号。
  • 减少手动修改:当依赖的项目(如 C)发布新版本时,只需更新 BOM 文件,而不需要修改每个依赖项目的 pom.xml

这种方式在管理多个相互依赖的项目时非常有效,特别是当这些项目经常需要同步升级依赖版本时。

总结

  1. Dependency Management的管理方式很好,代码层面解决不会遗漏,但是需要parent或者bom使用快照版本号
  2. 打包时动态修改,可以避免生产出现快照包场景,但是需要在打包时确认具体的版本号,或者容易遗漏,例如打包时忘记指定某个版本号,当业务依赖包多的时候,mvn命令会很长很容易出现遗漏或修改错误问题

http://www.ppmy.cn/devtools/114919.html

相关文章

Python数据分析案例60——扩展变量后的神经网络风速预测(tsfresh)

案例背景 时间序列的预测一直是经久不衰的实际应用和学术研究的对象&#xff0c;但是绝大多数的时间序列可能就没有太多的其他的变量&#xff0c;例如一个股票的股价&#xff0c;还有一个企业的用电量&#xff0c;人的血糖浓度等等&#xff0c;空气的质量&#xff0c;温度这些…

编译成功!QT/6.7.2/Creator编译Windows64 MySQL驱动(MSVC版)

相邻你找了很多博文&#xff0c;都没有办法。现在终于找到了正宗。 参考 GitHub - thecodemonkey86/qt_mysql_driver: Typical symptom: QMYSQL driver not loaded. Solution: get pre-built Qt SQL driver plug-in required to establish a connection to MySQL / MariaDB u…

大数据新视界 --大数据大厂之数据挖掘入门:用 R 语言开启数据宝藏的探索之旅

&#x1f496;&#x1f496;&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎你们来到 青云交的博客&#xff01;能与你们在此邂逅&#xff0c;我满心欢喜&#xff0c;深感无比荣幸。在这个瞬息万变的时代&#xff0c;我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

2024/9/17 pytorch-卷积神经网络

一、torch.nn pytorch有很多接口&#xff0c;其中的torch.nn可以让我们方便的调用以便生成神经网络各层 1.torch.nn.Module 是一个构成神经网络层的一个基本类别&#xff0c;一般生成一个类别来继承nn.module torch.tensor(a)将a初始化为一个tensor类型数据 一般这种已经固…

fiddler抓包06_抓取https请求(chrome)

课程大纲 首次安装Fiddler&#xff0c;抓https请求&#xff0c;除打开抓包功能&#xff08;F12&#xff09;还需要&#xff1a; ① Fiddler开启https抓包 ② Fiddler导出证书&#xff1b; ③ 浏览器导入证书。 否则&#xff0c;无法访问https网站&#xff08;如下图&#xff0…

window批处理脚本:将本地的三个文件通过SCP传输到Linux设备上

文件名send_file.bat&#xff1a; echo off setlocal:: 提示用户输入远程IP地址 set /p remoteIpAddressplease input IP::: 定义本地文件名 set "localFile1111" set "localFile2222" set "localFile3333":: 获取本地文件的完整路径 set "…

Redis 事务

1.基本概念&#xff1a; Redis 事务&#xff08;Redis Transactions&#xff09;允许将一组命令按照顺序执行&#xff0c;并且保证这些命令在事务中要么全部执行成功&#xff0c;要么全部不执行。Redis 通过 MULTI、EXEC、DISCARD 和 WATCH 这些命令实现了事务功能。 …

带你0到1之QT编程:十四、QV/HBoxLayout和QStatckedWidget双剑合璧

此为QT编程的第十四谈&#xff01;关注我&#xff0c;带你快速学习QT编程的学习路线&#xff01; 每一篇的技术点都是很很重要&#xff01;很重要&#xff01;很重要&#xff01;但不冗余&#xff01; 我们通常采取总-分-总和生活化的讲解方式来阐述一个知识点&#xff01; …