如何将一个jar文件及其所有依赖项重新打包?

10
我正在开发一个应用程序,它应该是独立运行的。然而,这个项目涉及一个包含许多依赖项的.jar文件,如果我仅仅分发这个.jar文件,它将无法正常工作。
我想知道是否有任何方法可以解压文件,添加依赖项,然后重新打包?我希望有一些自动机制来完成这个过程,因为手动过程可能需要几个小时,并且可能还有其他引用的jar文件。
附言:我正在使用Eclipse,但由于我将使用Web Start部署此项目,使用内置导出工具导出项目可能不是一个好主意,因为我的尝试都以ClassNotFoundException结束,所以我怀疑我可能必须将项目打包成几个jar文件。
谢谢!

@Robin 在这种情况下,该jar文件无法运行。然而,我认为问题非常相似。但是由于已经有答案了,我现在无法删除我的问题。 - zw324
无论是否可运行,合并jar文件都是相同的事情,只是没有声明主类。 - Robin
请注意,如果几个原始的jar文件包含相同的文件名但内容不同(大多数是META-INF的内容,如MANIFEST.MF或Spring的模式处理程序声明),则这些文件需要以某种方式合并,否则可能会出现奇怪的错误。 - Christian Semrau
5个回答

24

重新打包已解压的JAR文件有点令人沮丧,因为文件夹结构会导致困扰。

使用以下命令进行解压:

jar xvf JAR_NAME.jar

你会得到一个名为 JAR_NAME/ 的文件夹

重新打包JAR:

  • 删除旧的jar

    rm JAR_NAME.jar

  • 进入文件夹

    cd JAR_NAME

  • 通过引用父文件夹来打包jar

    jar cf ../JAR_NAME.jar *

然后你会在原始文件解压缩的父文件夹中得到 JAR_NAME.jar,如果你直接将文件夹本身打包,你会获得第一层文件夹级别。


1
完美运行。这应该是被接受的答案。 - Clint Paul
11
对我来说,这个JAR文件并没有被提取到JAR_NAME文件夹中,而是在原地。 - pHiL

6
对于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  *

使用特定的清单文件来构建JAR文件

0表示禁用压缩,这将绕过对依赖项(jar文件)的压缩

此处还可以找到文档:https://docs.oracle.com/javase/tutorial/deployment/jar/build.html


3

有时候解压和打包会让你感到不爽,特别是在类似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变量中。操作系统将路径看作可执行文件的父目录列表。

现在解压缩jar xvf JAR_NAME.jar 重新打包jar cf JAR_NAME.jar *


这会更改MANIFEST.MF文件。我如何重新打包一个jar文件而不更改清单文件? - Chris F
@ChrisF,请尝试使用以下选项提供所需的清单文件: jar options jar-file [manifest-file] - HariKishore K

1

看一下jar jar。听起来它可以满足你的需求。


嗯...Jar-Jar Links...作为一名铁杆的星球大战粉丝,我真的怀疑这样一个名字的东西能否正常运行。开个玩笑,我会去检查的 :) - zw324
撇开星球大战不谈:我实际上在职业上使用过它。它相当成熟/成熟稳定。 - thunderflower

0
你尝试过在Eclipse中使用“导出可运行的JAR”吗?这应该适用于你。
看一下这张图片: picture

是的,但是当我尝试部署项目时遇到了问题(请参见P.S.部分),所以我放弃了这种方法。 - zw324
我在之前的评论中忘记提到,我正在尝试重新打包的jar文件无法运行:( - zw324

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接