【问题标题】:How to find a Maven dependency version declaration imported from a BOM如何查找从 BOM 导入的 Maven 依赖版本声明
【发布时间】:2016-04-19 15:36:12
【问题描述】:

多模块父 POM 声明以下 BOM 导入:

<dependencyManagement>
  <dependencies>
    <dependency>
      <groupId>io.spring.platform</groupId>
      <artifactId>platform-bom</artifactId>
      <version>${spring.io.platform.version}</version>
      <type>pom</type>
      <scope>import</scope>
    </dependency>

然后一个模块POM声明一个Hibernate依赖:

<dependency>
  <groupId>org.hibernate</groupId>
  <artifactId>hibernate-core</artifactId>
</dependency>

如何使用 Maven 命令行或 IntelliJ 找出定义了有效 Hibernate 版本的位置?

针对我的模块运行 mvn dependency:tree 会产生:

...
[INFO] +- org.hibernate:hibernate-core:jar:4.3.11.Final:compile
...

这并不完全有用,因为它看起来与我自己管理 Hibernate 版本没有什么不同。如果您必须手动执行此操作,则

  • platform-bom-2.0.3.RELEASE.pom 开始,搜索 Hibernate -> 没有
  • 去它的父spring-boot-starter-parent-1.3.3.RELEASE.pom,搜索Hibernate -> 什么都没有
  • 它的spring-boot-dependencies-1.3.3.RELEASE.pom,搜索Hibernate -> 最后...

但这是一场多么严峻的考验。当然你可以查看http://docs.spring.io/platform/docs/current/reference/htmlsingle/#appendix-dependency-versions,但这些信息不应该是 Maven 自己能够找到的吗?

【问题讨论】:

    标签: maven maven-bom


    【解决方案1】:

    mvn help:effective-pom -Dverbose=true 给出pom 的位置信息,在评论中有效pom 中的条目来自何处。 参考:http://maven.apache.org/plugins/maven-help-plugin/effective-pom-mojo.html

    【讨论】:

    • 不错。我无法追踪插件的来源,mvn help:effective-pom -Dverbose=true 真的很有帮助。
    【解决方案2】:

    我尝试使用 this other answer 中的 mvn help:effective-pom -Dverbose,但它对我不起作用,因为它使用的是 maven-help-plugin:2.2 和 -Dverbose was introduced in 3.2.0

    相反,您应该 force the version in the command line:

    mvn org.apache.maven.plugins:maven-help-plugin:3.2.0:effective-pom -Dverbose=true -Doutput=effective-pom.xml
    

    (最好使用-Doutput,因为文件很大,不方便在终端中阅读)

    【讨论】:

    • 如果依赖来自一个 bom,它会很好地报告这一点。但如果 bom 也来自另一个 bom,则不会显示。
    【解决方案3】:

    在 Eclipse 中,当查看 XML 格式的 pom 时(即在“pom.xml”选项卡中,而不是“概述”选项卡中),只需将鼠标光标放在工件名称上,就会出现一个带有有效版本的弹出窗口以及定义它的位置。

    【讨论】:

      【解决方案4】:

      根据How do I show the Maven POM hierarchy? 看来,使用简单的命令是不可能的。

      您应该编写自己的插件或脚本来将层次结构爬到顶部并找到您感兴趣的工件。

      小提示:要检索您正在使用的工件的版本,您可以在创意编辑器中打开 pom.xml 并按住 Ctrl将鼠标悬停在 artifactId 上,将显示其 pom 的全名及其版本。

      【讨论】:

        【解决方案5】:

        有两件事。首先,dependency:tree 的输出打印出最终结果。这里的问题是你为什么不相信?如果你使用的是 BOM,为什么还要自己管理版本...

        除此之外你还可以使用:

        mvn help:effective-pom
        

        如果你搜索得更好一点,你会来到following pom file,其中包含这样的版本定义:

        <hazelcast.version>3.5.5</hazelcast.version>
        <hibernate.version>4.3.11.Final</hibernate.version>
        <hibernate-validator.version>5.2.4.Final</hibernate-validator.version>
        <hikaricp.version>2.4.3</hikaricp.version>
        <hikaricp-java6.version>2.3.13</hikaricp-java6.version>
        <hornetq.version>2.4.7.Final</hornetq.version> 
        

        这正是依赖关系已经打印出来的版本:树。

        【讨论】:

        • 谢谢,但所有这些都已经在我的 Q 中了。我从未说过我不相信dependency:tree 打印的内容,也从未说过我自己管理版本。 Q 是“定义有效 Hibernate 版本的位置”。另外,我确实列出了您还提到的 POM。关键是,您所说的“搜索得更好一点”是 IMO 的考验。我期待 Maven 能够立即告诉我版本是在哪里定义的(即在哪个 POM 中)。
        • 对于 maven-dependency-plugin 或任何其他可以解决此类问题的插件来说,这听起来是个好主意...
        • mvn help:effective-pom -Dverbose=true 给出了有效pom中入口的位置信息。
        【解决方案6】:

        我的回答与@Didier L 非常相似。由于.xml 文件扩展名mvn org.apache.maven.plugins:maven-help-plugin:3.2.0:effective-pom -Dverbose=true -Doutput=effective-pom,我遇到了错误

        【讨论】:

          猜你喜欢
          • 2019-07-23
          • 1970-01-01
          • 1970-01-01
          • 2021-06-12
          • 2016-09-18
          • 1970-01-01
          • 2016-03-25
          • 2019-07-23
          • 1970-01-01
          相关资源
          最近更新 更多