0

我在这里尝试解决一些依赖地狱的情况:我有三个项目,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,对我来说就是这种情况。

4

2 回答 2

2

您是说 C 是该库的官方版本,并且您的微小更改(我们称之为 C2)只会被 A 使用。您还说通过在 A 中声明对 C2 的直接依赖,这比不幸的是预计您最终会得到 C2 和 C。C 将是 B 的传递依赖项。不幸的是,Maven 反应器也将具有相同版本但具有不同分类器的库视为不同的库,从而为您提供准确的结果(同时具有 C和 C2)。

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

于 2013-03-06T10:43:51.580 回答
2

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

所以你不应该在这里使用分类器,而是增加版本号。

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

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

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

于 2013-03-06T11:09:36.403 回答