【问题标题】:How do I get an aggregated list of external dependencies of my maven project?如何获取我的 Maven 项目的外部依赖项的汇总列表?
【发布时间】:2016-03-03 11:32:18
【问题描述】:

我有一个大型的多模块 maven 项目,它有大量的依赖项。我想生成一个完整的、经过重复过滤的第三方依赖项列表(即所有不使用项目组 ID 的依赖项)。

我已尝试为此目的使用mvn dependency:list -DexcludeGroupIds=org.example.projectx,但似乎无法将输出聚合到单个列表中。当我从项目根命令行运行命令时,我得到如下输出:

[...]
[INFO] ------------------------------------------------------------------------
[INFO] Building ProjectX: ModuleA - Datatypes 4.0.1-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO] 
[INFO] --- maven-dependency-plugin:2.8:list (default-cli) @ projectx-moda-datatypes ---
[INFO] 
[INFO] The following files have been resolved:
[INFO]    org.slf4j:slf4j-api:jar:1.7.10:compile
[INFO]    org.hamcrest:hamcrest-core:jar:1.3:test
[INFO]    junit:junit:jar:4.12:test
[INFO]    com.google.guava:guava:jar:18.0:compile
[INFO] 
[INFO]                                                                         
[INFO] ------------------------------------------------------------------------
[INFO] Building ProjectX: ModuleB - Binary 4.0.1-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO] 
[INFO] --- maven-dependency-plugin:2.8:list (default-cli) @ projectx-modb-binary ---
[INFO] 
[INFO] The following files have been resolved:
[INFO]    org.slf4j:slf4j-api:jar:1.7.10:compile
[INFO]    com.google.guava:guava:jar:18.0:compile

..etc,用于每个子模块。这不仅不是一个列表(而是每个子模块的单独列表),而且您可以看到它包含重复项。此外,我感兴趣的实际输出隐藏在其他 Maven 输出(下载消息等)的洪流中。

-DoutputFile=<file.txt> 选项也没有提供解决方案。从我的项目根目录运行mvn dependency:list -DoutputFile=deps.txt 的结果不是列出所有依赖项的单个文件,而是多个单独的文件,每个子模块目录中都有一个。

我当然可以将 maven 控制台输出重定向到文件 (mvn [options] > output.txt) 并尝试在 vi 中进行一些巧妙的正则表达式以将其过滤到我想要的列表中。但是,我希望有一种方法可以只使用 Maven 来获得我需要的东西,或者使用依赖插件或其他一些我不知道的报告插件。

【问题讨论】:

    标签: java maven maven-3 maven-dependency-plugin


    【解决方案1】:

    我正在尝试类似的练习,但找不到任何可以在这方面提供帮助的依赖插件的配置/目标。但幸运的是,合并几个命令可以很好地提供所有依赖项的所有唯一和排序列表的列表。

    mvn dependency:list | grep "\[INFO\][^:]*:[^:]*:[^:]*:[^:]*:.*" | cut -d] -f2- | uniq | sort
    

    具体到这个问题,下面应该工作。

    mvn dependency:list -DexcludeGroupIds=org.example.projectx | grep "\[INFO\][^:]*:[^:]*:[^:]*:[^:]*:.*" | cut -d] -f2- | sort | uniq
    

    来源:http://maven.40175.n5.nabble.com/list-all-unique-dependencies-of-multi-module-project-td5787840.html

    【讨论】:

      【解决方案2】:

      您可以创建一个附加模块(或外部 maven 项目),该模块具有 pom 打包(即为空)并将所有您感兴趣的模块/项目作为依赖项。 然后,在其上运行站点生命周期(即简单的 mvn 站点)。作为 target\site 下生成的站点的一部分,您将拥有:

      • Project Dependencies 页面,为您提供直接依赖项(没有帮助,它将是您键入的依赖项列表)和传递依赖项(您要查找的内容)都与 GAV、类型、许可证合并在一个列表中.此外,您还将拥有完整的依赖关系:树合并。
      • Dependency Convergence 页面,提供有关相同传递依赖项及其跨其他依赖项的不同版本(如果有)的收敛的非常有用的信息

      或者,您也可以使用此临时模块/项目在其上运行其他插件,例如您提到的依赖项:列表。这一次您将获得您正在寻找的完整合并列表,尽管没有按字母顺序排列并且仍然难以阅读/重用,因为它将成为构建输出的一部分。相反,站点报告更易于阅读和处理(即将依赖关系表复制并粘贴到 Excel 文件)。

      作为参考,站点阶段将使用 Maven 项目信息报告插件。官方网站,here

      【讨论】:

      • 太棒了!幸运的是,我的项目实际上已经有了这样一个模块,即 BOM(物料清单)。它对依赖插件没有用,因为它只有一个 dependencyManagement 部分(所以 dependency:list 只输出一个空列表),但在那里运行 mvn site 几乎完全符合我的需要。
      • 太好了,如果这让您满意,那么最好将答案作为最终答案接受,以免将来留下未回答的问题。谢谢。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-03-30
      • 2011-09-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-19
      • 2013-05-10
      相关资源
      最近更新 更多