Java 减少外部jar文件大小

Java 减少外部jar文件大小,java,jar,size,Java,Jar,Size,我为一个Java项目开发了一个模块。该模块依赖于外部库(fastutil)。问题是,fastutil.jar文件比整个项目本身(14MB)重两倍。我只使用库中的一小部分类。该模块现在已经完成,将来可能没有人会扩展它。有没有一种方法可以只将相关类提取到一些fastutil\u small.jar,这样其他人就不必下载所有这些额外的权重 模糊处理工具,例如,通常提供从jar文件中删除未使用的类(甚至字段和方法)的功能。不过,您必须小心验证一切是否仍然有效,因为您可能正在使用reflecton访问Pr

我为一个Java项目开发了一个模块。该模块依赖于外部库(
fastutil
)。问题是,
fastutil.jar
文件比整个项目本身(14MB)重两倍。我只使用库中的一小部分类。该模块现在已经完成,将来可能没有人会扩展它。有没有一种方法可以只将相关类提取到一些
fastutil\u small.jar
,这样其他人就不必下载所有这些额外的权重

模糊处理工具,例如,通常提供从jar文件中删除未使用的类(甚至字段和方法)的功能。不过,您必须小心验证一切是否仍然有效,因为您可能正在使用reflecton访问ProGuard无法分析的类或方法

您只能使用该功能,并已获得相当多的节省


或者,您可以将其与其他节省空间的模糊处理技术(如类和方法重命名)结合使用,以节省更多空间,但代价是更难调试(您的堆栈跟踪将变得更难解析)。

是的,一个粗糙的做法是备份原始jar。然后从jar中删除所有未使用的类文件。可能还有一些对其他类的内部引用,您可以在需要时添加这些引用。ie在执行时可能会抛出一个类not found异常,因此您可以将该类从原始jar添加到此jar。

来自fastutil的:

请注意,由于类的数量很大,jar文件非常庞大:如果您计划附带一些fastutil类来发布自己的jar,那么您应该查看(也可以在JPackage上获得)以自动提取必要的类


由于fastutil是LGPL开源软件,您可以将相关的源文件复制到项目中,然后删除该jar文件。然后,编译器将告诉您是否拥有所需的所有文件。只需保持软件包的原样,并将fastutil许可证文件的副本放在顶部。

+1前5个字正是我在阅读proguard说明中的问题时所想的:“proguard要求指定输入JAR的库JAR(或WAR、EAR、ZIP或目录)。这些基本上就是编译代码所需的库。ProGuard使用它们重建正确处理所需的类依赖关系。库jar本身始终保持不变。您仍然应该将它们放在最终应用程序的类路径中。但是减少库jar文件的大小正是我想要的(或者我使用了错误的词汇表?)。我遗漏了什么?@joe:你可以很容易地解决这个问题,通过
-injars
而不是
-libraryjars
指定库。最后我设法使用了autojar,但还是感谢你的帮助:)谢谢你接受这个答案,但是如果你使用autojar,你可能应该接受这个答案;-)好吧,把我的模块添加到项目中。它是几个相对较小的java包。我想要的是,我对“fastutil”中的几个类的依赖不应该使项目的规模增加三倍。是的,我做了rtfm:)我只是还没有用它做任何有用的事情(noob,记得吗?:))嗯,事实证明,我所要做的就是尝试三次。