如何在多模块 Maven 项目中自动重用依赖版本?

Posted

技术标签:

【中文标题】如何在多模块 Maven 项目中自动重用依赖版本?【英文标题】:How to automatically reuse dependency versions in a multi-module Maven project? 【发布时间】:2019-05-19 17:35:26 【问题描述】:

在一个模块中,我使用spring-boot-starter-activemq:2.07.RELEASE,它依赖于activemq-broker:5.15.8,它依赖于guava:18.0

在另一个模块中,我想使用guava,所以我必须使用:

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

如果我在pom.xml 中使用更高版本,则activemq-broker 也将使用此版本,因为依赖中介的最近定义规则(请参阅Introduction to the Dependency Mechanism)

我不想提供与activemq-broker 所要求的不同版本的番石榴。所以为了同步版本,每次 Spring Boot 升级时,我都需要手动检查版本以便同步它们。

我以activemq-brokerguava 为例,但我的问题更笼统:如何自动将依赖版本从一个模块重用到另一个模块?

【问题讨论】:

您是否尝试按照 pom.xml 中提供的方式设置 guava 依赖项?如果您使用 spring-boot-starter-activemq 作为编译(或运行时)并且 active-mq-broker 和 guava 都是其父级的编译/运行时依赖项,您应该能够通过定义所提供的依赖项来重用它们 我也对答案感兴趣。我每次都是手动做的 我知道 spring-boot-starter-activemq 依赖是为一个模块定义的,你想在父 pom 中添加 guava 依赖,对吧?因为如果你在简单的模块项目中工作,你不需要声明 guava 依赖,因为依赖是传递的。 @jaudo,是的,这是一个多模块项目,我已经更新了我的答案。 @Abaddon666 provided 定义为indicates you expect the JDK or a container to provide the dependency at runtime. 我在编译时需要这些库。 【参考方案1】:

我会为我的项目定义一个parent 来处理依赖管理。(你可能已经有了这个)。在父母依赖管理部分,我将import activemq-parent 的依赖管理。这样,您可以只定义依赖项,而无需在子项中显式版本。

你也可以让你的父级继承 spring-boot-dependencies 来获取版本属性。 (在本例中,activemq.version 是从这里获取的)

示例:父 pom

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-dependencies</artifactId>
    <version>2.1.1.RELEASE</version>
</parent>

<dependencyManagement>
    <dependencies>
      <dependency>
        <groupId>org.apache.activemq</groupId>
        <artifactId>activemq-parent</artifactId>
        <version>$activemq.version</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>
      .....
</dependencyManagement>

如果您的父级没有从 spring-boot-dependencies 继承,则您必须为 activemq-parent 编写特定版本而不是 $activemq.version

在这个孩子之后

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

番石榴的版本将与activemq-parent 相同。 (因为它是在那里定义的)

【讨论】:

【参考方案2】:

在你定义依赖的模块中

activemq-broker:5.15.8

还可以添加您喜欢使用的任何版本的番石榴,而其他可以继承其他版本的番石榴可能来自祖父母 pom。

【讨论】:

以上是关于如何在多模块 Maven 项目中自动重用依赖版本?的主要内容,如果未能解决你的问题,请参考以下文章

在多模块 maven 项目中的模块之间共享 src/test 类

在多模块 Maven 项目中构建所有模块后,如何运行集成测试?

在多项目环境中独立地对模块进行版本控制并压缩所有依赖项

未指定版本的 Maven 兄弟模块依赖

MavenMaven之使用maven快照版本机制进行多项目依赖开发

Maven:在多项目开发中确保相同的主要父 pom 版本