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

时间:2009-11-19 14:36:17

标签: java jar javac

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

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

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

6 个答案:

答案 0 :(得分:11)

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

  

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

没错,它不会捕获运行时依赖性 - 但是如果没有运行详尽的100%覆盖率测试套件,你就永远无法确定是否已经捕获了所有运行时依赖性。

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

答案 1 :(得分:8)

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


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

  

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

     

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

     

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

     

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

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

答案 2 :(得分:5)

您还拥有loosejar.jar,可以让您在运行时找到项目的真正jar依赖项!

答案 3 :(得分:2)

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

答案 4 :(得分:2)

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

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

答案 5 :(得分:1)