【发布时间】:2010-10-27 07:14:08
【问题描述】:
我的应用程序需要多个 jar 才能工作。由于它是一个桌面应用程序,我不能让用户负责安装。因此,在我的构建脚本中,我将 jars 内容解压缩到我的构建目录中,删除清单文件,编译我的软件并再次 jar。一切正常,我的问题是这个过程是否有任何长期的副作用?
【问题讨论】:
我的应用程序需要多个 jar 才能工作。由于它是一个桌面应用程序,我不能让用户负责安装。因此,在我的构建脚本中,我将 jars 内容解压缩到我的构建目录中,删除清单文件,编译我的软件并再次 jar。一切正常,我的问题是这个过程是否有任何长期的副作用?
【问题讨论】:
如果某些罐子已签名,则打开/重新包装会丢失签名。
【讨论】:
一个更简单的解决方案 (IMO) 是使用Maven's assembly plugin,这也在previous Q&A 中链接到的另一个问题的答案之一中进行了描述。前提是您使用 Maven(它本身就是推荐的工具)作为构建工具。
【讨论】:
One-JAR 将完成这项工作,并且有一个新版本 (0.97),它支持 Spring 和 Guice 等框架,用户现在正在将其打包到 One-JAR 档案中。 http://one-jar.sourceforge.net
Ference Hechler 还在 Eclipse 中使用 Eclipse 导出向导完成了一些出色的工作:我们在 FatJar/One-JAR 上进行了合作,Eclipse 工作由此发展而来,我可以推荐它作为一种方法,尽管我不知道如何它很好地处理了框架。
【讨论】:
如果您的主要目标平台是 Windows 桌面,那么您还可以考虑从应用程序的 jar 中生成 Windows 原生 exe
【讨论】:
另一个不错的选择是ProGuard,它也可以缩小和/或混淆代码。
【讨论】:
过去,有些 JAR 的内容很奇怪(比如 DB2 驱动程序包含 com.ibm 和 com.IBM;在 Windows 文件系统中解压后,这两个包会合并)。
您需要注意的唯一问题是 META-INF 中的签名 jar 和其他文件,它们可能在多个源 JAR 中具有相同的名称。
所有这些问题的简单解决方案是使用One-JAR。首先,它允许将多个 JAR 打包成一个而无需解包。并阅读这个答案:Easiest way to merge a release into one JAR file
【讨论】:
好吧,您正在丢弃第三方罐子的清单,这可能会给您带来问题。例如,您可能会因为丢弃“Sealed”属性而导致安全问题。
为什么不创建一个简单的安装程序和一个脚本来启动正确设置 CLASSPATH 的应用程序?
【讨论】: