我如何找出在编译Java项目时实际使用了哪些jar文件
我目前正在将一个非常大的类路径传递给javac来编译java项目。
我知道不需要许多这些jar文件。
有没有一种简单的方法来找出哪些文件是不需要的?
我目前正在将一个非常大的类路径传递给javac来编译java项目。
我知道不需要许多这些jar文件。
有没有一种简单的方法来找出哪些文件是不需要的?
您需要类依赖关系分析器工具。引用引言:
此工具的目的是分析 Java™ 类文件,以便了解有关这些类之间的依赖关系的更多信息。
没错,它不会捕获运行时依赖项 - 但是如果不运行详尽的100%覆盖率测试套件,您永远无法确定您已经捕获了所有运行时依赖项。
如果你期望运行时依赖项,则应使用 CDA 作为第一遍,然后对生成的应用进行详尽的测试,以确保没有仅通过运行时依赖项引用的 jar 文件。
我猜想“逐个删除它们并检查应用程序是否仍在编译和工作”不是预期的答案:)
(编辑:虽然上面建议的方法可能有点自动化,但它仍然有些痛苦,必须有一个替代方案,至少对于编译时依赖关系。经过一些谷歌搜索,我发现Jar Analyzer似乎是这项工作的一个很好的工具,如这篇博客文章中所述:
Jar Analyzer 扫描编译依赖关系,这意味着它可以创建一个树,其中包含编译编译这些 JAR 文件所需的 JAR 文件,依此类推。你会得到一个非常好的报告/图表,它向你展示了所有的JAR文件以及它们为什么在那里。
您还可以查看与您的代码没有任何连接的JAR文件,删除它们及其子级。我在libs文件夹中发现的是,在libs文件夹中的150个JAR文件中,大约有20%在编译时未使用,这些是要删除的潜在JAR。
最大的问题是,您不会通过发现和反射获得有关哪些JAR文件仅在运行时使用的提示。这是真正工作开始的地方。
找出JAR文件是否在运行时使用的唯一方法基本上是将其取出,启动应用程序并测试每个功能。如果您的应用程序大小适中,则执行 100% 回归测试需要花费数小时。因此,在实践中,我最终做了大量的猜测,快速和肮脏的测试,并询问了哪些运行时依赖项实际上正在使用中。
它似乎非常易于使用:下载,解压缩并在包含所有jar的目录上运行该工具。或者使用提供的 Ant 任务。