Java - 如何减小第三方jar的大小以减小应用程序的大小

Yat*_*oel 11 java dependencies jar

我正在开发一个java Web应用程序,其中包括一个applet.该applet依赖于两个jar文件:

  • JFreeChart(用于在客户端绘制图形) - 1.7 MB(jar文件的大小)
  • MySqlJdbcConnector(用于存储在客户端捕获的数据到远程数据库) - .7 mb(jar文件的大小)

现在,问题是上面两个jar文件的大小.我的applet jar (myApplet.jar)的总大小是2.5 MB,其中2.4 MB是因为上面两个jar文件.

我没有使用那些jar文件中的所有类.具体来说,对于 jfreechart,我使用的是来自该库的极少数类.

============================== 问题 =================== ===================

Q1.为了创建myApplet.jar文件,我所做的是解压缩了两个jar文件(jfreechart和mySQLJdbcConnector),然后使用我的applet代码的源代码打包解压缩版本的jar文件,以创建一个jar文件(即myApplet.jar).这是用你的applet代码打包第三方jar文件的正确方法吗?有什么方法可以优化这个吗?

Q2.我试图找到我在我的应用程序中使用的jfreechart库类的依赖项,以便只在myApplet.jar中打包这些依赖项.为此,我使用DependencyAnalyzer查找所有类的依赖项.但后来我发现很难手动这样做,因为每个类(我在我的应用程序中使用的jfreechart类)都有很多依赖项,而且我使用了15个类的jfreechart,因此为每个类执行此操作将非常困难.那有什么建议吗?

Q3.这种情况是非常普遍的开发人员遇到或我遗失的东西,因为我必须这样做?

dar*_*ioo 11

我建议尝试ProGuard.您可以排除未使用的部分jar文件.


Ste*_*n C 8

是的,您可以通过创建仅包含您的applet所需的类的JAR来节省空间.(我看到这叫做超级JAR.)

有各种各样的工具可以做到这一点; 例如ProGuard,Zelix ClassMaster,一个名字我遗忘的Maven插件,依此类推.

但是有一些问题,至少在一般情况下是这样:

  • 如果您的代码使用动态加载(例如通过调用Class.forName(className)),则这些工具通常无法检测依赖性.因此,为了避免动态加载的类被排除在最终的JAR之外,您需要告诉工具应用程序可能以这种方式显式加载的所有类的名称.

  • 您需要查看第三方库的许可证.IIRC,某些许可证要求您以允许人们替换不同版本库的方式将库包含在分布式工件中.有人可能会说,超级JAR让这很难做到,因此可能会有问题.

JFreeChart是LGPL,LGPL是具有上述要求的许可证.然而,MySQL是GPL,胜过LGPL,这意味着你的applet必须是GPL'...如果你分发它.


最后,如果您想最小化applet JAR的大小,则不应将您的源代码包含在JAR中.源代码应该在单独的JAR(或ZIP,TAR或其他)文件中.


Luk*_*der 4

A1:

您可以创建一个 ant 脚本或使用 Eclipse 或任何其他 IDE 自动打包您的小程序。不过你的方法也是对的

A2:

我不会手动做这些事情。寻找传递依赖是非常复杂的。也许darioo的答案是更好的方法。

A3:

这确实很常见。一些提示:

您始终可以在没有调试信息的情况下重新构建这些第三方库。这应该会稍微减少这些库的大小。

另一方面,也许您不应该从小程序到数据库直接连接。您可以创建一个 RMI 接口(或类似的接口)来将 SQL 和结果数据传输到实际执行 SQL 的应用程序服务器。如果您不在安全的 Intranet 中运行小程序,这对于您的小程序来说是一个重要的安全方面。