Spring Boot 3 升级后JSP应用无法独立运行求助
问题:JSP应用升级Spring Boot 3后
java -jar启动失败,gradle bootRun正常 将JSP应用升级至Spring Boot 3后,通过gradle bootRun命令可正常启动,但执行java -jar oldnewjspapp.war以独立应用形式启动时失败,抛出以下堆栈错误:
ERROR 7082 --- [ main] o.s.boot.SpringApplication : Application run failed org.springframework.context.ApplicationContextException: Unable to start web server at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.onRefresh(ServletWebServerApplicationContext.java:164) ~[spring-boot-3.0.1.jar!/:3.0.1] ... Caused by: org.springframework.boot.web.server.WebServerException: Unable to start embedded Tomcat at org.springframework.boot.web.embedded.tomcat.TomcatWebServer.initialize(TomcatWebServer.java:142) ~[spring-boot-3.0.1.jar!/:3.0.1] ... Caused by: java.lang.IllegalStateException: zip file closed at java.base/java.util.zip.ZipFile.ensureOpen(ZipFile.java:831) ~[na:na] at java.base/java.util.zip.ZipFile.getManifestName(ZipFile.java:1057) ~[na:na] at java.base/java.util.zip.ZipFile$1.getManifestName(ZipFile.java:1100) ~[na:na] at java.base/java.util.jar.JarFile.getManEntry(JarFile.java:937) ~[na:na] at java.base/java.util.jar.JarFile.checkForSpecialAttributes(JarFile.java:1000) ~[na:na] at java.base/java.util.jar.JarFile.isMultiRelease(JarFile.java:389) ~[na:na] at org.apache.tomcat.util.scan.JarFileUrlJar.<init>(JarFileUrlJar.java:68) ~[tomcat-embed-core-10.1.4.jar!/:na]
解决方案
验证WAR包完整性
先排除WAR包损坏的可能,重新执行构建命令生成完整的WAR包:gradle clean bootWar构建完成后再次尝试
java -jar oldnewjspapp.war启动。调整Tomcat Jar扫描规则
错误源于Tomcat扫描Jar包时的Zip文件处理异常,可通过配置跳过不必要的Jar扫描:
在application.properties中添加:server.tomcat.jar-scan-skip-patterns=*.jar server.tomcat.additional-tld-skip-patterns=*.jar或者临时通过JVM参数启动:
java -Dserver.tomcat.jar-scan-skip-patterns=*.jar -jar oldnewjspapp.war检查Java版本与Multi-Release Jar兼容性
Spring Boot 3要求Java 17及以上版本,确认运行环境符合要求。若WAR包包含Multi-Release类型Jar,可尝试添加JVM参数兼容:java --enable-preview -jar oldnewjspapp.war(仅当依赖确实需要预览特性时使用,优先排查依赖版本冲突)
修正Spring Boot打包配置
确保build.gradle中WAR打包配置正确,适配JSP应用的资源打包规则:plugins { id 'org.springframework.boot' version '3.0.1' id 'war' } springBoot { mainClass = 'com.yourpackage.YourApplication' // 替换为你的主类路径 } dependencies { providedRuntime 'org.springframework.boot:spring-boot-starter-tomcat' implementation 'javax.servlet:jstl:1.2' implementation 'org.apache.tomcat.embed:tomcat-embed-jasper' }确认
providedRuntime配置正确,避免打包时重复引入Tomcat依赖导致冲突。
内容的提问来源于stack exchange,提问作者Fábio
相关产品推荐
相关产品推荐

