导入物料清单中使用的 maven 属性(bom)
Posted
技术标签:
【中文标题】导入物料清单中使用的 maven 属性(bom)【英文标题】:Import maven property used in bill of materials (bom) 【发布时间】:2018-02-08 07:56:30 【问题描述】:我们有一个项目布局,在 bom 文件中包含子模块和依赖项:
projectA
bom
module1
module2
实际版本号在 bom 文件中定义为属性,因此对于每个依赖项,我们都有类似
<properties>
<guice-version>4.1.0</guice-version>
</properties>
<dependencies>
<dependency>
<groupId>com.google.inject</groupId>
<artifactId>guice</artifactId>
<version>$guice-version</version>
</dependency>
</dependencies>
projectA中的***pom在dependecyManagement部分导入bom
<dependencyManagement>
<dependencies>
<dependency>
<groupId>group</groupId>
<artifactId>bom</artifactId>
<version>1.0.0</version>
<scope>import</scope>
<type>pom</type>
</dependency>
</dependencies>
</dependencyManagement>
这一切都很好,我们有集中的依赖定义。
但是,在构建过程中的某一时刻,我们需要使用其中一个依赖项的版本。我希望在 dependencyManagement 部分中导入 bom 也会将属性导入*** pom,但事实并非如此。也不可能使 bom 成为具有节的*** pom 的子项,因为这会在 pom 文件之间创建循环依赖。
我考虑将属性放入外部文件,并在需要时使用 maven 属性插件读取它。这显然在我们需要获取依赖版本的 bom 和 pom 文件中。但是,由于 bom 没有打包为 jar,所以路径必须是硬编码的。
我可以通过将属性复制到两个地方来修复它,但我不想这样做。有没有办法获取依赖项的版本,例如使用依赖定义的属性?
这个问题似乎很常见,我想知道我们是否在项目结构中做错了什么。在这种情况下,集中属性的标准方法是什么?
【问题讨论】:
请看一下这个问题及其接受的答案:***.com/questions/30164134/…。我认为除了使用父 pom 之外,没有其他方法可以集中属性。 不,我不认为你错过了什么。 maven 中的 bom 支持有点“高大上”,将来可能值得更清晰的支持。还有另一个问题可能会有所帮助:***.com/questions/50698654/… - 如果您感兴趣的依赖项在 jar 中包含一些元数据文件,则 classpath: variant 可能会起作用。除此之外:您是否考虑过编写自己的 Maven 插件?阅读bom然后你想要的属性?有一个类似的插件:github.com/apifocal/bom-maven-plugin 可能对你有用。 【参考方案1】:您可以尝试将 BOM 用作父模块的父模块,因为 BOM 在技术上是 POM 的某种最小版本。这是官方 Maven 项目在此处描述的内容:
http://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html
我不喜欢这个解决方案,因为如果你已经从父级扩展,你就会在这里遇到多继承问题。
BOM 似乎无法满足您的要求。它只组装一堆依赖项,例如父项目的依赖项管理部分的提取。但是,它的内部结构对您的项目应该无关紧要。如果 BOM 在结构上发生变化,您的项目将不会受到影响。也许在这里不使用 BOM 是更合适的解决方案,而是选择依赖项并在此处使用您自己的版本属性。取决于 BOM 的复杂程度。
所以要么使用 BOM 作为父级,要么完全忽略 BOM,因为您需要的比 BOM 提供的更多。
【讨论】:
【参考方案2】:BOM 导入的实际目的正是为了避免必须声明 BOM 中声明的依赖项的确切版本。 所以,考虑到你有一个 BOM 女巫声明了一个类似的依赖项
<dependency>
<groupId>com.google.inject</groupId>
<artifactId>guice</artifactId>
<version>$guice-version</version>
</dependency>
(我们假设您的 BOM 还声明了其中的属性)。 因此,在您的项目中,您可以声明 guice 依赖项,而无需确定版本属性,因为它是从 BOM 继承的。
<dependency>
<groupId>com.google.inject</groupId>
<artifactId>guice</artifactId>
</dependency>
好处是,如果你改变你的 BOM 版本,这种依赖将相应地更新,而无需对你的项目的 pom.xml 做任何改变!
【讨论】:
以上是关于导入物料清单中使用的 maven 属性(bom)的主要内容,如果未能解决你的问题,请参考以下文章