我有一个 Java 应用程序并创建了一个 JAR 文件并进行了部署。
该应用程序使用外部 JAR,例如 Log4J JAR。创建 JAR 文件时,如何将所有外部相关 JAR 包含到我的存档中?
为了让我的应用程序正常工作,我不得不将 Log4J JAR 复制到与我自己的 JAR 相同的目录中,这有点违背了 jar 的目的。部署 1 个 JAR 文件不是更优雅吗?
我有一个 Java 应用程序并创建了一个 JAR 文件并进行了部署。
该应用程序使用外部 JAR,例如 Log4J JAR。创建 JAR 文件时,如何将所有外部相关 JAR 包含到我的存档中?
为了让我的应用程序正常工作,我不得不将 Log4J JAR 复制到与我自己的 JAR 相同的目录中,这有点违背了 jar 的目的。部署 1 个 JAR 文件不是更优雅吗?
如果您使用 Eclipse,您可以将所有包含的文件提取到一个可运行的 jar 中,如下所示:
您可以选择是否将依赖 jar 打包为单独的 jar 文件或将它们提取到生成的 JAR 中。
您可以使用One-JAR 之类的东西将 Java 应用程序及其依赖项打包到单个可执行 Jar 文件中(One-JAR 使用自定义类加载器使 JAR 嵌套成为可能)。
您必须将库 jar 扩展到您编译的类所在的相同位置,然后从中制作一个 jar。根据构建过程的设置方式,可能有多种方法可以实现此目的。这不是火箭科学——jar 只是一个 zip 存档,根目录有一个 META-INF 目录。
保持 JAR 独立会更好,因为只需将特定 JAR 升级到其新版本即可,无需触及任何其他配置。由于您必须将每个文件复制到与 JAR 相同的位置,您始终可以使用 JavaCLASSPATH
并将任何 JAR 包含到应用程序的类路径中。
您可以使用 Maven + 程序集插件(http://maven.apache.org/plugins/maven-assembly-plugin/)
顺便说一句,如果您不使用 Maven,这可能不是最简单的方法。
正如您所发现的,JAR 本身不能嵌套其他 JAR。
传统上,人们会分发一个 ZIP 存档或其他安装程序,这些安装程序将展开应用程序 JAR(您的)以及任何支持 JAR 的适当位置以进行类路径访问。然后,经常通过调用主 JAR 并创建列出支持 JAR 的类路径的脚本调用应用程序。
正如其他海报所指出的那样,如果您想要的话,您可以选择创建一个超级 JAR。