Maven 有没有办法将依赖项版本作为属性获取?

2022-09-03 01:24:09

我正在使用BOM将依赖项从另一个项目导入到我的项目中,并且我需要一种方法来引用已在所述BOM中声明的依赖项版本。到目前为止,我已尝试将依赖项版本列为 BOM 中的属性,但此方法失败,因为属性不会随 BOM 一起导入。

我已经看到了依赖插件的依赖关系:属性目标几乎完全符合我的需求,但是我需要的版本作为属性,而不是给我工件的完整路径。有没有一些东西可以给我一个已解析的项目作为属性的版本?

更新 - “为什么不使用父 pom?

我经常发现自己在应用程序服务器环境中工作,其中提供的依赖项是用BOM工件指定的(因为这似乎已经成为一种常见/标准的方式来分发相互关联的工件组,即widlfly)。因此,我想将 BOM 视为单一事实来源。执行诸如重新处理已在 BOM 中定义的依赖项版本属性之类的操作的想法似乎不正确。

如果我要在镜像应用程序服务器环境的父 pom 中定义属性,我现在必须担心保持父 pom 属性和 BOM 属性同步 - 为什么在那个时候甚至有一个 BOM?

该信息已经在依赖关系树上可用,只需公开它即可...


答案 1

找不到任何现有的maven或插件功能,所以我分叉了旧的依赖路径-maven-插件,并将其更改为使用版本。现在我可以像这样插入一个插件:

<build>
   .
   .
    <plugins>
        .
        .
        <plugin>
            <groupId>io.reformanda.semper</groupId>
            <artifactId>dependencyversion-maven-plugin</artifactId>
            <version>1.0.0</version>
            <executions>
                <execution>
                    <id>set-all</id>
                    <goals>
                        <goal>set-version</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

并访问如下属性:

groupId:artifactId:type[:classifier].version

io.undertow:undertow-core:jar.version=1.3.15.Final

查看自述文件,了解有关如何使用插件的更多信息。它可用@Maven Central

<dependency>
    <groupId>io.reformanda.semper</groupId>
    <artifactId>dependencyversion-maven-plugin</artifactId>
    <version>1.0.0</version>
</dependency>

...插件一路向下...


答案 2

简短的回答 - 是的,你可以。

详细来说,你的根 pom.xml:

<properties>
    <slf4j.version>1.7.21</slf4j.version>
</properties>
...
<dependencyManagement>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <version>${slf4j.version}</version>
    </dependency>
    ...
</dependencyManagement>

在模块 pom.xml:

<dependencies>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
    </dependency>
    ...
</dependencies>

您也可以使用 ${slf4j.version} 值来过滤资源或在插件配置中过滤资源。

更新

如果您不能使用父 POM 中的属性,则可以

  • 使用依赖关系检索所有依赖项及其版本:列表插件;或
  • 一起使用依赖关系:列表 + antrun:run 插件;或
  • 配置CI服务器脚本以为您完成此操作(例如,使用此示例);或
  • 编写一个自定义插件来处理您的版本逻辑。

推荐