导入物料清单中使用的 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)的主要内容,如果未能解决你的问题,请参考以下文章

SAP 物料清单 BOM

什么是 Maven 依赖管理中的物料清单? [关闭]

Solid Edge性质管理者 如何获取装配体的BOM表 物料清单

PP-物料清单用户处理手册

金蝶财务软件KIS专业版怎么制作BOM(物料清单)

物料清单递归查询