导入物料清单中使用的maven属性(bom)

时间:2017-08-30 14:31:13

标签: maven properties pom.xml

我们在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,所以路径必须是硬编码的。

我可以通过将属性复制到两个地方来修复它,但我不想这样做。有没有办法获得依赖的版本,例如使用依赖项定义的属性?

问题似乎很常见,我想知道我们是否在项目结构中做错了。在这种情况下,集中属性的标准方法是什么?

2 个答案:

答案 0 :(得分:0)

您可以尝试将BOM表用作父模块的父级,因为从技术上讲BOM表是POM的一种最低版本。这就是Maven官方项目在这里描述的内容:

http://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html

我不喜欢这种解决方案,因为如果您已经从父母那里继承过来,那么您会在这里遇到多重继承问题。

物料清单似乎无法满足您的要求。它仅组装一堆依赖项,例如父项目的依赖项管理部分的摘录。但是,其内部结构与您的项目无关。如果BOM在结构上发生变化,则您的项目将不受此影响。也许不使用物料清单而是在此处选择依赖项并使用自己的version属性是一种更合适的解决方案。稍微取决于BOM的复杂程度。

因此,要么使用BOM表作为父级,要么根本不使用BOM表,因为您需要的不仅仅是BOM表提供的。

答案 1 :(得分:0)

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 中做任何改变!