为什么无法提取Spring Boot可执行jar文件?

19

Spring Boot 项目,构建成可执行的 Jar 包,但我发现无法提取该可执行 Jar 包,例如:

jar xvf spring-boot-foo-0.0.1-SNAPSHOT.jar

没有任何输出。 但是当提取一个普通的jar时,可以成功。

jar xvf mysql-connector-java-5.1.38.jar
created: META-INF/
inflated: META-INF/MANIFEST.MF
created: META-INF/services/
...

为什么会这样呢?


1
你可以用你最喜欢的压缩工具打开Spring Boot的jar包吗?里面有什么东西吗? - Gimby
是的,unzip 命令可以解压缩它。但是 unzip 命令可以解压缩所有的 JAR 文件,而不仅仅是 Spring Boot 可执行 JAR 文件。 - zhuguowei
Winzip不合作。给我一个错误:未找到中央目录 - Adam
@zhuguowei 当你执行unzip boot.jar时,会发生什么不好的事情? - Adam
4个回答

39
你可以使用less命令来压缩你的jar文件,然后会发现以下内容:
#!/bin/bash
#
#    .   ____          _            __ _ _
#   /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
#  ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
#   \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
#    '  |____| .__|_| |_|_| |_\__, | / / / /
#   =========|_|==============|___/=/_/_/_/
#   :: Spring Boot Startup Script ::
#

也就是说,这是一个跟随着jar文件的bash文件,不是普通的jar文件。

你可以使用以下命令来提取该文件:unzip spring-boot-foo-0.0.1-SNAPSHOT.jar

或者将spring-boot-maven-plugin插件的可执行标志设置为false,以生成普通的jar文件。

<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <configuration>
        <executable>false</executable>
    </configuration>
</plugin>

1
他们是如何做到的?我可以搜索什么来了解更多关于这个的信息? - mdo123
对我来说,你不能给Stack Overflow半票是一个小问题。你只回答了问题的一半。而且由于你只有1点声望,我不会给你负分并拿走它,因为这会影响我的声誉。这会破坏我的内心平静。 - Adam
我不得不在VI中打开JAR文件,并删除顶部的shell脚本,只留下exit命令后面的所有内容。然后unzip spring-boot-foo-0.0.1-SNAPSHOT.jar就可以正常工作了。 - Shane Rowatt
将可执行标记更改为false对我有用,谢谢。 - Jorge Santos Neill

17

我通常使用7zip在Windows上提取文件,但它并不起作用。感谢@peace0phmind,我尝试使用文本编辑器(notepad++)打开它,我发现内容是一个Shell脚本后面跟着二进制代码。

我只是删除了所有的bash脚本行,保存了文件,现在可以用7zip打开它。


15
使用7zip打开Springboot可执行jar文件时,需要右键单击.jar文件并选择第二个7zip选项“打开归档文件...”,然后从附加格式中选择zip格式。 选择“作为归档文件打开”将无法正常工作。

0

升级到Spring Boot 2.6.7并使用Gradle bootJar任务创建可执行的jar文件。 现在,即使它是可执行的,您也可以提取该jar文件。

不确定这是否是Spring Boot 2.6.x中的错误。

我尝试了Spring Boot版本2.6.7、Spring Cloud版本2021.0.0和Gradle 6.9.0

我无法使用任何标准zip存档工具限制jar文件的提取。


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