我目前正在将一个非常大的类路径传递给 javac 来编译一个 java 项目。
我知道其中许多 jar 文件是不需要的。
有没有一种简单的方法可以找出不需要哪些文件?
您需要Class Dependency Analyzer工具。引用介绍:
此工具的目的是分析 Java™ 类文件,以了解有关这些类之间的依赖关系的更多信息。
诚然,它不会捕获运行时依赖项——但如果没有运行详尽的 100% 覆盖率测试套件,您永远无法确定您已经捕获了所有运行时依赖项。
如果您期望运行时依赖项,您应该首先使用 CDA,然后对生成的应用程序进行详尽的测试,以确保没有仅通过运行时依赖项引用的 jar 文件。
我猜“将它们一一删除并检查应用程序是否仍然可以编译和工作”不是预期的答案:)
(编辑:虽然上面建议的方法可以有点自动化,但它仍然有点痛苦,并且必须有一个替代方案,至少对于编译时依赖项。经过一番谷歌搜索,我发现Jar Analyzer这似乎是一个很好的工具按照此博客文章中的说明工作:
Jar Analyzer 扫描编译依赖项,这意味着它可以创建一个树,其中需要哪些 JAR 文件来编译需要哪些 JAR 文件来编译这些 JAR 文件,依此类推。你会得到一个非常好的报告/图表,它显示了所有的 JAR 文件以及它们为什么在其中。
您还可以查看与您的代码没有任何联系的 JAR 文件,删除它们及其子文件。我在我们的 libs 文件夹中发现,我们的 libs 文件夹中的 150 个 JAR 文件中约有 20% 在编译时未使用,这些是可能要删除的 JAR。
最大的问题是,您不会通过发现和反射获得任何关于哪些 JAR 文件仅在运行时使用的提示。这就是真正的工作开始的地方。
查明 JAR 文件是否在运行时使用的唯一方法基本上是将其取出,启动您的应用程序并测试每个功能。如果您有一个中等大小的应用程序,执行 100% 回归测试需要很多小时。所以在实践中,我最终做了很多猜测,快速而肮脏的测试,并四处询问以找出实际使用了哪些运行时依赖项。
它似乎很容易使用:下载、解压缩并在包含所有 jar 的目录上运行该工具。或者使用提供的 Ant 任务。)
您还拥有loosejar.jar,它使您能够在运行时找到项目的真正jar 依赖项!
最新版本的 eclipse 将警告您源代码中未使用的导入
编译器有一个-verbose
选项,而且非常冗长。它通知每个类被加载以及从哪里加载!
虽然它对用户不太友好并且不提供高级分析,但我发现它对于调试类路径冲突非常有用。这会告诉您使用的罐子(在 的帮助下grep
),而不是不使用的罐子。
检查类路径助手