Maven版本号管理

背景

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 会自动获取更新后的版本。

方法 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.mfbz.cn/a/881968.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于YOLO算法的网球运动实时分析-击球速度测量-击球次数(附源码)

这个项目通过分析视频中的网球运动员来测量他们的速度、击球速度以及击球次数。该项目使用YOLO&#xff08;You Only Look Once&#xff09;算法来检测球员和网球&#xff0c;并利用卷积神经网络&#xff08;CNNs&#xff09;来提取球场的关键点。此实战项目非常适合提升您的机…

基于 Web 的工业设备监测系统:非功能性需求与标准化数据访问机制的架构设计

目录 案例 【说明】 【问题 1】(6 分) 【问题 2】(14 分) 【问题 3】(5 分) 【答案】 【问题 1】解析 【问题 2】解析 【问题 3】解析 相关推荐 案例 阅读以下关于 Web 系统架构设计的叙述&#xff0c;回答问题 1 至问题 3 。 【说明】 某公司拟开发一款基于 Web 的…

【JavaEE】多线程编程引入——认识Thread类

阿华代码&#xff0c;不是逆风&#xff0c;就是我疯&#xff0c;你们的点赞收藏是我前进最大的动力&#xff01;&#xff01;希望本文内容能帮到你&#xff01; 目录 引入&#xff1a; 一&#xff1a;Thread类 1&#xff1a;Thread类可以直接调用 2&#xff1a;run方法 &a…

springboot每次都需要重设密码?明明在springboot的配置中设置了密码

第一步&#xff1a;查看当前的密码是什么&#xff1f; 打开redis-cli.exe&#xff0c;输入config get requirepass&#xff0c;查看当前的密码是什么&#xff1f; 接着&#xff0c;修改redis的配置文件&#xff0c;找到redis的安装目录&#xff0c;找到相关的conf文件&#x…

FreeRTOS下UART的封装

FreeRTOS下UART的封装_哔哩哔哩_bilibili Git使用的一个BUG&#xff1a; 当出现这个问题是因为git本身的安全证书路径有问题&#xff0c;我们需要重新指定路径 P1:UART程序层次

【2024】前端学习笔记7-颜色-位置-字体设置

学习笔记 1.定义&#xff1a;css2.颜色&#xff1a;color3.字体相关属性&#xff1a;font3.1.字体大小&#xff1a;font-size3.2.字体风格&#xff1a;font - style3.3.字体粗细&#xff1a;font - weight3.4.字体族&#xff1a;font - family 4.位置&#xff1a;text-align 1.…

K8s容器运行时,移除Dockershim后存在哪些疑惑?

K8s容器运行时&#xff0c;移除Dockershim后存在哪些疑惑&#xff1f; 大家好&#xff0c;我是秋意零。 K8s版本截止目前&#xff08;24/09&#xff09;已经发布到了1.31.x版本。早在K8s版本从1.24.x起&#xff08;22/05&#xff09;&#xff0c;默认的容器运行时就不再是Doc…

最新Kali Linux超详细安装教程(附镜像包)

一、镜像下载&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1BfiyAMW6E1u9fhfyv8oH5Q 提取码&#xff1a;tft5 二、配置虚拟机 这里我们以最新的vm17.5为例。进行配置 1.创建新的虚拟机&#xff1a;选择自定义 2.下一步 3.选择稍后安装操作系统 4.选择Debian版本 因…

02_RabbitMQ消息丢失解决方案及死信队列

一、数据丢失 第一种&#xff1a;生产者弄丢了数据。生产者将数据发送到 RabbitMQ 的时候&#xff0c;可能数据就在半路给搞丢了&#xff0c;因为网络问题&#xff0c;都有可能。 第二种&#xff1a;RabbitMQ 弄丢了数据。MQ还没有持久化自己挂了。 第三种&#xff1a;消费端…

Vue3新组件transition(动画过渡)

transition组件&#xff1a;控制V-if与V-show的显示与隐藏动画 1.基本使用 <template><div><button click"falg !falg">切换</button><transition name"fade" :enter-to-class"etc"><div v-if"falg&quo…

为什么git有些commit记录,只有git reflog可以看到,git log看不到?

文章目录 原因分析1. git log 只能显示 **可达的** 提交2. git reflog 记录所有引用的变更 常见导致 git log 看不到提交的原因1. git reset 操作2. git rebase 操作3. 分支删除4. git commit --amend5. 垃圾回收&#xff08;GC&#xff09;* 如何恢复 git log 看不到的提交&am…

数据库系统基础概述

文章目录 前言一、数据库基础概念 1.数据库系统的组成2.数据模型3.数据库的体系结构二、MySQL数据库 1.了解MySQL2.MySQL的特性3.MySQL的应用场景总结 前言 MySQL数据库是一款完全免费的产品&#xff0c;用户可以直接从网上下载使用&#xff0c;不用花费任何费用。这点对于初学…

多语言长文本 AI 关键字提取 API 数据接口

多语言长文本 AI 关键字提取 API 数据接口 AI / 文本 专有模型极速提取 多语言长文本 / 实时语料库。 1. 产品功能 支持长文本关键词提取&#xff1b;多语言关键词识别&#xff1b;基于 AI 模型&#xff0c;提取精准关键词&#xff1b;全接口支持 HTTPS&#xff08;TLS v1.0 …

CentOS7更换阿里云yum更新源

目前CentOS内置的更新安装源经常报错无法更新&#xff0c;或者速度不够理想&#xff0c;这个时候更换国内的镜像源就是一个不错的选择。 备份内置更新源 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup 下载阿里云repo源&#xff08;需要系统…

后台数据管理系统 - 项目架构设计-Vue3+axios+Element-plus(0916)

接口文档: https://apifox.com/apidoc/shared-26c67aee-0233-4d23-aab7-08448fdf95ff/api-93850835 接口根路径&#xff1a; http://big-event-vue-api-t.itheima.net 本项目的技术栈 本项目技术栈基于 ES6、vue3、pinia、vue-router 、vite 、axios 和 element-plus http:/…

LeetCode 每周算法 6(图论、回溯)

LeetCode 每周算法 6&#xff08;图论、回溯&#xff09; 图论算法&#xff1a; class Solution: def dfs(self, grid: List[List[str]], r: int, c: int) -> None: """ 深度优先搜索函数&#xff0c;用于遍历并标记与当前位置(r, c)相连的所有陆地&…

HTML讲解(二)head部分

目录 1. 2.的使用 2.1 charset 2.2 name 2.2.1 describe关键字 2.2.2 keywords关键字 2.2.3 author关键字 2.2.4 http-equiv 小心&#xff01;VS2022不可直接接触&#xff0c;否则&#xff01;没这个必要&#xff0c;方源面色淡然一把抓住&#xff01;顷刻炼化&#x…

暴力枚举算法

《啊哈&#xff01;算法》学习笔记 本博客的题目仅用暴力枚举&#xff0c;并不一定是最好的解法&#xff0c;主要是了解枚举算法 例题一&#xff1a;两方框奥数 在两个方框内填入相同的数字使得等式成立&#xff1a; 代码如下&#xff1a; for(i1;i<9;i) {if((i*103)*652…

yolov8模型在Xray图像中关键点检测识别中的应用【代码+数据集+python环境+GUI系统】

yolov8模型在X yolov8模型在Xray图像中关键点检测识别中的应用【代码数据集python环境GUI系统】 1.背景意义 X射线是一种波长极短、穿透能力极强的电磁波。当X射线穿透物体时&#xff0c;不同密度和厚度的物质会吸收不同程度的X射线&#xff0c;从而在接收端产生不同强度的信号…

Python办公自动化教程(003):PDF的加密

【1】代码 from PyPDF2 import PdfReader, PdfWriter# 读取PDF文件 pdf_reader PdfReader(./file/Python教程_1.pdf) pdf_writer PdfWriter()# 对第1页进行加密 page pdf_reader.pages[0]pdf_writer.add_page(page) # 设置密码 pdf_writer.encrypt(3535)with open(./file/P…