如何获取一个构件的依赖树?

282

dependency:tree可用于查看给定项目的依赖树。但是我需要查看第三方工件的依赖树。

我想我可以创建一个空项目,但我正在寻找更简单的方法(因为我需要为几个工件执行此操作)。


如果您需要在插件内以编程方式执行此操作(不仅限于层次结构,而是完整的传递依赖项集合 - 遵守dependencyManagement、exclusions等),请查看此方法。查看此方法 - Janaka Bandara
9个回答

389

1)使用Maven 依赖插件

创建一个只包含 pom.xml 的简单项目。添加您的依赖项并运行:

mvn dependency:tree

(多模块Maven项目的版本: mvn compile dependency:tree )

不幸的是,依赖mojo必须使用pom.xml,否则你会收到以下错误:

无法执行mojo: tree。它需要具有现有pom.xml的项目,但构建没有使用它。

2)在Maven中央库中找到您的artifact的pom.xml

依赖项在您的artifact的pom.xml中描述。使用maven基础设施找到它。

访问https://search.maven.org/并输入您的groupIdartifactId

或者你可以去https://repo1.maven.org/maven2/,先使用插件的groupId导航,之后再使用artifactId导航,最后使用其版本。

例如,请参见org.springframework:spring-core

3)使用Maven依赖插件针对您的artifact

依赖artifact的一部分是pom.xml。它指定了它的依赖关系。你可以在这个pom上执行mvn dependency:tree


6
就像我说的那样,我想避免创建项目的需要。 - IttayD
1
你并不是在“创建”一个项目,而只是在下载一个POM文件。 - Sean Patrick Floyd
2
你不需要创建一个新项目。只需查看您的本地存储库并找到artifact的pom.xml文件即可。 - amra
同时将其复制到特定文件夹中 $ mvn dependency:copy-dependencies -DoutputDirectory=OUTPUT_DIR - absin
1
对于多模块的Maven项目(即具有多个pom.xml文件的项目),您可能会遇到错误。请尝试使用mvn compile dependency:tree命令。 - izogfif
显示剩余2条评论

98

如果你想要创建一个示例项目,并将你的第三方依赖加入其中,那么你可以运行以下命令以查看所有依赖项的完整层次结构。

你可以使用这个Maven命令搜索特定的artifact

mvn dependency:tree -Dverbose -Dincludes=[groupId]:[artifactId]:[type]:[version]

根据文档:

每个模式段都是可选的,支持完整和部分通配符“*”。空的模式段被视为隐式通配符。

假设你正在尝试在项目的不同模块中查找“log4j-1.2-api” jar文件:

mvn dependency:tree -Dverbose -Dincludes=org.apache.logging.log4j:log4j-1.2-api

更多信息可以在这里找到。

编辑:版本3.2.0重新引入了 verbose 标志。您可以按以下方式使用特定版本:

mvn org.apache.maven.plugins:maven-dependency-plugin:3.2.0:tree -Dverbose=true 

5
好的建议!使用-Dverbose就足够让我看到我需要的完整树形结构了。如果您记不住includes标志,或者不想提供完整或通配符groupId,将输出导管到less或类似工具并进行快速搜索是一个很好的方法 :) - jocull
2
如果没有包含您正在查看的工件的pom.xml文件,这将无法正常工作。否则,您将收到“[ERROR] Failed to execute goal org.apache.maven.plugins:maven-dependency-plugin:2.8:tree (default-cli): Goal requires a project to execute but there is no POM in this directory (...). Please verify you invoked Maven from the correct directory. -> [Help 1]” 的错误提示。 - Eisenknurr
5
-Dverbose 在依赖插件中已经被弃用,所以除非你使用的是相当旧的版本,否则此功能将不再可用。 - toolforger
谢谢。非常好的回答。在结果中 org.apache.logging.log4j:log4j-1.2-api:jar:2.17.1 的意思是 log4j 版本 1 还是 2? - mercury
1
很遗憾,@PrashanthDebbadwar,该选项已被简单地删除而没有替代品。您需要查看依赖树文档以了解自2020年以来是否以某种形式重新引入,我没有时间检查。 - toolforger
显示剩余2条评论

20

这可能无法与从中央存储库下载的构件一起使用,因为它们包含了“distributionManagement.status”。这是由中央存储库在上传时添加的。这将导致pom文件上的dependency:tree验证失败。请参见https://issues.apache.org/jira/browse/MNG-3178。 - Arnaud Jeansen

15

如果任何使用 IntelliJ 的人想直接在 IDE 中查看依赖树,则可以安装Maven Helper Plugin插件。

一旦安装,打开 pom.xml 文件,您将能够看到如下所示的Dependency Analyze选项卡。它还提供了仅查看冲突依赖项以及作为树结构查看依赖项的选项。

enter image description here


7

depgraph-maven-pluginfor-artifact目标应该可以做到你想要的。要获取org.jboss.ws:jbossws-common-tools:1.3.2.Final的依赖关系图,只需执行以下命令:

mvn com.github.ferstl:depgraph-maven-plugin:3.3.0:for-artifact -DgroupId=org.jboss.ws -DartifactId=jbossws-common-tools -Dversion=1.3.2.Final -DgraphFormat=text -DshowGroupIds=true -DshowVersions=true

你会得到

org.jboss.ws:jbossws-common-tools:1.3.2.Final:compile
+- org.jboss.ws:jbossws-api:1.1.2.Final:compile
+- org.apache.ant:ant:1.7.1:provided
|  \- org.apache.ant:ant-launcher:1.7.1:provided
+- gnu.getopt:java-getopt:1.0.13:provided
+- log4j:log4j:1.2.14:provided
\- junit:junit:3.8.2:test

无需创建Maven项目或使用IDE或在线应用程序。


5

1
对于Intellij:打开Maven面板,找到您的项目,右键单击->显示依赖项。 - Prasannjeet Singh

5
如果您使用当前版本的m2eclipse(如果您使用eclipse和maven,则应该使用):
选择菜单项
导航 -> 打开Maven POM
并输入您要查找的artifact。 pom将在pom编辑器中打开,从中您可以选择选项卡Dependency Hierarchy以查看依赖关系层次结构(如名称所示:-))

3
您可以使用-Dincludes标志来过滤特定的构件:
mvn dependency:tree -Dincludes=<artifact>

您可以在这里找到更多信息。


1
如果您的构件不是某个项目的依赖项,最好使用存储库搜索引擎。其中许多描述了给定构件的依赖项。

我感兴趣的工件是公司产品的一部分。 - IttayD
很抱歉,我认为Amra的答案是你最好的选择。 - Sean Patrick Floyd

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接