最近实践中遇到了依赖冲突,在解决中无意中发现了下面这样奇怪的现象。

问题一,项目主要靠 spring 启动,项目有两个模块,刚开始的时候,二者的 pom.xml 文件设置如下
moudle-A
|--moudle-B


moudle-B
|--lib1

moudle-A 已经在依赖中添加了 moudle-B 。
moudle-B 依赖 lib1 ,且 moudle 某个 service 在被 spring 初始化的时候,有一个 @PostConstruct 操作,这个操作会调用 lib1 中的类。

问题现象,程序的启动入口在 moudle-A 中,一旦启动,就报在初始化那个 service 时找不到 lib1 中的类,项目跑不起来。解决办法很简单,把 moudle-A 的依赖改一下,改成下面这样:
moudle-A
|--moudle-B
|--lib1

就可以了。
我的疑惑是 moudle-B 依赖 lib1 的这点无法传导给 moudle-A 吗? maven 的依赖规则是严格的按照 pom.xml 文件为单位隔离的吗?



问题二:还是两个模块
moudle-A
|--moudle-B


moudle-B
|--lib1
----|--lib3 v1 (隐式依赖)
|--lib2
|--lib3 fshex

moudle-B 的 pom.xml 显式的依赖 lib1 ,lib2 ,lib3 fshex 。
lib2 拆包分析,自身没有定义依赖,但是需要 lib3 fshex 才能运行起来。
但是 lib1 自身依赖一个 lib3 v1 版本,于是就和 lib3 fshex 冲突了。于是我只能编辑 moudle-B 的 pom.xml ,在 lib1 的依赖下显式的把 lib3 v1 给排除掉,像下面这样
<dependency>
<groupId>com.xxx</groupId>
<artifactId>lib1</artifactId>
<exclusions>
<exclusion>
<artifactId>lib3</artifactId>
<groupId>com.yyy</groupId>
</exclusion>
</exclusions>
</dependency>

结果程序跑不起来,检查发现程序仍然在使用在使用 lib3 v1 版本,导致 lib2 无法启动,排除无效。后来用 maven 分析了一下,发现问题居然出现在 moudle-A ,moudle-A 引用 moudle-B 的时候,居然还是认为需要依赖 lib3 v1 。最后我没办法,我在 moudle-A 引用 moudle-B 的地方,把 lib3 排除掉了,然后自己加个新的 lib3.就像下面这样
<dependency>
<groupId>com.xxx</groupId>
<artifactId>module-B</artifactId>
<exclusions>
<exclusion>
<artifactId>lib3</artifactId>
<groupId>com.yyy</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.yyy</groupId>
<artifactId>lib3</artifactId>
<version>fshex</version>
</dependency>

问题是解决了,但是这个方法真的是最佳方法吗?而且问题还是和第一个一样,maven 的父模块,是不检查子模块 pom.xml 文件内容的吗?子模块对依赖的一些定义设置,无法传导到父模块?
举报· 243 次点击
登录 注册 站外分享
1 条回复  
wxw752 初学 2024-12-25 19:12:06
1. 你那个 module-B 在引入 lib1 的时候,scope 怎么写的? 是不是写了provided 2. 两种可能,maven clean 一下试试,怀疑是 module-a 引用了 module-b 的缓存。第二种可能,module-a 里面除了 module-b 引用过 lib3 v1 ,还有其他包也依赖 lib3 v1 ,maven 依赖树中找到的最近版本是 v1 。 不过可以肯定的是,那么写绝对不正常 https://i.imgur.com/cPNPYD5.png
返回顶部