为啥导出到可运行的 jar 会使应用占用这么多空间?

Posted

技术标签:

【中文标题】为啥导出到可运行的 jar 会使应用占用这么多空间?【英文标题】:Why exporting to runnable jar makes the app take so much space?为什么导出到可运行的 jar 会使应用占用这么多空间? 【发布时间】:2016-07-16 12:38:37 【问题描述】:

背景

我使用 SWT、WindowsBuilder 和 Eclipse 作为 IDE,制作了一个可以在 Windows 操作系统(可能还有其他操作系统)上运行的小工具。

该应用旨在通过尽可能将图像转换为 WebP/Jpeg 来帮助开发人员最小化 android 应用的大小。它可用here

问题

我想让人们更容易运行它,所以我称之为“导出为可运行的 jar”。

完成此操作后,我注意到一个仅占用几 MB(需要 SWT 和一个 exe 转换器文件)的应用程序需要超过 20MB 的存储空间。

我尝试了什么

查看文件结构,我发现:

导出向导只有 2 个步骤:选择导出为可运行的 jar,而这一步:

所以我不知道如何配置它。我尝试更改运行配置,但如果我删除额外的 jar,它无法运行:

Error: Could not find or load main class webpifier.Main

选择恢复默认条目,我得到了额外的罐子:

问题

这怎么可能?所有这些罐子都需要吗?是否有可能避免添加这么大块的文件?这些文件的用途是什么?

对于其他操作系统,仅替换 SWT 文件(和转换器文件)是否足以让应用程序运行?或者我也应该在其他操作系统上调用“导出为可运行的 jar”(这是 Java,我为什么要这样做?)?

【问题讨论】:

只有你知道,如果真的需要所有的罐子。也许您引用了未使用的 JAR?当您使用 Eclipse-RCP 或 SWT 时,所有需要的 Eclipse/SWT-JAR 也会被复制!) 【参考方案1】:

我将发表我的评论作为答案:

这怎么可能?所有这些罐子都需要吗?

只有你知道,如果真的需要所有的罐子。 所有引用到项目的 JAR 通常也会复制到分发文件夹(还有未使用的 JAR)。进一步:当您使用 Eclipse-RCP 或 SWT 时,所有需要的 Eclipse/ SWT-JAR 也被复制到分发文件夹!

我建议使用 Swing 而不是 SWT。 Swing 已经包含在 Java-Libs 中,但 SWT 没有。 所以你不需要分发所有的 SWT-JAR。

提示: 要减少应用程序的分发大小,请尝试删除所有:org.eclipse.*-Imports

有关 SWT 与 Swing 的更多重要信息,请参阅此处:Java Desktop application: SWT vs. Swing

【讨论】:

嗯,我不知道。这就是我问这个的原因。我使用了这些工具和这个功能,这就是我得到的。关于 Swing,我(很久以前)将它与 SWT 进行了比较,我发现 SWT 更优越,并且具有更好的原生外观和感觉。另外,由于项目已经完成,我认为转换为 Swing 将花费太多时间。我什至不认为使用 Swing 会有所帮助,除了删除“swt.jar”文件。您能否尝试将项目导出为可运行的 jar,看看可以做什么(当然不会破坏它)? “swt.jar”文件只有~2MB。剩下的就是我不明白的。 SWT.jar 可能引用了其他 org.eclipse.*.jar。或者您正在使用其他 eclipse.jar 中的类。看看你所有的import org.eclipse.*imports。此外:今天,swing 的原生外观在 Windows 上与其他应用程序并没有真正的区别。 com.ibm.icu* 是做什么用的?它是 11MB! @androiddeveloper:您说转换为 swing 会花费太多时间,但您的课程中只有 8 个课程(少于 2000 LOC)整个项目。我认为这是值得的麻烦!

以上是关于为啥导出到可运行的 jar 会使应用占用这么多空间?的主要内容,如果未能解决你的问题,请参考以下文章

为啥Java会产生这么多进程?

为啥我的 UIImage 占用这么多内存?

为啥 QML Image 占用这么多内存?减慢申请

当库被提取到可运行的 jar 中时,JDBC 运行良好,但在它们刚刚打包时运行良好

为啥 iOS 设备上的 glGenerateMipmap() 会占用这么多客户端内存?

HTML:为啥元素占用这么多宽度?