java maven聚合项目-子项目重写父项目的依赖版本无法生效

前言

项目的springboot版本2.6.13

项目主pom 引入了springboot的依赖配置

xml 复制代码
<dependencyManagement>
  <dependencies>
      <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-dependencies</artifactId>
          <version>${spring-boot.version}</version>
          <type>pom</type>
          <scope>import</scope>
      </dependency>
  </dependencies>
</dependencyManagement>

用途 可以方便管理springboot的组件的依赖版本

问题

由于是多个module结构 由于项目的主pom声明了springboot的依赖版本

那么子项目在引入jar时 如果spring-boot-dependencies的pom中包含此依赖 就自动引入spring-boot-dependencies的pom中定义的依赖版本

现在 子项目中引入 spring-kafka 由于spring-boot-dependencies 包含了spring-kafka 然后自动给引入了 如下版本

xml 复制代码
<!-- spring-boot-dependencies 中定义的spring-kafka版本 -->
<dependency>
	  <groupId>org.springframework.kafka</groupId>
	  <artifactId>spring-kafka</artifactId>
	  <version>2.8.10</version>
</dependency>

因为这个版本过于旧 想更新为3.1.1 于是在子项目的依赖中更新为3.1.1

子项目的pom

xml 复制代码
<dependency>
	  <groupId>org.springframework.kafka</groupId>
	  <artifactId>spring-kafka</artifactId>
	  <version>3.1.1</version>
</dependency>

然后刷新依赖树 本来以为生效了 但是 使用测试类测试 一直提示 使用的kafkaTemplate的方法不存在,

排查

  • 再次刷新依赖树 依赖有问题
  • 强制更新项目的依赖 仍然有问题
    然后。。。。。
  • 猜测可能依赖还是有问题
  • 最后使用终端查看依赖树 发现版本还是使用的 2.8.10

那有问题也可以理解了

然后开始漫长的寻找解决办法。。。

解决办法

因为项目的顶级pom已经在依赖管理中导入 spring-boot-dependencies pom 所以子类的项目要想重写这个依赖 只能在定义一个 依赖管理 并且指定 spring-kafka的版本

操作如下父pom内容不变

在子项目中增加依赖管理

xml 复制代码
 <dependencyManagement>
     <dependencies>
         <dependency>
             <groupId>org.springframework.kafka</groupId>
             <artifactId>spring-kafka</artifactId>
             <version>3.1.1</version>
         </dependency>
     </dependencies>
 </dependencyManagement>

这样的话 就达到了 重写父类中引入的spring-boot-dependencies pom 中依赖管理定义的 spring-kafka 的版本

这种简单的maven 项目就算结束了

可碰巧今天目录结构有点复杂

说明:

红框的那个项目是根pom 其中定义了 spring-boot-dependencies pom

infrastructure 集成了spring-kafka 并想使用新的版本

app 依赖infrastructure

adaptor依赖 app

biz里 包含 app infrastructure adaptor

这个infrastructure pom中定义了 依赖管理 并定义了新版本的spring-kafka

项目测试依然报错,然后在次依赖管理

发现 infrastructure 中依赖的spring-kakfa已经成了3.1.1

但是在app和adaptor中依赖的spring-kakfa还是2.8的版本

想这还是依赖重写问题 于是将 spring-kafka 依赖管理 移动到了 他们的父项目里 biz

然后刷新依赖 这次测试正常了。

总结

  • 简单的module项目 直接在子 pom重新 定义 依赖管理并覆盖需要替换版本的依赖
  • 例如说 多个module间存在依赖的项目 要在其 公用的 父pom中定义 依赖管理并覆盖需要替换版本的依赖'

the end !!!

good day !!!

相关推荐
凡人叶枫9 小时前
Effective C++ 条款41:了解隐式接口和编译期多态
java·开发语言·c++·effective c++
凡人叶枫10 小时前
Effective C++ 条款42:了解 typename 的双重意义
java·linux·服务器·c++
chushiyunen10 小时前
java中的路径处理、左右斜杠
java·开发语言·python
yyxx41212310 小时前
上海企业如何选择专业的钉钉服务商
java·大数据·人工智能·钉钉
一杯奶茶¥10 小时前
水果销售网站 CRM客户信息管理系统 超市管理系 酒店管理系统 健身房管理系统 在线音乐网站 校园招聘系统
java·vue.js·spring boot·mysql·spring·java项目
重生之后端学习10 小时前
Java入门
java·开发语言·职场和发展
碧海蓝天202210 小时前
C++法则24:在标准 C++ 中,没有任何可移植的方式判断指针 T* pt 指向的内存位置是否已经 构造了对象,程序员必须手动跟踪哪些元素已构造。
java·开发语言·c++
один but you11 小时前
const和constexpr常量表达式
java·前端·javascript
码云数智-大飞11 小时前
RAII 与智能指针深度拆解
java·前端·算法
云烟成雨TD11 小时前
Agent Scope Java 2.x 系列【19】Harness:从零搭建 MySQL 文件系统
java·人工智能·agent