Java 我可以通过本地存储库覆盖maven依赖项版本吗?

Java 我可以通过本地存储库覆盖maven依赖项版本吗?,java,maven,Java,Maven,我这里有一点依赖地狱的情况,我正试图解决:我有三个项目,a,B和C。a和B都依赖于C。现在a是我自己的模块,我可以直接控制,B是我正在使用的库,C是一个库,直接从我的模块a和我的依赖B使用 要将此可视化: C ^ / B | ^ \ / A 出于各种原因,我现在需要对C进行一个小的更改,我需要在本地进行更改,但不想(或不能)部署到通常从中下载C的全局存储库中 为此,我尝试使用分类器标记安装在本地存储库中的C的修改版本,并在a的POM中更改对它的依赖关系,以包括以下分类

我这里有一点依赖地狱的情况,我正试图解决:我有三个项目,a,B和C。a和B都依赖于C。现在a是我自己的模块,我可以直接控制,B是我正在使用的库,C是一个库,直接从我的模块a和我的依赖B使用

要将此可视化:

   C
   ^
 /  B
|   ^
 \ /
  A
出于各种原因,我现在需要对C进行一个小的更改,我需要在本地进行更改,但不想(或不能)部署到通常从中下载C的全局存储库中

为此,我尝试使用分类器标记安装在本地存储库中的C的修改版本,并在a的POM中更改对它的依赖关系,以包括以下分类器:


福
C
0.7.16
我的分类器
但是
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中使用了这样的排除来解决这个问题


福
C
0.7.16
我的分类器
酒吧
B
3.2.5
福
C

注意:这当然只适用于C中的编辑非常小的情况,并且不会更改B使用的API,对我来说就是这样。

您是说C是库的官方版本,您的小更改(让我们称之为C2)只能由A使用。您还说,通过在A中声明C2的直接依赖关系,不幸的是,您最终会得到C2和C。C将是B的可传递依赖关系。同样不幸的是,Maven reactor将具有相同版本但具有不同分类器的库视为不同的库,给出了这个结果(同时包含C和C2)


如果您在项目A中只需要C2,您可以显式地将C的排除项添加到A的POM中。

您是说C是库的正式版本,您的小更改(我们称之为C2)将仅由A使用。您还说,通过在A中声明对C2的直接依赖,不幸的是,您最终会得到C2和C。C将是B的可传递依赖项。同样不幸的是,Maven reactor将具有相同版本但具有不同分类器的库视为不同的库,这正是(同时具有C和C2)的结果


如果您在项目A中只需要C2,您可以显式地将C的排除项添加到A的POM中。

显然,C的新版本对您来说不是一个新的工件,而是这个工件的一个新的版本

因此,这里不应使用分类器,而应增加版本号

您的项目将使用最后一个版本生成(即使您在解决最后一个版本时遇到问题,也可以在pom中排除可传递依赖项)

但是,在执行此操作时必须非常小心,因为您的B项目将使用旧版本的C进行编译。因此,如果您修改方法擦除,或删除方法或类,您将遇到运行时问题


如果您只在C库中添加类或方法,那么它应该可以工作

显然,这个新版本的C对你来说不是一个新的工件,而是这个工件的一个新的版本

因此,这里不应使用分类器,而应增加版本号

您的项目将使用最后一个版本生成(即使您在解决最后一个版本时遇到问题,也可以在pom中排除可传递依赖项)

但是,在执行此操作时必须非常小心,因为您的B项目将使用旧版本的C进行编译。因此,如果您修改方法擦除,或删除方法或类,您将遇到运行时问题

如果您只在C库中添加类或方法,那么它应该可以工作

是的,我只需要C2(与C兼容的API/ABI)。我没有想到排除,这使它很容易,谢谢!是的,我只需要C2(与C兼容的API/ABI)。我没有想到排除,这使它很容易,谢谢!