如何在编译java项目时找出实际使用的jar文件

tom*_*dee 15 java jar javac

我目前正在将一个非常大的类路径传递给javac来编译一个java项目.

我知道不需要那些jar文件.

有没有一种简单的方法可以找出不需要哪些文件?

san*_*ity 11

您需要Class Dependency Analyzer工具.引用介绍:

此工具的目的是分析Java™类文件,以便更多地了解这些类之间的依赖关系.

确实,它不会捕获运行时依赖性 - 但是如果没有运行详尽的100%覆盖率测试套件,您将无法确定是否已捕获所有运行时依赖性.

如果您期望运行时依赖性,则应将CDA用作第一遍,然后对结果应用程序进行详尽的测试,以确保没有仅通过运行时依赖性引用的jar文件.


Pas*_*ent 8

我想"逐个删除它们并检查应用程序是否仍然编译并正常工作"不是预期的答案:)


(编辑:虽然上面提出的方法可能有点自动化,但它仍然有点痛苦,必须有一个替代方案,至少对于编译时依赖性.经过一些谷歌搜索,我发现Jar Analyzer似乎是一个很好的工具按照此博客文章中的说明工作:

Jar Analyzer扫描编译依赖项,这意味着它可以创建一个树,其中需要JAR文件来编译编译这些JAR文件所需的JAR文件,等等.您将获得一个非常好的报告/图表,其中显示了所有JAR文件及其存在的原因.

您还可以看到与您的代码没有任何关联的JAR文件,删除它们及其子代.我在libs文件夹中发现的是,libs文件夹中的150个JAR文件中有大约20%在编译时未使用,这些是可能被删除的JAR.

最大的问题是,您没有得到任何关于哪些JAR文件仅在运行时通过发现和反射使用的提示.这就是真正的工作开始的地方.

查明是否在运行时使用JAR文件的唯一方法是将其取出,启动应用程序并测试每个功能.如果您的应用程序适中,那么执行100%回归测试需要花费数小时.所以在实践中,我最终做了很多猜测,快速和肮脏的测试,并且四处寻找找出实际使用的运行时依赖项.

它似乎很容易使用:下载,解压缩并在包含所有jar的目录上运行该工具.或者使用提供的Ant任务.)


Ant*_* O. 5

您还可以使用loosejar.jar,它可以让您在运行时找到项目的真正jar依赖项!