Maven中的依赖项jar文件列表


77

使用Maven 2,有没有办法我可以列出jar依赖项,就像文件名一样?

mvn dependency:build-classpath 

可以列出jar文件,但这将包括其在我的本地存储库中位置的完整路径。实际上,我需要的只是文件名列表(或复制依赖目标复制的文件名)。

所以我需要的清单是

activation-1.1.jar,antlr-2.7.6.jar,aopalliance-1.0.jar etc...

理想情况下,它可以作为maven属性使用,但是我猜想,可以生成诸如build-classpath这样的文件。

我要实现的目标是Bundle-ClassPath向OSGi捆绑包的手动维护的MANIFEST.MF文件中写入。(您不需要了解这一点即可回答问题。)

澄清一下:问题在于如何将清单标头写入jar的MANIFEST.MF文件中(很容易googleble)。我在问如何获取要写入的数据,即上面显示的列表。


只需提交依赖插件的补丁,然后我将其应用于下一个版本。构建类路径是最接近您想要的东西,我们只需要调整选项即可获得所需的输出。
Brian Fox

Answers:


94

此命令将生成您的Maven项目的依赖关系树:

$ mvn dependency:tree

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


20

据我所知,用逗号和空格不能完全得到该输出。无论通过命令行,并通过pom.xml文件,maven的依赖性,插件或CLI怪胎如果指定空格或“”(空字符串),与这两种替代了pathSeparatorfileSeparator。因此,您可能被迫达成妥协。您可以

    mvn依赖项:build-classpath -Dmdep.pathSeparator =“:” -Dmdep.prefix =“ -Dmdep.fileSeparator =”:“ -Dmdep.outputFile = classpath

但是,这应该为您提供完整的列表,用'::'而不是分隔',',但可以使用。如果您运行:

    mvn依赖项:build-classpath -Dmdep.pathSeparator =“ @ REPLACEWITHCOMMA” -Dmdep.prefix =''-Dmdep.fileSeparator =“ @” -Dmdep.outputFile = classpath

并将其附加到generate-resources阶段中然后通过process-resources在生命周期的阶段中设置正确的属性来过滤该资源,您应该只能得到逗号。

您可以在以下位置查看选项的完整列表: http://maven.apache.org/plugins/maven-dependency-plugin/build-classpath-mojo.html


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

16

这是您要的命令

$ 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:*'

11

实际上,对于最终的罐子列表,只需使用

mvn dependency:list

这比dependency:tree简单得多,因为它显示了详细的可传递树和冲突解决方案(带详细信息),因此简单地获得最终列表是一个过大的杀伤力。


2
并且,如果您希望对它们进行排序:mvn dependency:list -Dsort=true
mgarde

5

您是否看过Apache Felix项目?它有很多插件,包括应该执行您想要的捆绑插件

另外,您是否尝试过使用<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,

3

我可能在这里遗漏了一些东西,但是由于您已经使用过复制依赖关系,因此听起来您真正想要的只是指定目录中的文件列表。

Ant可以像shell脚本一样为您完成此任务。


我同意,我做到了
Matthieu


1

要在现有答案中添加一个缺口,当前的maven-dependency-plugin允许使用outputProperty参数将类路径保存到属性。


1

这是awk脚本管道mvn dependency:list

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]
}   
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.