16

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

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

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

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

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

该信息已经在依赖关系树上可用,只是公开它的问题......

4

3 回答 3

16

找不到任何现有的 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

IE

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

查看README以获取有关如何使用该插件的更多信息。它在@Maven Central可用:

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

...插件一路下来...

于 2016-07-13T17:50:21.287 回答
4

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

详细地说,你的根 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插件检索所有依赖项及其版本;或者
  • 一起使用依赖:列表+ antrun:运行插件;或者
  • 配置 CI 服务器脚本为你做这件事(例如这个例子);或者
  • 编写一个自定义插件来处理您的版本逻辑。
于 2016-06-12T01:02:28.747 回答
1

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

我一直在寻找这样的功能很长一段时间,我希望更多的人能遇到它并且它会在 Maven 中心上出现(我实际上认为它应该与 Maven 一起提供)

于 2016-08-24T08:52:28.747 回答