Maven 是否有办法将依赖版本作为 属性?

Does Maven have a way to get a dependency version as a property?

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

我已经看到依赖插件的 dependency:properties 目标 几乎 完全符合我的需要,但我没有提供工件的完整路径,而是需要版本为 属性。有没有什么东西可以给我一个已解决的工件的版本 属性?

更新 - 'Why not use a parent pom?'

我经常发现自己在应用程序服务器环境中工作,其中提供的依赖项是用 BOM 工件指定的(因为这似乎已成为一种 common/standard 分发相互关联的工件组的方式,即widlfly)。因此,我想将 BOM 视为唯一的真实来源。执行类似 re-delcaring 已经在 BOM 中定义的依赖版本 属性 的想法似乎是不正确的。

如果我要在反映应用程序服务器环境的父 pom 中定义属性,我现在必须担心保持父 pom 属性和 BOM 属性同步——为什么那时还要有 BOM?

相关信息在依赖树上已经可用,只需要公开它...

简答 - 是的,你可以。

详细来说,你的根 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 中使用属性,您可以

  • 使用 dependency:list 插件检索所有依赖项及其版本;或者
  • 一起使用dependency:list+antrun:run插件;或者
  • 配置 CI 服务器脚本来为您完成(例如 this 示例);或者
  • 编写自定义插件来处理您的版本逻辑。

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

<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

查看 README for more info on how to use the plugin. It's available @ Maven Central:

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

...插件一直向下...

这个 maven 插件在 Github (https://github.com/semper-reformanda/dependencyversion-maven-plugin) 上,对于处理依赖版本的任何人来说都是必须的,例如在使用 Webjars 依赖项时 - 你可以将 Webjar 版本号直接注入你的网络资源。

我一直在寻找这样的功能,我希望更多的人遇到它并且它在 Maven Central 上出现(我实际上认为它应该与 Maven 开箱即用)