Java—如何减少第三方JAR的大小以减少应用程序的大小

Java—如何减少第三方JAR的大小以减少应用程序的大小,java,jar,dependencies,Java,Jar,Dependencies,我正在开发一个java web应用程序,其中包括一个小程序。那个小程序是 依赖于两个jar文件: (用于在客户端绘制图形)1.7 mb(大小为 jar文件) MySqlJdbcConnector(用于存储在客户端捕获的数据,以 远程数据库).7 mb(大小为 jar文件) 现在,问题是上面的尺寸 两个jar文件。我房间的总尺寸 applet jar(myApplet.jar)是2.5 mb其中2.4 mb为 因为上面的两个jar文件 我并不是在使用中的所有类 那些jar文件。特别是 jfre

我正在开发一个java web应用程序,其中包括一个小程序。那个小程序是 依赖于两个jar文件:

  • (用于在客户端绘制图形)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),然后将解压缩版本的jar文件与小程序代码的源代码打包,以创建一个jar文件(即myApplet.jar).用小程序代码打包第三方jar文件是否正确?有什么方法可以优化这个吗

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

Q3.这种情况是开发人员经常遇到的还是我错过了一些东西,因此我不得不这么做?

我建议尝试一下。您可以排除不使用的部分jar文件。

A1: 您可以创建ant脚本或使用Eclipse或任何其他IDE自动打包小程序。但你的方式也是正确的

A2: 我不会手工做这些事情。查找可传递依赖项非常复杂。也许达里奥的答案是更好的方法

A3: 这确实很普遍。几点提示:

您总是可以在没有调试信息的情况下重新构建这些第三方库。这将略微减少这些库的大小


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

是的,您可以通过创建一个只包含小程序所需类的JAR来节省空间。(我见过这个叫做优步罐子的东西。)

有各种各样的工具来做这件事;e、 g.ProGuard,Zelix ClassMaster,一个我忘记名字的Maven插件等等

然而,至少在一般情况下,存在两个问题:

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

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

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



最后,如果您想最小化applet JAR的大小,就不应该在JAR中包含源代码。源代码应该放在一个单独的JAR(或ZIP、TAR或其他)文件中。

您知道它在多大程度上减少了JAR的大小吗?我知道这完全取决于我使用的类的数量和依赖的百分比。但是它还是能显著地缩小尺寸吗?@Yatendra:老实说,我很久以前就用过一次,而且只是为了一个小的Hello World类型的项目,所以我不能评论现实生活中的场景。由于谷歌在Android上使用Proguard,优化和收缩可能是至关重要的,所以我相信尺寸缩减可能非常重要。非常感谢@darioo,这正是我想要的。如果你准备好在未来十年与Proguard抗争,请使用Proguard。但是你不会赢。@Yatendra-如果你不是指“小程序的实际源代码”,为什么说“小程序的源代码”?我回答了你提出的问题,而不是你头脑中的问题。@Yatendra-话虽如此,我的回答的主要部分是有效的,无论你是否在applet JAR中包含源代码。您确实需要研究许可问题。您的第一个问题有问题,请查看此链接以了解更多信息@HusseinPourakbar-你在说什么?什么“第一期”?什么问题?@Stephen C-我说的是:如果您的代码使用动态加载(例如通过调用Class.forName(“…”),这些工具通常无法检测到依赖性。因此,为了避免动态加载的类被遗漏在最终的JAR之外,yo