15

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

我知道其中许多 jar 文件是不需要的。

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

4

6 回答 6

11

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

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

诚然,它不会捕获运行时依赖项——但如果没有运行详尽的 100% 覆盖率测试套件,您永远无法确定您已经捕获了所有运行时依赖项。

如果您期望运行时依赖项,您应该首先使用 CDA,然后对生成的应用程序进行详尽的测试,以确保没有仅通过运行时依赖项引用的 jar 文件。

于 2009-11-19T14:39:24.287 回答
9

我猜“将它们一一删除并检查应用程序是否仍然可以编译和工作”不是预期的答案:)


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

Jar Analyzer 扫描编译依赖项,这意味着它可以创建一个树,其中需要哪些 JAR 文件来编译需要哪些 JAR 文件来编译这些 JAR 文件,依此类推。你会得到一个非常好的报告/图表,它显示了所有的 JAR 文件以及它们为什么在其中。

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

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

查明 JAR 文件是否在运行时使用的唯一方法基本上是将其取出,启动您的应用程序并测试每个功能。如果您有一个中等大小的应用程序,执行 100% 回归测试需要很多小时。所以在实践中,我最终做了很多猜测,快速而肮脏的测试,并四处询问以找出实际使用了哪些运行时依赖项。

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

于 2009-11-19T14:39:01.370 回答
5

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

于 2013-08-30T07:19:25.593 回答
2

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

于 2009-11-19T14:40:27.187 回答
2

编译器有一个-verbose选项,而且非常冗长。它通知每个类被加载以及从哪里加载!

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

于 2009-11-19T14:46:37.097 回答
1

检查类路径助手

于 2009-11-19T14:50:40.830 回答