Spring Boot(JSP)部署AppEngine遇403/404错误及目录警告求助
我来帮你拆解并解决这些问题——核心矛盾是工作目录与Web应用根目录不一致导致的资源访问失败,再加上Spring Boot和App Engine Jetty容器的适配问题,咱们一步步来:
1. 先搞定GCLOUD的目录不一致警告
这个警告是关键信号:App Engine不管是本地调试还是生产环境,只会认target/ysuria-0.0.1-SNAPSHOT下的打包后文件,根本不会访问你本地的工作目录E:\Eclipse Projects\ysuria。如果你的JSP、静态资源没正确打包到target目录,自然会出现404;要是权限配置不对,就会触发403。
解决步骤:
- 先确认你的Maven项目是WAR打包类型,在pom.xml里设置:
因为App Engine依赖WAR包的目录结构来识别Web资源,Spring Boot默认的Jar打包不适合这里。<packaging>war</packaging> - 配置
maven-war-plugin,确保src/main/webapp下的JSP、静态资源能被正确复制到target的WAR包中:<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-war-plugin</artifactId> <version>3.3.2</version> <configuration> <warSourceDirectory>src/main/webapp</warSourceDirectory> <failOnMissingWebXml>false</failOnMissingWebXml> <!-- Spring Boot不需要传统web.xml --> </configuration> </plugin> - 先执行
mvn clean package完成打包,检查target/ysuria-0.0.1-SNAPSHOT/WEB-INF下是否有jsp目录和对应的文件,再运行mvn appengine:run。
2. 修复Spring Boot JSP的路径配置
Spring Boot的JSP视图解析需要适配Jetty容器,在application.properties(或application.yml)里添加以下配置:
# JSP视图解析规则 spring.mvc.view.prefix=/WEB-INF/jsp/ spring.mvc.view.suffix=.jsp # 临时禁用Spring Security(如果没配置权限规则,它会默认拦截所有请求导致403) spring.security.enabled=false
同时,你的JSP文件必须放在src/main/webapp/WEB-INF/jsp/目录下,这样打包后会出现在target/ysuria-0.0.1-SNAPSHOT/WEB-INF/jsp/,Jetty才能正确找到这些文件。
3. 检查App Engine的路由配置(可选但推荐)
如果你的项目里有src/main/appengine/app.yaml,确保路由规则正确,避免资源被错误拦截:
runtime: java11 # 替换成你使用的Java版本 instance_class: F1 handlers: # 处理静态资源(比如css、js) - url: /static static_dir: static # 把所有动态请求交给Spring Boot的DispatcherServlet处理 - url: /.* script: auto
如果没有这个文件,App Engine会用默认配置,但手动配置能避免很多莫名其妙的路由问题。
4. 验证启动流程
按这个顺序操作,确保每一步都没问题:
- 执行
mvn clean清理旧的target文件 - 执行
mvn package完成打包,确认target目录下的WAR结构完整 - (可选)切换到
target/ysuria-0.0.1-SNAPSHOT目录,执行mvn -f ../pom.xml appengine:run——彻底消除目录不一致的警告
至于Jetty的日志,jetty-9.3.18.v20170406是正常的启动信息,那个截断的WARN大概率是因为上下文初始化时找不到资源,解决上面的问题后应该会自动消失。
内容的提问来源于stack exchange,提问作者Trần NguyễnThanh NhưÝ

