我正在开发 java web应用程序,其中包括小程序。那个小程序是 依赖于两个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。这种情况是开发人员遇到的情况还是我遗失的东西,因为我必须这样做?
答案 0 :(得分:11)
我建议您尝试ProGuard。您可以排除未使用的部分jar文件。
答案 1 :(得分: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或其他)文件中。
答案 2 :(得分:4)
您可以创建ant脚本或使用Eclipse或任何其他IDE自动打包您的applet。但你的方式也是正确的
我不会手动做这些事情。寻找传递依赖性非常复杂。也许 darioo 的答案是更好的方法。
这确实非常普遍。一些提示:
您始终可以在没有调试信息的情况下重新构建这些第三方库。这应该会略微减少这些库的大小。
另一方面,也许您不应该从applet直接连接到数据库。您可以创建一个RMI接口(或类似的东西)来将SQL和结果数据传输到实际执行SQL的应用程序服务器。如果您不在安全的Intranet中运行它,这对您的applet来说是一个重要的安全方面。