如何缩小外部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库?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用外部库运行 jar

使用外部 Java 库的猪 UDF

如何在intellij idea中启用从源到外部库的滚动?

在 iPad 上运行时 iPhone 应用程序外部显示窗口放大/缩小

缩小外部模块提供的接口上的类型

Java - 为来自外部库的类定义一个通用接口