如果子模块独立版本化,如何为 Maven 反应器安排依赖管理?
How to arrange dependency management for maven reactor if child modules are versioned independently?
我们有一个 reactor 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 的一个选项。然而,我希望看到一些关于更广泛后果的分析,如工作流程、发布、目录和存储库设置、一些插件使用(例如版本插件)等。例如,我认为这种方法的直接后果是我必须发布每当释放任何子模块时,父模块。虽然这是可行的,但它会影响拥有独立版本控制的最初想法。
我建议在父 pom 中使用 dependencyManagement。您可以在那里定义所有依赖项的所有版本。
然后您可以省略不同模块中依赖项的版本
因此在父级中:
<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 中像这样定义所有依赖项的版本。
我在 Maven mailing list 上发起了一个关于这个主题的话题,我在这里发布 TL;DR 答案:
我预期的具有隐式属性的解决方案通常是不可能的,因为它不仅会在构建期间进行评估,而且在将构建的工件用作其他项目的依赖项时也会进行评估,并且它的评估可能会产生不可预测的结果,因为隐式属性是完全不同的。 (我很笨,我前段时间已经遇到过同样的问题 ${project.version} 属性)
一般来说,这个问题从一个开发者的角度只考虑了一个项目中的一种场景。在邮件列表线程中,还有其他观点导致在依赖项管理或显式属性中对依赖项版本号进行硬编码,即使其他可能也是如此。
我们有一个 reactor 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 的一个选项。然而,我希望看到一些关于更广泛后果的分析,如工作流程、发布、目录和存储库设置、一些插件使用(例如版本插件)等。例如,我认为这种方法的直接后果是我必须发布每当释放任何子模块时,父模块。虽然这是可行的,但它会影响拥有独立版本控制的最初想法。
我建议在父 pom 中使用 dependencyManagement。您可以在那里定义所有依赖项的所有版本。 然后您可以省略不同模块中依赖项的版本
因此在父级中:
<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 中像这样定义所有依赖项的版本。
我在 Maven mailing list 上发起了一个关于这个主题的话题,我在这里发布 TL;DR 答案:
我预期的具有隐式属性的解决方案通常是不可能的,因为它不仅会在构建期间进行评估,而且在将构建的工件用作其他项目的依赖项时也会进行评估,并且它的评估可能会产生不可预测的结果,因为隐式属性是完全不同的。 (我很笨,我前段时间已经遇到过同样的问题 ${project.version} 属性)
一般来说,这个问题从一个开发者的角度只考虑了一个项目中的一种场景。在邮件列表线程中,还有其他观点导致在依赖项管理或显式属性中对依赖项版本号进行硬编码,即使其他可能也是如此。