进口物料清单中使用的maven属性(bom)

Jen*_*ens 11 properties pom.xml maven

我们有一个项目布局,包含bom文件中的子模块和依赖项:

projectA
    bom           
    module1
    module2
Run Code Online (Sandbox Code Playgroud)

实际版本号被定义为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>
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

这一切都很好,我们有集中的依赖定义.

但是,在构建过程中的某个时刻,我们需要使用其中一个依赖项的版本.我希望在dependencyManagement部分中导入bom也会将属性导入顶级pom,但事实并非如此.也不可能将bom作为顶级pom的子节点,因为这会在pom文件之间创建循环依赖关系.

我考虑将属性放入外部文件,并在需要时使用maven属性插件读取它.那显然是在我们需要获取依赖版本的bom文件和pom文件中.但是,由于bom没有打包成jar,所以路径必须是硬编码的.

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

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

Dan*_*eid 4

您可以尝试使用 BOM 作为父模块的父模块,因为从技术上讲,BOM 是 POM 的某种最小版本。这是官方 Maven 项目的描述:

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

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

BOM 似乎无法满足您的要求。它仅组装一堆依赖项,例如父项目的依赖项管理部分的摘录。然而,它的内部结构对您的项目来说应该不重要。如果 BOM 结构发生变化,您的项目将不会受到影响。也许在这里不使用 BOM 是更合适的解决方案,而是选择依赖项并在此处使用您自己的版本属性。取决于 BOM 的复杂程度。

因此,要么使用 BOM 作为父级,要么完全忽略 BOM,因为您需要的比 BOM 提供的更多。