如何从仓库中列出一个构件的传递依赖项?

14

我想知道是否有一种方法可以使用Maven Dependency插件(或命令行中的其他东西)列出一个存储库中某个构件的传递依赖项(即不在我的pom.xml文件中)?

我知道可以使用mvn dependency:tree来列出本地项目的依赖关系,但在将其添加到我的项目之前,我想要知道某个构件的依赖关系(即做出明智的决策)。而且,为了依赖性插件的唯一目的,将依赖性添加到本地pom.xml似乎是一个笨拙的解决方案。

我希望能够运行类似以下的命令:

mvn dependency:tree "-DgroupId=net.jawr" "-DartifactId=jawr-core" "-Dversion=3.5"

我目前想到的最好办法是:

  1. 删除本地仓库(即~/.m2/repository
  2. 运行mvn dependency:get "-DgroupId=net.jawr" "-DartifactId=jawr-core" "-Dversion=3.5"
  3. 检查输出结果

但这看起来非常不专业和浪费。

PS - 我不介意是否以树形格式呈现。


你能添加一个虚拟依赖吗?我的意思是创建一个空项目,并在其上添加一个对远程构件的依赖,然后使用mvn dependency:tree命令?编辑:啊,我明白了,你已经认为这种方法不太正规了。好吧,没问题。 - Graham Griffiths
@GrahamGriffiths 我正在尝试查看是否有“正确的方法”来做这件事,但目前看起来像是一个缺失的功能。 - Sled
同意...看起来Maven没有区分“解析依赖”和“获取依赖”。 - Graham Griffiths
准确来说,它将解决依赖关系,但仅适用于本地项目。因此,解决方法是下载远程pom,然后运行命令,这就是给定答案的做法。 - Sled
1个回答

26

我不知道Maven有任何本地方法可以做到这一点,但是我想出了下面的shell脚本似乎可以完成任务:

#!/bin/sh
if [ "$#" -ne 3 ]; then
  echo "Usage: $0 <groupId> <artifactId> <version>"
  exit
fi

POM_DIR="`echo "$1" | tr . /`/$2/$3"
POM_PATH="$POM_DIR/$2-$3.pom"

mkdir -p "$HOME/.m2/repository/$POM_DIR"
wget -q -O "$HOME/.m2/repository/$POM_PATH" "https://repo.maven.apache.org/maven2/$POM_PATH"
mvn -f "$HOME/.m2/repository/$POM_PATH" dependency:tree

此脚本从Maven中央仓库下载您指定的构件(artifact)的POM文件,然后运行该POM文件的dependency:tree目标。例如:

此脚本会下载指定构件的依赖树,并以可视化形式显示出来。

izstas@izstas-PC:~$ ./deptree net.jawr jawr-core 3.5
[INFO] Scanning for projects...
[INFO]                                                                         
[INFO] ------------------------------------------------------------------------
[INFO] Building Java web resources bundling and compression 3.5
[INFO] ------------------------------------------------------------------------
[INFO] 
[INFO] --- maven-dependency-plugin:2.1:tree (default-cli) @ jawr-core ---
[INFO] net.jawr:jawr-core:jar:3.5
[INFO] +- javax.servlet:servlet-api:jar:2.5:provided
[INFO] +- javax.servlet.jsp:jsp-api:jar:2.1:provided
[INFO] +- org.mozilla:rhino:jar:1.7R4:provided
[INFO] +- com.yahoo.platform.yui:yuicompressor:jar:2.4.7:provided
[INFO] +- javax.faces:jsf-api:jar:1.1_02:provided
[INFO] +- commons-validator:commons-validator:jar:1.2.0:provided
[INFO] |  +- commons-beanutils:commons-beanutils:jar:1.7.0:provided
[INFO] |  +- commons-digester:commons-digester:jar:1.6:provided
[INFO] |  |  \- commons-collections:commons-collections:jar:2.1:provided
[INFO] |  +- commons-logging:commons-logging:jar:1.0.4:provided
[INFO] |  +- oro:oro:jar:2.0.8:provided
[INFO] |  \- xml-apis:xml-apis:jar:1.0.b2:provided
[INFO] +- taglibs:standard:jar:1.1.2:provided
[INFO] +- net.sf.ehcache:ehcache:jar:2.7.4:provided
[INFO] +- com.carrotsearch:smartsprites:jar:0.2.10:provided
[INFO] |  +- com.google.guava:guava:jar:14.0.1:provided
[INFO] |  +- args4j:args4j:jar:2.0.16:provided
[INFO] |  +- org.apache.commons:commons-math3:jar:3.0:provided
[INFO] |  +- commons-io:commons-io:jar:2.4:provided
[INFO] |  \- org.apache.commons:commons-lang3:jar:3.1:provided
[INFO] +- com.google.javascript:closure-compiler:jar:v20131014:provided
[INFO] |  +- com.google.protobuf:protobuf-java:jar:2.4.1:provided
[INFO] |  +- org.json:json:jar:20090211:provided
[INFO] |  \- com.google.code.findbugs:jsr305:jar:1.3.9:provided
[INFO] +- org.slf4j:slf4j-api:jar:1.7.5:compile
[INFO] +- org.slf4j:slf4j-log4j12:jar:1.7.5:provided
[INFO] +- log4j:log4j:jar:1.2.17:provided
[INFO] +- junit:junit:jar:4.11:test
[INFO] |  \- org.hamcrest:hamcrest-core:jar:1.3:test
[INFO] \- org.mockito:mockito-all:jar:1.9.5:test
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 0.756s
[INFO] Finished at: Fri Mar 14 21:00:41 MSK 2014
[INFO] Final Memory: 10M/181M
[INFO] ------------------------------------------------------------------------
我可能可以剥离掉不必要的Maven输出信息。
然而,这似乎会下载依赖的 .jar 文件,所以我不能说这是一个干净的解决方案。但至少它不需要你清理本地存储库。

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