我正在编写一个小程序,它使用约 10 个外部库。它们一起占用超过 2 兆字节。在某些库中,我们只使用 1-2 个类,因此可以安全地删除许多其他类。所以问题是如何从 jar 库中删除未使用的类?
许多其他问题都链接到 Proguard。但它不处理库(或者我做错了什么)并且还破坏了使用反射的部分代码。
您可以使用ClassDep 之类的东西,它静态地标识您将使用哪些类。
然而,这很容易被愚弄。想象一下您的一些代码包含:
Class.forName(className);
因此您可以动态构建一个类名并加载该类。诸如此类的工具ClassDep
无法识别这些情况,因此您需要对缩小的 jar 进行全面测试。
您可以使用 maven-shade-plugin 并告诉它构建一个结合了您的代码和库的最小化 jar 文件。
ProGuard 可以与库一起处理您的代码(使用选项 -injars)。您仍然可以保留不想处理的外部库(使用选项 -libraryjars)。
任何自动收缩工具都会有反射问题。ProGuard 识别一些基本的反射,它允许你指定内部 API 的部分,为了反射而应该保留。ProGuard 支持一些强大的配置,但根据库中反射的数量,它可能仍需要反复试验。
您可以简单地“解压缩” JAR,只从每个 JAR 中获取您想要的类,然后将它们放在自定义存档中。Brian A. 就如何识别这些类和一些注意事项给出了很好的建议。我想补充一下,您也可能违反了许可证...