如何缩小外部java库?
Posted
技术标签:
【中文标题】如何缩小外部java库?【英文标题】:How to shrink external java libs? 【发布时间】:2012-06-26 21:29:23 【问题描述】:我正在编写一个小程序,它使用大约 10 个外部库。它们一起占用超过 2 兆字节。在某些库中,我们只使用 1-2 个类,因此可以安全地删除许多其他类。所以问题是如何从 jar 库中删除未使用的类?
许多其他问题都链接到 Proguard。但它不处理库(或者我做错了什么)并且还破坏了使用反射的部分代码。
【问题讨论】:
如果你想从外部库中删除文件,如果外部库中的类是依赖的,我认为这是一个乏味的过程。可能您可以从删除不必要的开始,如果有任何投诉,例如 ClassNotFoundException。 AFAIK,proguard 隐藏了你的类文件,这并不意味着它删除了不必要的类。 【参考方案1】:您可以使用 maven-shade-plugin 并告诉它构建一个最小化的 jar 文件来组合您的代码和库。
【讨论】:
【参考方案2】:你可以使用ClassDep之类的东西,它静态地标识你将使用哪些类。
然而,这很容易被愚弄。想象一下你的一些代码包含:
Class.forName(className);
因此您可以动态构建类名并加载该类。 ClassDep
之类的工具无法识别这些情况,因此您需要对缩小的 jar 进行全面测试。
【讨论】:
【参考方案3】:ProGuard 可以与库一起处理您的代码(使用选项 -injars)。您仍然可以保留不想处理的外部库(使用选项 -libraryjars)。
任何自动收缩工具都会有反射问题。 ProGuard 识别一些基本的反射,它允许你指定内部 API 的部分,为了反射而应该保留。 ProGuard 支持一些强大的配置,但根据库中反射的数量,它可能仍需要反复试验。
【讨论】:
【参考方案4】:您可以简单地“解压缩” JAR,只从每个 JAR 中提取您想要的类,然后将它们放在自定义存档中。 Brian A. 就如何识别这些类和一些注意事项给出了很好的建议。我想补充一下,您也可能违反了许可证...
【讨论】:
以上是关于如何缩小外部java库?的主要内容,如果未能解决你的问题,请参考以下文章