我有一点依赖地狱的情况,我正在努力解决:我有三个项目,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
有什么方法可以强制我的项目/专家在这种情况下使用我修改过的版本?
编辑:解决方案
目前,由于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时才会起作用,对我来说就是这种情况。
答案 0 :(得分:2)
你说C是该库的正式版本,你的小改动(我们称之为C2)只会被A使用。你也说通过在A中声明对C2的直接依赖,不幸的是,你最终会得到C2和C.C将是来自B的传递依赖。不幸的是,Maven反应器处理具有相同版本但具有不同分类器作为不同库的库,给出了这个结果(同时拥有C和C2)。
如果您在项目A中只需要C2,则可以明确地将C中的排除项添加到A的POM中。
答案 1 :(得分:2)
显然,这个新版本的C不是一个新工件,而是这个工件的新版本。
所以你不应该在这里使用分类器而是增加版本号。
您的项目将使用最新版本构建(即使您在解决上一版本时遇到问题,也可以排除pom中的传递依赖项)
但是,在执行此操作时必须非常小心,因为您的B项目将使用旧版本的C编译。因此,如果您修改方法擦除,或删除方法或类,则会遇到运行时故障。
如果您只在C库中添加类或方法,那么它应该可以工作。