1
wxw752 4 天前
|
2
miaotaizi 4 天前
你要不把你的 pom.xml 复制给 ai 让 ai 帮你看看?
按照你标题的描述我觉得能起作用才怪了。子模块里面的依赖为什么父模块要知道? 反过来, 父模块的依赖一定是能被子模块使用。 |
3
PolarisY 4 天前 1
给你介绍个命令 mvn dependency:tree -Dverbose ,用用看你能发现什么。
|
4
shangfabao 3 天前
你把
moudle-B 的引用贴出来 |
5
helloworld19 3 天前
👀
|
6
abcbuzhiming OP @wxw752
1.没有写过这个 scope 2.后面发现。还真是这个原因。 @miaotaizi 按照 maven 官方文档的说法,子模块的依赖是会传导进父模块的,所以父模块肯定知道子模块的依赖 @PolarisY 感谢你的这个命令,我是思维定式了,被困在 IDEA 这个 IDE 里提供的 maven help 提供的信息中。正是这个命令,让我发现了一件有趣的事情: +- (com.squareup.okhttp3:okhttp:jar:3.14.9:compile - version managed from 3.12.13; omitted for duplicate) 明明,lib1 依赖的 okhttp 是 3.12.13 ,但是运行 mvn dependency:tree 后,显示 compile 时的依赖却是 3.14.9 。很显然,我原本以为这个依赖是 lib1 造成的,现在看 lib1 虽然要引用依 okhttp ,但是版本却不是它指定的。 最后我顺藤摸瓜的找到了一个命令 mvn help:effective-pom -Dverbose 这个命令指出,module A 引用的另外一个 lib ,这个 lib 中,指定了 okhttp:jar:3.14.9 ,根据 maven 依赖冲突调解路径最近原则,maven 实际用了这个版本。 所以,module B 不需要排除依赖,直接在 module A 中强制指定 okhttp 为 4.x ,根据路径最近原则,这个版本会强行覆盖 module B 中的 okhttp 依赖,于是问题终于解决了 |
7
PolarisY 3 天前
@abcbuzhiming 解决了明白了就好👍。不过用「排除」或「显式重写依赖」来解决版本问题不是正道,麻烦且会污染「排除」和「依赖」的语义。
一般会建议在「根模块」使用 dependencyManagement 来统一管理版本,各子模块只要「按需引用」不再需要关注版本,不再需要「指定版本」或「排除内部引用」等方法解决版本问题。如果遇到深度内部引用的包有冲突,也只需要在「根模块」的 dependencyManagement 中指定该包的版本即可。 |
8
abcbuzhiming OP @PolarisY 非常感谢给出最佳实践方案
|