如何获得我的 Maven 项目的外部依赖项的聚合列表?

How do I get an aggregated list of external dependencies of my maven project?

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

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

您可以创建一个额外的模块(或外部 maven 项目),它具有 pom 包装(即空的)并且具有您感兴趣的所有 modules/projects 作为依赖项。 然后,运行站点生命周期就可以了(也就是简单的mvn site)。作为 target\site 下生成的站点的一部分,您将拥有:

  • Project Dependencies 页面,为您提供直接依赖项(没有帮助,它将是您键入的依赖项列表)和传递依赖项(您正在寻找的)全部合并在一份包含 GAV、类型、许可证的清单。此外,您还将合并完整的 dependency:tree。
  • Dependency Convergence 页面,提供关于相同传递依赖及其跨其他依赖的不同版本的收敛的非常有用的信息,如果有的话

或者,您也可以将此临时 module/project 用于 运行 其他插件,例如您提到的 dependency:list。这次您将获得您正在寻找的完整合并列表,尽管不是按字母顺序排列并且仍然难以 read/re-use 因为它将成为构建输出的一部分。相反,站点报告更易于阅读和处理(即将依赖项 table 复制并粘贴到 excel 文件)。

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

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

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

针对这个问题,下面的应该有效。

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

我需要提取 libraries/test 库列表以将它们提供给声纳扫描应用程序。我们没有使用 maven sonar-scanner 插件,我需要一种简单的方法来避免开发人员手动定义库列表。另外,我想避免将整个 Maven 缓存传递给扫描器,因为它会减慢扫描速度。

使用以下命令,我可以将依赖项列表和格式提取为排序的、唯一的、逗号分隔的完整路径列表:

# This will generate the dependency list for each module and store it in separate files (#1)
mvn dependency:list -DoutputAbsoluteArtifactFilename=true -DoutputFile=dependencies.txt -Dsort=true --offline

# To print the test dependencies (#2)
{ find . -name dependencies.txt -exec grep ":test:" {} \;; } | sort | uniq | cut -d":" -f 6 | paste -d , -s

# To print the list of all dependencies except the test ones (#3)
{ find . -name dependencies.txt -exec grep -E ":.+:" {} \;; } | grep -v ":test:" | sort | uniq | cut -d":" -f 6 | paste -d , -s

描述:

  1. 使用依赖插件生成所有依赖项并将它们存储在名为 dependencies.txt 的文件中,这些文件将存储在每个模块的文件夹中。此外,它对依赖项进行排序并打印工件的完整路径(即 org.springframework.boot:spring-boot-autoconfigure:jar:2.5.6:compile:/usr/share/maven/ref/repository/org/springframework/boot/spring-boot-autoconfigure/2.5.6/spring-boot-autoconfigure- 2.5.6.jar)

  2. 在当前文件夹和子文件夹中查找名为 dependencies.txt 的所有文件,并将找到的每个文件传递给 grep。然后只过滤包含“:test:”的行,然后对所有行进行排序(每行是一个依赖),过滤掉重复项,提取第6个字段(对应文件名的完整路径),然后粘贴为逗号分隔的条目序列

  3. 类似于1但是grep会过滤掉所有至少有2个“:”的行(有些行是描述性的,只包含1),然后结果再次通过grep过滤掉所有包含“:test:”字符串的行,只留下运行时、编译等依赖项。

其他信息

  • 外部大括号(“{ ... }”)用于创建子 shell
  • 一起(“{}”)是find命令的占位符,将被替换为每个找到的文件的路径
  • 第一个“;”在 ”\;;”一是结束find命令二是结束subshell
  • 中的命令