如何确定Java程序使用哪些类?

是否有任何工具可以列出哪些应用程序有效地使用哪些类,或者甚至更好地自动修剪JAR库以仅提供引用和使用的类?

请记住,正如暂停问题所certificate的那样,您无法确定某个特定类是否被使用过。 至少在任何中等复杂的应用程序上。 这是因为类不仅在编译时绑定,而且可以加载:

  • 基于XML配置(例如Spring);
  • 从属性文件加载(例如JDBC驱动程序名称);
  • 使用注释动态添加;
  • 由于外部输入而加载(例如用户输入,来自数据库的数据或远程过程调用);
  • 等等

所以只看源代码是不够的。 话虽这么说,任何合理的IDE都会为您提供依赖性分析工具。 IntelliJ当然可以。

您真正需要的是运行时检测应用程序正在执行的操作,但即使这样也无法保证。 毕竟,由于奇怪的输入组合,特定的代码路径可能会在1000万次运行中出现,因此无法保证您已被覆盖。

像这样的工具确实有一些价值。 你可能想看看像艾玛这样的东西。 像Yourkit这样的分析器可以为您提供代码转储,您也可以对其进行分析(尽管这不会很好地获取瞬态对象)。

就个人而言,我发现除了IDE告诉你的东西之外没什么价值:删除未使用的JAR。 比这更精细,只是要求很少甚至没有收获的麻烦。

是的,你想要ProGuard 。 它是一个完全免费的Java代码缩减器和混淆器。 它易于配置,快速有效。

您可以尝试JarJar http://code.google.com/p/jarjar/

它修剪了jar依赖项。

对于大多数情况,只需使用javac即可轻松完成。

删除现有的类文件。 使用您的输入类名称调用javac。 它将编译必要的那些类,但不会更多。 任务完成。