移除并重新添加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):
- 先将
dependency1.jar和dependency2.jar放到临时创建的BOOT-INF/lib目录中 - 执行更新命令:
jar -uf0 project.jar BOOT-INF/lib/dependency1.jar BOOT-INF/lib/dependency2.jar
参数说明:
-u:更新已存在的JAR文件-f:指定目标JAR文件名-0:仅存储文件,不进行压缩
方法二:解压后重新打包(更稳妥)
若对路径结构不确定,建议全量解压后操作再重新打包:
- 解压project.jar到临时目录:
unzip project.jar -d temp_project
- 将
dependency1.jar和dependency2.jar复制到temp_project/BOOT-INF/lib目录下 - 进入临时目录,用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
相关产品推荐
相关产品推荐

