它能在运行时调用所有Java类吗?

它能在运行时调用所有Java类吗?,java,jvm,Java,Jvm,在完成我的项目后,我想删除所有未使用的类,以减少打包时jar文件的大小 我正在使用IntelliJ,它可以帮助我检测未使用的类,但它包括一些仅由反射调用的类(仅限运行时)。此外,它无法检测外部库中未使用的类 重要的一点是,我想删除外部库中未使用的类。例如,当我使用谷歌番石榴的BiMap时,我必须包括番石榴库,但我只想使用BiMap,包括整个番石榴使我的罐子变大 因此,我的想法正好相反,我不想查找未使用的类,而是想知道在运行时使用/调用了所有的类(我将手动删除未使用的类/包)。我如何才能做到这一点

在完成我的项目后,我想删除所有未使用的类,以减少打包时jar文件的大小

我正在使用IntelliJ,它可以帮助我检测未使用的类,但它包括一些仅由反射调用的类(仅限运行时)。此外,它无法检测外部库中未使用的类

重要的一点是,我想删除外部库中未使用的类。例如,当我使用谷歌番石榴的BiMap时,我必须包括番石榴库,但我只想使用BiMap,包括整个番石榴使我的罐子变大


因此,我的想法正好相反,我不想查找未使用的类,而是想知道在运行时使用/调用了所有的类(我将手动删除未使用的类/包)。我如何才能做到这一点?

考虑使用Proguard()之类的工具来实现这一点

我不确定如何将jar文件的内容限制为仅引用的Java类。动态加载类时,也可能会遇到问题


Guava在他们的网站上解释了如何使用ProGuard在构建中包含Guava的子集:

为什么不检查类在项目中的引用位置。如果从未使用过该类,是否将其删除#Buhake Sindi:不仅是我的项目,我还想删除外部库中未使用的类。例如,当我使用Google Guava的BiMap时,我必须包含Guava库,但我只想使用BiMap,包括整个Guava使我的jar变得越来越大。我认为Proguard不能使用外部库,reflectionProguard也可以使用库中所有使用的类构建uber jar,并删除未使用的类。为了保留反射使用的类,您必须调整proguard配置以强制保留该类,但我如何知道反射使用的是哪些类?您需要有这些信息。要么是您自己的源代码,并且您显然知道哪些类是动态加载的,要么您应该阅读库的文档。。。不确定他们给了我们这个信息。通过启动应用程序并记录当前加载的所有类,您也可以在实践中找到这些类,但您可能会错过一些。我看没有其他方法可以做你想做的事情“你可能会错过一些”,我有测试用例,我将运行所有的测试用例,所以我不能错过。要限制,只需通过WinRar打开并删除.class文件。“在动态加载类时,您也可能会遇到问题”,这是我关心的问题,所以我想确切地知道在运行时使用了哪些类。顺便说一句,Guava只是我的一个例子。手动删除存档中的.class文件会起作用,我认为这是一个非常耗时且容易出错的过程。通常,您希望尽可能地自动化构建和打包过程。这将节省您的时间来进行真正的编码,并减少生成错误的机会。显然,我将编写脚本来自动完成这项工作。我只是给出解决方案