【问题标题】:How could I repack a jar file with all of its dependencies?如何重新打包包含所有依赖项的 jar 文件?
【发布时间】:2011-10-01 13:02:29
【问题描述】:

我正在开发一个应该独立运行的应用程序。但是,这个项目涉及到一个 .jar 文件,其中包含很多依赖项,如果我只是将这个 .jar 文件与应用程序一起分发,它是行不通的。

我想知道是否有任何方法可以解压缩文件、添加依赖项并重新打包?我希望有一些自动机制来解决这个问题,因为手动过程可能需要几个小时,并且可能还有其他引用的 jar 文件。

附:我正在使用 Eclipse,但由于我将使用 Web Start 部署此项目,因此使用内置导出工具导出项目可能不是一个好主意,因为我的尝试都以 ClassNotFoundException, so I suspect I might have to pack the project into several jars.

谢谢!

【问题讨论】:

  • @Robin 在这种情况下,jar 不可运行。但是,我相信问题非常相似。但是有了答案,我现在无法删除我的问题。
  • 可运行与否,合并jar文件是一回事,只是没有声明主类。
  • 请注意,如果几个原始jar文件包含相同的文件名但内容不同(主要是META-INF的内容,如MANIFEST.MF或Spring的模式处理程序声明),这些文件需要以某种方式合并,否则您可能会遇到奇怪的错误。

标签: java import jar dependencies export


【解决方案1】:

对于 Spring Boot 2.1.9.RELEASE,我设法像这样解压并重新打包 fat jar: 移动到包含 jar 文件的文件夹中。

解压jar文件

jar xvf app.jar

删除旧的jar文件

rm app.jar

在父目录中创建新的 jar 文件

jar cmf0 META-INF/MANIFEST.MF ../app.jar  *

m ... 使用特定的清单文件

0 ... 禁用压缩,从而避免依赖项(jar 文件)被压缩

文档也可以在这里找到:https://docs.oracle.com/javase/tutorial/deployment/jar/build.html

【讨论】:

    【解决方案2】:

    是的,拆包和打包有时会让您感到恼火,尤其是在 Ubuntu 等 Linux 环境中,

    在解压之前,请确保您的 Java_Home 和路径已导出到如下文件夹: 在您的主目录中,您很可能有一个名为 .bashrc 的文件。转到文件末尾并添加以下内容

    export JAVA_HOME=<path to your JDK install e.g. /opt/jdk>
    export PATH=$JAVA_HOME/bin:$PATH
    

    这会设置您的 JAVA_HOME 环境变量 - 通常由基于 Java 的应用程序使用。然后它将该目录添加到您的 PATH 变量中。操作系统将 PATH 理解为可执行文件的父目录列表。

    现在解压jar xvf JAR_NAME.jar 打包回来jar cf JAR_NAME.jar *

    【讨论】:

    • 这会改变 MANIFEST.MF 文件。如何在不更改清单文件的情况下重新打包 jar?
    • @ChrisF,请尝试提供所需清单的选项:jar options jar-file [manifest-file]
    【解决方案3】:

    由于文件夹结构,重新打包解压的 JAR 有点令人沮丧

    打开包装时:

    jar xvf JAR_NAME.jar
    

    你会得到一个JAR_NAME/ 文件夹

    重新打包 JAR:

    • 删除旧罐子

      rm JAR_NAME.jar

    • 进入文件夹

      cd JAR_NAME

    • 打包引用父文件夹的jar

      jar cf ../JAR_NAME.jar *

    您最终会在父文件夹中看到 JAR_NAME.jar,原始文件夹是从该文件夹中解压出来的,如果您已打包文件夹本身,则不会获得第一个文件夹级别。

    【讨论】:

    • 完美运行。这应该是公认的答案。
    • 对我来说,jar 没有解压到JAR_NAME 文件夹,而是就位
    【解决方案4】:

    您是否尝试过在 Eclipse 中“导出可运行的 jar”?它应该适合你。

    看看这张图:

    【讨论】:

    • 是的,但是我在尝试部署项目时遇到了问题(参见P.S.部分),所以我放弃了这种方法。
    • 我在之前的评论中忘记提到我要重新打包的jar文件不可运行:(
    【解决方案5】:

    看看jar jar。听起来它会满足您的需求。

    【讨论】:

    • 嗯... Jar-Jar Links... 作为一个《星球大战》的铁杆粉丝,我严重怀疑任何有这样名字的东西都能正常运行。开个玩笑,会检查:)
    • 除了星球大战之外:我实际上已经专业地使用了它。它相当成熟/成熟。
    猜你喜欢
    • 2014-06-08
    • 2012-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-06
    • 1970-01-01
    • 2017-01-13
    • 2013-03-04
    相关资源
    最近更新 更多