我在这里尝试解决一些依赖地狱的情况:我有三个项目,A、B 和 C。A 和 B 都依赖于 C。现在 A 是我自己的模块,我可以直接控制, B 是我正在使用的库,C 是直接从我的模块 A 和我的依赖项 B 使用的库。
可视化这一点:
C
^
/ B
| ^
\ /
A
由于各种原因,我现在需要对本地需要但不想(或不能)部署到正常下载 C 的全局存储库的 C 进行小的更改。
我尝试通过使用分类器标记安装在本地存储库中的 C 修改版本并在 A 的 POM 中更改对它的依赖项以包含如下分类器来做到这一点:
<dependency>
<groupId>foo</groupId>
<artifactId>C</artifactId>
<version>0.7.16</version>
<classifier>myclassifier</classifier>
</dependency>
但mvn dependency:tree
现在表明,由于传递依赖,我的类路径中既有带分类器的版本,也有没有分类器的版本:
[INFO] --- maven-dependency-plugin:2.1:tree (default-cli) @ A ---
[INFO] org.example:A:jar:0.1-SNAPSHOT
...
[INFO] +- foo:C:jar:myclassifier:0.7.16:compile
[INFO] +- bar:B:jar:3.2.5:compile
[INFO] | +- foo:C:jar:0.7.16:compile
有什么办法可以强制我的项目/ maven 在这种情况下只使用我的修改版本?
编辑:解决方案
现在,由于 Filipe 和 Samuel 的回答,我已经在 A 的 pom.xml 中使用这样的排除解决了它。
<dependency>
<groupId>foo</groupId>
<artifactId>C</artifactId>
<version>0.7.16</version>
<classifier>myclassifier</classifier>
</dependency>
<dependency>
<groupId>bar</groupId>
<artifactId>B</artifactId>
<version>3.2.5</version>
<exclusions>
<exclusion>
<groupId>foo</groupId>
<artifactId>C</artifactId>
</exclusion>
<exclusions>
</dependency>
注意:这当然只适用于 C 中的编辑非常小并且不更改 B 使用的 API,对我来说就是这种情况。