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

Posted

技术标签:

【中文标题】Maven 是不是有办法将依赖版本作为属性获取?【英文标题】:Does Maven have a way to get a dependency version as a property?Maven 是否有办法将依赖版本作为属性获取? 【发布时间】:2016-10-10 16:43:19 【问题描述】:

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

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

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

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

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

信息已经在依赖树上,只是暴露它的问题......

【问题讨论】:

通常的方法是使用定义所有版本的common parent (IRL example)。 @zapl - 查看编辑,我正在专门处理 BOM。 为什么要为依赖项使用属性,因为它是通过依赖项管理中的 BOM 定义的,因此您不需要定义版本。为什么需要引用依赖? 它们最终派上用场有很多原因。例如,我最近不得不使用 JBoss 模块。它们要求您编写一个 module.xml 文件,明确说明您正在使用的任何 .jar 依赖项。除非您的 pom 中存在可以过滤这些 .jar 名称的属性,否则您只能手动维护 module.xml。事实是,在 maven 生态系统中,这些版本最终以 just 依赖声明之外的方式有用。 【参考方案1】:

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

详细来说,你的根 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 示例);或 编写一个自定义插件来处理您的版本逻辑。

【讨论】:

问题的第一句话 - “我正在使用 BOM 导入依赖项”。如果我使用的是父 pom,这将不是问题。我的问题在于属性不会从 BOM 依赖项中导入,但这些依赖项的版本会。 此外,这个答案已经在其他几个关于如何共享属性的 S/​​O 问题中说明。 IE。 ***.com/questions/1231561/… 是的,我在自定义插件的道路上走了一半。这是可用的最不粘胶的解决方案(Maven 中的所有内容似乎都经常导致插件)。检索很简单,可以手动完成,但它容易出错的性质使其非常不受欢迎。 CI 脚本之类的东西很受欢迎,但仍然不理想,因为它直接将构建环境的稳定性与特定的非标准 CI 操作联系在一起。【参考方案2】:

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

I.E.

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>

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

【讨论】:

项目已移至 GitLab:gitlab.com/josh-cain/dependencyversion-maven-plugin 我可以在这个 Maven 插件的配置中指定使用哪个 BOM 导入吗?我的模块没有导入 BOM,但我还是想获得 BOM 的依赖版本。 很棒,而且我喜欢它自动“锁定”快照版本的一切,这正是我所需要的。谢谢。【参考方案3】:

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

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

【讨论】:

查看我的答案 - 我写了这个插件,因为我找不到这个功能。但是感谢您的客气话;-) 项目已移至 GitLab:gitlab.com/josh-cain/dependencyversion-maven-plugin

以上是关于Maven 是不是有办法将依赖版本作为属性获取?的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法使用maven插件将jar解压到我的项目文件夹并将它们作为java文件获取[关闭]

扫描多个 maven pom 以获取不同的依赖版本

如何将本地 Maven m2 作为属性传递给 Gradle?

Maven 从曾祖父母而不是我们的父母依赖管理采购依赖版本

关于maven的规则插件:Maven Enforcer plugin

Maven传递依懒