Spring Boot在含空格目录运行时无法找到视图问题
解决Spring Boot嵌入式Tomcat在含空格目录下无法找到JSP的问题
这个问题我维护旧项目时恰好碰到过,核心原因是Spring Boot 1.5.x版本的嵌入式Tomcat(8.5.x系列)在处理带空格的路径时,JSP编译器Jasper没有正确转义空格字符,导致解析Meta-INF/resources下的JSP资源时路径失效。下面给你几个针对性的解决方案,按优先级排序:
方案一:自定义Tomcat容器工厂修复路径编码
这是最直接的代码层面修复,不需要修改部署脚本,适合必须在带空格目录运行的场景:
创建一个配置类,自定义TomcatEmbeddedServletContainerFactory,手动处理资源路径的编码:
import org.apache.catalina.Context; import org.apache.catalina.WebResourceRoot; import org.apache.catalina.webresources.DirResourceSet; import org.apache.catalina.webresources.StandardRoot; import org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainerFactory; import org.springframework.boot.context.embedded.tomcat.TomcatContextCustomizer; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import java.io.File; import java.net.URLEncoder; import java.nio.charset.StandardCharsets; @Configuration public class TomcatCustomConfig { @Bean public TomcatEmbeddedServletContainerFactory tomcatEmbeddedServletContainerFactory() { TomcatEmbeddedServletContainerFactory factory = new TomcatEmbeddedServletContainerFactory(); factory.addContextCustomizers((TomcatContextCustomizer) context -> { // 获取当前jar包所在目录的路径 String jarPath = new File(".").getAbsolutePath(); try { // 对路径中的空格进行URL编码,Windows下空格对应%20而非+ String encodedJarPath = URLEncoder.encode(jarPath, StandardCharsets.UTF_8.name()) .replace("+", "%20"); WebResourceRoot resources = new StandardRoot(context); // 添加Meta-INF/resources的资源路径,使用编码后的路径 resources.addPreResources(new DirResourceSet(resources, "/META-INF/resources", encodedJarPath + "/META-INF/resources", "/")); context.setResources(resources); } catch (Exception e) { e.printStackTrace(); } }); return factory; } }
这段代码的作用是手动构建Tomcat的资源根目录,对含空格的路径编码后再添加资源集,确保Jasper能正确解析路径。
方案二:修改启动脚本,给jar路径加引号
如果不想修改代码,可以在Windows的启动脚本(比如.bat文件)中,给jar包的路径加上双引号:
@echo off java -jar "C:\space example\your-service.jar"
这样Windows命令行就能正确识别带空格的路径,Tomcat启动时可获取到正确的资源路径。如果是双击jar启动,可以右键创建快捷方式,在快捷方式的目标栏里给路径加引号。
方案三:升级Spring Boot版本(可选)
Spring Boot 2.0及以上版本修复了这个嵌入式Tomcat路径编码的问题,如果你的项目可以兼容升级,直接升级到2.0+版本(比如2.1.x)就能解决问题。不过考虑到你使用的是1.5.9,可能存在旧依赖兼容问题,这个方案可作为长期优化方向。
验证步骤
- 将jar包放到
C:\space example目录下 - 用方案一的代码重新打包,或用方案二的脚本启动服务
- 访问JSP页面,确认页面能正常加载
内容的提问来源于stack exchange,提问作者cstack
相关产品推荐
相关产品推荐

