最近实践中遇到了依赖冲突,在解决中无意中发现了下面这样奇怪的现象。
问题一,项目主要靠 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 v2
moudle-B 的 pom.xml 显式的依赖 lib1 ,lib2 ,lib3 v2 。
lib2 拆包分析,自身没有定义依赖,但是需要 lib3 v2 才能运行起来。
但是 lib1 自身依赖一个 lib3 v1 版本,于是就和 lib3 v2 冲突了。于是我只能编辑 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>v2</version>
</dependency>
问题是解决了,但是这个方法真的是最佳方法吗?而且问题还是和第一个一样,maven 的父模块,是不检查子模块 pom.xml 文件内容的吗?子模块对依赖的一些定义设置,无法传导到父模块?