【问题标题】:How do I find out what jar files are actually used when compiling a java project编译java项目时如何找出实际使用的jar文件
【发布时间】:2009-11-19 14:36:16
【问题描述】:

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

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

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

【问题讨论】:

  • 你会发现没有一个也涵盖运行时依赖项。
  • 你甚至不会为其他依赖项找到一个简单的。欢迎来到类路径地狱;)
  • 记录:类依赖分析器提供了最详细的输出,并带有一个很好的 GUI 来检查结果。但是,它非常缓慢且内存不足。作为构建作业的一部分,Jar Analyzer 看起来更容易自动化,并产生大量有用的输出。它也相当快。

标签: java jar javac


【解决方案1】:

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

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

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

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

【讨论】:

  • 我可能遗漏了一些东西,但我不明白这会给你一个无用的罐子列表。
  • 它会告诉你你的应用程序确实依赖哪些容器,其余的都是无用的。
  • 正确 - 您可以将使用的 jar 与类路径进行比较,但这是有风险的 - 在您分析路径时可能尚未使用库,但也是必要的..
  • 这不包括运行时依赖项(即Class.forName("com.example.Clazz").
  • 对于反射、使用 ServiceLocator 的代码等也没有帮助。如果你有测试,我会开始手动删除东西,直到测试中断。如果您没有测试,那么 Java 的延迟类加载会让您感到困难。
【解决方案2】:

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


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

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

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

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

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

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

【讨论】:

  • 你总是可以实现一些脚本。
  • 但是,如果您还想涵盖运行时依赖项,这很可能是最好的方法。
  • Strike - 100% 候选人接受答案,好像他们很快开发了一些东西来解决 tomdee 的问题 ;-)
【解决方案3】:

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

【讨论】:

    【解决方案4】:

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

    【讨论】:

    • 如果您真的是指 java 源文件中的 import 语句 - eclipse 警告已经很老了。反之亦然 - 他正在寻找未使用的类路径条目。
    • 这是 Eclipse 的一个特性已经有很长一段时间了
    【解决方案5】:

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

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

    【讨论】:

      【解决方案6】:

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-03-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-05-21
        相关资源
        最近更新 更多