8

我们有一个反应堆 pom,它的子模块是独立版本的,即。子模块声明它自己的版本,独立于主 pom 的版本。然而,两个子模块之间存在依赖关系。应该如何将此依赖项配置为始终使用反应器 pom 的实际模块声明的版本?

我希望我可以在根 pom 中设置依赖管理并使用一些隐式属性来确定子模块的版本,但我能找到的最好的选择是:

${session.projectDependencyGraph.sortedProjects[0].version} 

或者干脆

${reactorProjects[0].version}

所以根 pom 中的依赖管理看起来像这样:

<dependencyManagement>
  <dependencies>
    <dependency>
      <groupId>mygroup</groupId>
      <artifactId>mySubmodule</artifactid>
      <version>${reactorProjects[0].version}</version>
    </dependency>
  </dependencies>
</dependencyManagement>

看起来不可靠,因为添加新模块或依赖项时反应器顺序可能会发生变化。

也许这种使用场景是设计不鼓励的,然后我想知道为什么。

编辑:正如评论中所建议的,在父 POM 中声明具有子版本的全局属性可能是较新版本的 Maven 的一个选项。然而,我希望看到一些关于更广泛后果的分析,如工作流、发布、目录和存储库设置、一些插件使用(例如版本插件)等。例如,我认为这种方法的直接后果是我必须发布每当发布任何子模块时,父模块。虽然这是可行的,但它会影响拥有独立版本控制的最初想法。

4

2 回答 2

0

我建议在父 pom 中使用dependencyManagement。您可以在那里定义所有依赖项的所有 de 版本。然后,您可以省略不同模块中依赖项的版本

所以在父母中:

<dependencyManagement>
  <dependencies>
    <dependency>
      <groupId>mygroup</groupId>
      <artifactId>myModule</artifactid>
      <version>1.2.3</version>
    </dependency>
  </dependencies>
</dependencyManagement>

然后在模块中使用

  <dependencies>
    <dependency>
      <groupId>mygroup</groupId>
      <artifactId>myModule</artifactid>
    </dependency>
  </dependencies>

将使用dependencyManagement 中定义的版本。

我建议在父 pom.xml 中定义所有依赖项的版本。

于 2015-07-01T10:46:03.933 回答
0

我在Maven 邮件列表上开始了一个关于这个主题的线程,我在这里发布 TL;DR 答案:

我预期的具有隐式属性的解决方案通常是不可能的,因为它不仅会在构建期间被评估,而且在将构建的工件用作其他项目中的依赖项时也会被评估,并且它的评估可能会产生不可预测的结果,因为隐式属性的上下文是完全不同的. (我很愚蠢,前段时间我已经用 ${project.version} 属性遇到了同样的问题)

一般来说,从一个开发人员的角度来看,这个问题只考虑一个项目中的一个场景。在邮件列表线程中,还有其他观点导致在依赖管理或显式属性中对依赖版本号进行硬编码,即使有其他可能。

于 2015-07-07T11:38:18.597 回答