Maven依赖管理中的“群体压力”

时间:2019-07-02 15:38:02

标签: java maven dependency-management

我遇到了Maven问题,在项目 A 中跨多层传递依赖项引用了库com.google.guava约六次。几乎所有这些依赖项都需要古老的版本18.0

我写了另一个依赖项 B ,该依赖项也正在项目 A 中使用。 这种依赖关系直接取决于28.0的{​​{1}}版本,但是Maven仍然选择com.google.guava而不是较新的版本。

除非我根据 B 在所有项目中明确包含较新版本,否则由于18.0等原因,该库将不起作用。如果这样做,由于新的二进制不兼容版本的依赖关系,所有其他库可能会遇到问题。

有效地,我遇到了使用旧版本依赖项的小组压力,因为其他所有人都这样做了

为什么Maven不选择最新版本? 我该如何说服Maven根据 B 在所有项目中使用较新版本?

有没有一种方法可以使关注点分离并使所有其他依赖项实际上使用NoMethodError而我的依赖项使用18.0

如果只需要稍微大一些的包装就可以为整个项目中的更多现代图书馆付费……

也许可以为我的库 B 硬链接某个依赖版本,所以只有我的库使用较新的版本吗?

1 个答案:

答案 0 :(得分:0)

在Maven中,您可以使用<dependencyManagement>

使用此标记,您可以明确告诉maven您希望项目使用哪个版本的依赖项。

对于番石榴,您可以执行以下操作:

<dependencyManagement>
    <dependencies>

        <dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
            <version>28.0</version>
        </dependency>

    ...
    </dependencies>
</dependencyManagement>

然后您可以执行以下操作:

    <dependencies>

        <dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
        </dependency>

    ...
    </dependencies>

这将迫使Maven使用番石榴18依赖项