2009-11-19 16 views
12

我正在向javac传递非常大的类路径来编译java项目。如何在编译java项目时找出实际使用的jar文件

我知道一些这些jar文件是不需要的。

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

+1

你会发现没有人也涵盖了运行时依赖关系。 – BalusC 2009-11-19 14:54:28

+0

您甚至不会为其他依赖项找到一个简单的依赖项。欢迎来到classpath地狱;) – 2009-11-19 15:03:55

+0

记录:类依赖关系分析仪提供最详细的输出,一个很好的图形用户界面来检查结果。然而,它很慢,记忆力很差。作为构建作业的一部分,Jar分析器看起来更容易自动化,并生成大量有用的输出。它也相当快。 – tomdee 2009-11-19 17:14:22

回答

10

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

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

确实,它不会捕获运行时依赖关系 - 但是缺少运行详尽的100%覆盖测试套件,您永远无法确定是否捕获了所有运行时依赖关系。

如果你希望你应该使用CDA作为第一通运行时依赖,然后做最终应用的详尽的测试,以确保有哪些是只能通过运行时依赖引用没有jar文件。

+0

我可能会错过一些东西,但我不明白这会给你一个无用的jar列表。 – 2009-11-19 14:42:47

+0

它会告诉你应用程序依赖哪些容器,其余的则是无用的。 – sanity 2009-11-19 14:48:45

+1

正确 - 您可以将使用的jar与类路径进行比较,但这是有风险的 - 在分析路径时可能没有使用过库,但是必须使用此库。 – 2009-11-19 14:49:12

8

我猜“删除它们逐一检查应用程序仍然编译和作品”没有预期的答案:)


(编辑:虽然这种方法上面建议可有点自动化,它仍然不知何故不好受,并必须有一个选择,至少在编译时依赖一些google搜索后,我发现Jar Analyzer这似乎在这个blog post解释是这项工作一个很好的工具。

罐分析器扫描编译依赖关系,这意味着它可以创建一个需要JAR文件的树来编译编译这些JAR文件所需的JAR文件,等等。你会得到一个非常好的报告/图表,显示所有的JAR文件以及它们为什么在那里。

你也可以看到没有任何连接到你的代码的JAR文件,删除它们和他们的孩子。我在libs文件夹中发现的是,在编译时我们的libs文件夹中的大约20%的JAR文件未被使用,并且这些是可能的JAR被删除。

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

找出在运行时是否使用JAR文件的唯一方法是基本上把它拿出来,启动你的应用程序并测试每个功能。如果您的应用程序规模适中,则执行100%回归测试需要几个小时。所以在实践中,我最终做了大量的猜测,快速和肮脏的测试,并且询问了解哪些运行时依赖关系实际上正在使用中。

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

+0

我希望能少一点手工! – tomdee 2009-11-19 14:39:29

+0

你总是可以实现一些脚本。 – 2009-11-19 14:41:24

+0

然而,如果你想覆盖运行时依赖关系,这也是最好的方法。 – BalusC 2009-11-19 14:56:03

2

Eclipse的最新版本将警告你在你的源代码

+2

如果你确实是在java源代码文件中的import语句 - eclipse的警告很旧,而且是相反的 - 他正在寻找classpath条目没有使用。 – 2009-11-19 14:59:45

+1

这已经是Eclipse功能相当长的时间 – 2009-11-19 14:59:59

2

编译器有一个-verbose选项未使用的进口,这是相当冗长。它通知每个被加载的类以及它从哪里加载!

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

4

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

+0

真棒和完美这是!日Thnx – N3Xg3N 2014-07-02 10:40:51

相关问题