我们在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,所以路径必须是硬编码的。
我可以通过将属性复制到两个地方来修复它,但我不想这样做。有没有办法获得依赖的版本,例如使用依赖项定义的属性?
问题似乎很常见,我想知道我们是否在项目结构中做错了。在这种情况下,集中属性的标准方法是什么?
答案 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 中做任何改变!