将多个jar子合并到一个jar子里

我的应用程序需要多个jar子才能工作。 由于它是桌面应用程序,我无法让用户负责安装。 所以在我的构建脚本中,我将jar内容解压缩到我的构建目录中删除清单文件,编译我的软件并再次将其jar。 一切正常,因为我的问题是这个过程有任何长期的副作用吗?

在过去,有些JAR具有奇怪的内容(比如包含com.ibmcom.IBM的DB2驱动程序;在Windows文件系统中解压缩后,这两个包将被合并)。

您需要注意的唯一问题是签名的jar和META-INF中的其他文件,这些文件在多个源JAR中可能具有相同的名称。

所有这些问题的简单解决方案是使用One-JAR 。 它允许首先将几个JAR包装成一个而不解压缩它们。 并阅读此答案: 将发布合并到一个JAR文件的最简单方法

一个更简单的解决方案(IMO)正在使用Maven的汇编插件 ,该插件也在之前的问答中与另一个问题的答案中进行了描述。 如果您使用Maven(本身就是推荐的工具)作为构建工具,则可以使用此方法。

另一个很好的选择是ProGuard ,它也可以缩小和/或混淆代码。

如果你想为最终用户提供一个没有大惊小怪的方式来启动具有多个jar依赖项的程序,你可能需要查看Launch4j或Jsmooth (我更喜欢Launch4j)。 两者都是创建可执行文件的程序,这些可执行文件将jar和JRE包装在一起,这样对于最终用户来说,它看起来与任何其他可执行文件没有什么不同。

如果您的主要目标平台是Windows桌面,那么您还可以考虑从应用程序的jar中生成Windows本机exe

如果某些jar子已签名,则通过解压缩/重新包装来丢失签名。

那么你就丢掉了第三方jar子的清单,这样可能会给你带来麻烦。 例如,您可能会通过丢弃“密封”属性来导致安全问题。

为什么不创建一个简单的安装程序和脚本来启动正确设置CLASSPATH的应用程序?

One-JAR将完成这项工作,并有一个新版本(0.97),它支持Spring和Guice等框架,用户现在将这些框架打包到One-JAR档案中。 http://one-jar.sourceforge.net

Ference Hechler还使用Eclipse导出向导在Eclipse中做了一些很棒的工作:我们在Eclipse工作的FatJar / One-JAR上一起工作,我可以推荐它作为一种方法,虽然我不知道它处理得有多好框架。