Spring Boot 3.0正式版WAR包独立启动失败问题求助
解决方案
1. 调整Tomcat嵌入Jasper依赖的打包配置
Spring Boot 3.0正式版后,Tomcat嵌入JSP的类加载逻辑有变动,命令行运行WAR包时易出现zip文件提前关闭的异常。可通过修改构建配置,确保JSP相关依赖和资源被正确处理:
Maven配置
<dependency> <groupId>org.apache.tomcat.embed</groupId> <artifactId>tomcat-embed-jasper</artifactId> <scope>provided</scope> </dependency> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <war> <packagingExcludes>WEB-INF/lib/tomcat-embed-*.jar</packagingExcludes> </war> <excludes> <exclude> <groupId>org.apache.tomcat.embed</groupId> <artifactId>tomcat-embed-jasper</artifactId> </exclude> </excludes> </configuration> </plugin> </plugins> </build>
Gradle配置
dependencies { providedRuntime 'org.apache.tomcat.embed:tomcat-embed-jasper' } springBoot { mainClass = 'com.yourpackage.YourApplication' } war { exclude 'WEB-INF/lib/tomcat-embed-*.jar' }
2. 自定义Tomcat资源加载逻辑
在启动类所在包添加Tomcat配置类,强制修改资源加载方式,避免zip文件被提前关闭:
import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory; import org.springframework.boot.web.server.WebServerFactoryCustomizer; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class TomcatConfig { @Bean public WebServerFactoryCustomizer<TomcatServletWebServerFactory> tomcatCustomizer() { return factory -> { factory.addContextCustomizers(context -> { context.setResourceCache(null); context.setWorkDir(System.getProperty("java.io.tmpdir") + "/tomcat-jsp-work"); }); }; } }
3. 升级Tomcat嵌入版本
Spring Boot 3.0默认的Tomcat嵌入版本可能存在JSP类加载的bug,手动指定兼容的更高版本:
Maven配置
<properties> <tomcat.version>10.1.8</tomcat.version> </properties>
Gradle配置
ext['tomcat.version'] = '10.1.8'
4. 换用手动解压WAR包启动
避免直接用java -jar运行WAR包,改为先解压再启动,模拟Eclipse的运行环境:
# 解压WAR包到指定目录 unzip your-project.war -d project-unpacked # 进入解压目录启动项目 cd project-unpacked java -cp WEB-INF/lib/*:WEB-INF/classes com.yourpackage.YourApplication
内容的提问来源于stack exchange,提问作者perrirrep
相关产品推荐
相关产品推荐

