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

30byixjq  于 2022-12-28  发布在  Java
关注(0)|答案(3)|浏览(168)

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

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

现在,问题是上面两个jar文件的大小,我的小程序jar**(myApplet.jar)的总大小是2.5mb**,其中2.4mb是由于上面两个jar文件的原因。
我并没有使用那些jar文件中的所有类,特别是对于jfreechart,我使用的是那个库中的一小部分类。

问题

    • 问题1.要创建myApplet. jar**文件,我所做的是解压两个jar文件(jfreechart和mySQLJdbcConnector),然后将解压版本的jar文件与applet代码的源代码打包,以创建一个单独的jar文件(**i. e myApplet.jar).**用你的小程序代码打包第三方jar文件是正确的吗?有什么方法可以优化它吗?
    • 问题2.我试图找到我在应用程序中使用的jfreechart库的类的依赖项,以便仅将这些依赖项打包到myApplet.jar中。**为此,我使用DependencyAnalyzer来查找所有类的依赖项,但后来我发现手动查找很困难,因为每个类(我在我的应用程序中使用的jfreechart类)有很多依赖项,我使用了大约15个jfreechart类,所以对每个类都这样做会很困难。所以有什么建议吗?
    • 问题3.**这种情况是开发人员经常遇到的情况,还是我遗漏了一些东西,因此我必须这样做?
6ss1mwsb

6ss1mwsb1#

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

gmxoilav

gmxoilav2#

是的,您可以通过创建一个只包含applet所需类的JAR来保存空间(我见过这种被称为uber-JAR的JAR)。
有各种各样的工具可以做到这一点;例如ProGuard、Zelix ClassMaster、一个我忘记名字的Maven插件等等。
然而,至少在一般情况下,存在一些问题:

  • 如果你的代码使用动态加载(例如通过调用Class.forName(className)),这些工具通常不能检测依赖性,所以为了避免动态加载的类被遗漏在最终的JAR之外,你需要告诉工具你的应用程序可能以这种方式显式加载的所有类的名称。
  • 你需要看一下第三方库的许可证。IIRC,有些许可证要求你在你的分布式工件中包含库,允许人们替换库的不同版本。有人可能会说uber-JAR使得这很难做到,因此可能会有问题。

JFreeChart是LGPL,而LGPL是一个具有上述要求的许可证,然而MySQL是GPL,它胜过LGPL,这意味着如果你发布它,你的applet必须是GPL艾德。
最后,如果你想最小化你的applet JAR的大小,你不应该把你的源代码包含在JAR中。源代码应该在一个单独的JAR(或者ZIP,TAR或者其他的)文件中。

ngynwnxp

ngynwnxp3#

A1:

您可以创建一个ant脚本或使用Eclipse或任何其他IDE来自动打包applet,但您的方法也是正确的

A2:

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

A3:

这确实很常见。给你几点提示:
您可以随时重新构建那些没有调试信息的第三方库,这应该会稍微减少那些库的大小。
另一方面,也许你不应该有一个从你的applet到数据库的直接连接。你可以创建一个RMI接口(或类似的东西)来传输你的SQL和结果数据到一个应用服务器,它实际上执行你的SQL。如果你不在一个安全的intranet中运行applet,这对你的applet来说是一个重要的安全方面。

相关问题