You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

移除并重新添加JAR依赖后Spring Boot应用启动异常求助

问题:Spring Boot可执行JAR移除并重新添加依赖后无法运行

原JAR包结构(简化描述,实际为Spring Boot可执行JAR结构):

project.jar
-- SUBFOLDER  
-- classes   
-- lib
     -- dependency1.jar
     -- dependency2.jar
     -- dependencyN.jar

执行任务:从主JAR包project.jar中移除dependency1.jar和dependency2.jar,之后再添加回原JAR包。移除后JAR可运行(部分功能不可用为正常情况),但重新添加后应用完全无法运行。

尝试过的操作:

  • 使用jar工具执行命令:jar -uf project.jar dependency1.jar dependedncy2.jar
  • 使用zip工具直接添加依赖JAR
  • 解压依赖JAR,仅将类文件添加到project.jar

出现的错误信息:

Exception in thread "main" java.lang.IllegalStateException: Failed to
get nested archive for entry BOOT-INF/lib/Dependency1.jar
at org.springframework.boot.loader.archive.JarFileArchive.getNestedArchive(JarFileArchive.java:104)
at org.springframework.boot.loader.archive.JarFileArchive$NestedArchiveIterator.adapt(JarFileArchive.java:237)
at org.springframework.boot.loader.archive.JarFileArchive$NestedArchiveIterator.adapt(JarFileArchive.java:228)
at org.springframework.boot.loader.archive.JarFileArchive$AbstractIterator.next(JarFileArchive.java:189)
at org.springframework.boot.loader.ExecutableArchiveLauncher.createClassLoader(ExecutableArchiveLauncher.java:87)
at org.springframework.boot.loader.Launcher.launch(Launcher.java:55)
at org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:88)
Caused by: java.io.IOException: Unable to open nested jar file
'BOOT-INF/lib/Dependency1.jar'
at org.springframework.boot.loader.jar.JarFile.getNestedJarFile(JarFile.java:288)
at org.springframework.boot.loader.jar.JarFile.getNestedJarFile(JarFile.java:274)
at org.springframework.boot.loader.archive.JarFileArchive.getNestedArchive(JarFileArchive.java:100)
... 6 more Caused by: java.lang.IllegalStateException: Unable to open nested entry 'BOOT-INF/lib/Dependency1.jar'. It has been
compressed and nested jar files must be stored without compression.
Please check the mechanism used to create your executable jar file
at org.springframework.boot.loader.jar.JarFile.createJarFileFromFileEntry(JarFile.java:314)
at org.springframework.boot.loader.jar.JarFile.createJarFileFromEntry(JarFile.java:296)
at org.springframework.boot.loader.jar.JarFile.getNestedJarFile(JarFile.java:285)
... 8 more

看起来问题出在压缩上,请问有什么正确操作这类JAR包的方法吗?


解决方案

错误根源明确:Spring Boot可执行JAR要求嵌套在BOOT-INF/lib下的依赖JAR必须以无压缩(STORED)方式存储,普通jar/zip工具默认用压缩(DEFLATED)模式处理文件,导致加载失败。以下是两种正确操作方式:

方法一:用jar工具指定存储模式添加

操作时需通过-0(数字0)参数指定无压缩存储,同时确保依赖JAR路径与JAR内部结构一致(即BOOT-INF/lib):

  1. 先将dependency1.jar和dependency2.jar放到临时创建的BOOT-INF/lib目录中
  2. 执行更新命令:
jar -uf0 project.jar BOOT-INF/lib/dependency1.jar BOOT-INF/lib/dependency2.jar

参数说明:

  • -u:更新已存在的JAR文件
  • -f:指定目标JAR文件名
  • -0:仅存储文件,不进行压缩

方法二:解压后重新打包(更稳妥)

若对路径结构不确定,建议全量解压后操作再重新打包:

  1. 解压project.jar到临时目录:
unzip project.jar -d temp_project
  1. 将dependency1.jar和dependency2.jar复制到temp_project/BOOT-INF/lib目录下
  2. 进入临时目录,用jar命令重新打包(必须带-0参数):
cd temp_project
jar -cf0 ../new_project.jar .

参数说明:

  • -c:创建新的JAR文件
  • -f:指定输出JAR文件名
  • -0:无压缩存储所有文件
  • .:打包当前目录下的全部内容

注意事项

  • 不要直接将依赖JAR的类文件解压到主JAR的classes目录,这会破坏Spring Boot的类加载逻辑
  • 务必保证操作时的路径与JAR内部结构完全匹配(错误信息已明确显示路径为BOOT-INF/lib,而非你描述的根目录lib)

内容的提问来源于stack exchange,提问作者Holland Park

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 20:23:22