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

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

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

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

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

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

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

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

我想“一个一个地删除它们并检查应用程序是否仍然编译并运行”不是预期的答案:)


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

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

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

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

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

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

您还有loosejar.jar ,它使您能够在运行时找到项目的真正jar依赖项!

最新版本的eclipse将警告您源代码中未使用的导入

编译器有一个-verbose选项,它非常详细。 它通知每个加载的类和加载的位置!

虽然它不是用户友好的并且它不提供高级分析,但我发现它对于调试类路径冲突非常有用。 这告诉你使用的jar(在grep帮助下),而不是那些不习惯的jar。

检查Classpath Helper