Maven中依赖的Jar文件列表

113

在使用Maven 2时,有没有一种方式可以仅列出jar依赖项的文件名?

mvn dependency:build-classpath 

可以列出jar文件, 但这将包括它们在本地存储库中的完整路径。我需要的基本上只是一个文件名列表(或者copy-dependencies目标复制的文件名)。

所以我需要的列表应该是这样的

activation-1.1.jar,antlr-2.7.6.jar,aopalliance-1.0.jar etc...
理想情况下应该使用Maven属性,但我猜一个像build-classpath这样生成的文件也可以。我想做的是为一个OSGi bundle手动维护的MANIFEST.MF文件编写Bundle-ClassPath。(您不需要理解这一点才能回答问题)。澄清一下:这个问题不是关于如何在jar的MANIFEST.MF文件中写入清单头(这很容易通过谷歌搜索解决)。我正在询问如何获取我想要写的数据,即上面所示的列表。

只需要为依赖插件提交一个补丁,我就会将其应用到下一个发布版本中。生成的类路径是最接近你想要的东西,我们只需要调整选项以获得所需的输出即可。 - Brian Fox
太好了,看起来一样!!! - anand krish
9个回答

130

这个命令会生成你的Maven项目的依赖树:

$ mvn dependency:tree

我相信你会喜欢结果 :-)


太好了。我一直在搜索获取所有Maven依赖项列表的方法。 - anand krish
为什么在“mvn -h”信息中根本没有显示这个?它根本没有提到依赖关系... - Mike B
我认为帮助输出仅适用于mvn二进制文件,而不适用于可用目标的文档。除了使用自动完成(需要手动激活),还可以列出可用目标/任务列表将是很好的补充。 - Oliver Groß

31

实际上,只需要使用最终罐子的列表即可。

mvn dependency:list

相对于依赖树(dependency:tree)来说,这种方法简单得多,后者在获取最终列表时过于复杂,因为它显示了详细的传递树和冲突解决(以及冗长的输出)。

这里是附加参数的文档


9
如果你想对它们进行排序: mvn dependency:list -Dsort=true - mgarde

22
据我所知,无论是通过命令行还是通过pom.xml文件,使用maven-dependency-plugin或CLI指定空格或“”(空字符串)作为 pathSeparatorfileSeparator 的替代品都会导致错误。所以,您可能不得不达成妥协。您可以运行以下命令来获取完整的列表,用'::'分隔而不是只用','
    mvn dependency:build-classpath -Dmdep.pathSeparator=":" -Dmdep.prefix='' -Dmdep.fileSeparator=":" -Dmdep.outputFile=classpath
然而,这样做会让结果中包含两个冒号'::',而不是只用逗号',',但它能够工作。如果您运行以下命令:
    mvn dependency:build-classpath -Dmdep.pathSeparator="@REPLACEWITHCOMMA" -Dmdep.prefix='' -Dmdep.fileSeparator="@" -Dmdep.outputFile=classpath
并将其附加到generate-resources阶段,并在生命周期的process-resources阶段设置正确的属性来过滤该资源,您应该能够仅获得逗号。
您可以查看此处以获取所有选项的完整列表。

2
非常好的答案!如果您使用-Dmdep.pathSeparator=',' -Dmdep.prefix='.' -Dmdep.fileSeparator='/',您将获得一个逗号分隔的相对文件名列表,例如./file1.jar,./file2.jar,这样就避免了过滤的需要。 - Eero

20

这是您所要求的命令

$ mvn dependency:tree

对于大型项目,它可能会输出大量文本。我假设您想检查依赖树是否包含某个依赖项,因此您不需要完整的列表。

以下是在Windows上如何过滤输出:

$ mvn dependency:tree | findstr javax.persistence

以下是如何在 Linux 上完成此操作的方法:

$ mvn dependency:tree | grep javax.persistence

Maven的做法来过滤依赖树(适用于Windows cmd、MacOS和Linux shell):

$ mvn dependency:tree -Dincludes=javax.persistence:*

Maven的方式(Windows PowerShell):

$ mvn dependency:tree '-Dincludes=javax.persistence:*'

4
你看过Apache Felix项目了吗? 它有很多插件,包括一个bundle plugin,应该能做到你想要的。
此外,你试过使用<addClasspath>标签和<manifestFile>吗? 这应该能实现将类路径合并到你的清单文件中的目的。
<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-jar-plugin</artifactId>
  ...
  <configuration>
    <archive>
      <addClasspath>true</addClasspath>
      <manifestFile>src/main/resources/META-INF/MANIFEST.MF</manifestFile>
    </archive>
  </configuration>
  ...
</plugin>

我知道Apache Felix,但它不能满足我的需求,这就是为什么我要手动完成的原因。 - Sindri Traustason
addClasspath会将一系列jar添加到Class-Path清单头中,我没有看到maven-jar-plugin文档提到可以将类路径放入其他头文件中。此外,Bundle-Classpath需要的不仅仅是一系列的jar列表。 - Sindri Traustason
链接到Apache Felix的页面已损坏。 - naXa stands with Ukraine

3

我可能漏掉了一些东西,但是由于您已经使用了copy-dependencies,所以听起来您真正需要的只是指定目录中文件的列表。

Ant可以轻松地为您完成此操作,shell脚本也可以。


我同意,我刚刚做到了 - Matthieu

2

1
为了补充现有答案,当前的maven-dependency-plugin允许使用outputProperty参数将类路径保存到属性中。

1
这里有一个用于管道传输mvn dependency:list的awk脚本:
mvn dependency:list | awk -f mvnfmt.awk

如果您想按名称排序,可以使用| sort,或者使用| tr '\n' ':'将其格式化为类路径。

mvnfmt.awk是:

BEGIN {
    found = 0
}

/The following files have been resolved/ {
    found = 1
    next
}

/^\[INFO\] \$/ {
    print "Empty " found
    if (found != 0) found = 0
}

{
    if (!found) next
    n = split($0, a, " ")
    if (n != 2) {
        found = 0
        next
    }
    split(a[2], a, ":")
    print a[2] "-" a[4] "." a[3]
}   

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