
这个问题很常见通常是由于Spring Boot应用在打包为WAR并部署到外部Tomcat时配置或代码需要做一些特定的调整导致的。以下是详细的排查步骤和解决方案核心原因排查点spring boot 配置java版本不能高于tomcat运行java版本propertiesjava.version17/java.version/properties启动类未正确配置问题 Spring Boot默认使用内嵌Tomcat启动JAR方式。当部署到外部Tomcat时需要修改启动类。解决 确保你的主应用类带SpringBootApplication的类继承SpringBootServletInitializer并重写configure方法。示例代码SpringBootApplication public class YourApplication extends SpringBootServletInitializer { Override protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { return application.sources(YourApplication.class); } public static void main(String[] args) { SpringApplication.run(YourApplication.class, args); } }作用 这个方法告诉外部Tomcat如何启动你的Spring Boot应用。pom.xml打包配置不正确问题 打包类型未设置为war或者内嵌容器依赖未正确排除/标记为provided。解决将packaging标签设置为warwar排除内嵌Tomcat依赖并将其标记为providedorg.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-starter-tomcat org.springframework.boot spring-boot-starter-tomcat provided使用Spring Boot的War插件可选但推荐org.springframework.boot spring-boot-maven-plugin上下文路径Context Path问题问题 在外部Tomcat中你的应用会有一个上下文路径Context Path不再是JAR运行时的根路径/。现象 你可能在尝试访问http://localhost:8080/但实际上应用部署在http://localhost:8080/your-war-name/。解决检查部署路径查看Tomcat的webapps目录。你的应用通常部署在webapps/your-war-name目录your-war-name是你的WAR文件名不包含.war后缀。查看Tomcat启动日志catalina.out或localhost.yyyy-mm-dd.log里面会明确记录应用部署的上下文路径。访问http://localhost:8080/manager/html需要配置Tomcat用户权限查看已部署应用列表及其上下文路径。配置应用上下文路径在application.properties或application.yml中设置server.servlet.context-path/myapp # 设置你想要的上下文路径或者在部署时指定将WAR文件重命名为ROOT.war部署到根上下文访问http://localhost:8080/。在Tomcat的conf/server.xml中配置Context元素不推荐影响可移植性。在conf/Catalina/localhost/目录下创建一个your-war-name.xml文件文件名决定上下文路径内容为使用Tomcat Manager应用部署时指定上下文路径。资源加载问题问题 WAR包结构包含WEB-INF目录可能与JAR包结构不同导致静态资源、模板文件或类路径资源加载失败。解决静态资源 确保放在src/main/webapp目录下这是WAR的标准静态资源目录。Spring Boot默认也会从classpath:/static,classpath:/public等加载但在WAR中相对路径可能不同。模板文件Thymeleaf, Freemarker等 通常放在src/main/resources/templates下一般问题不大但检查模板引擎配置中是否有硬编码的绝对路径。检查日志 查看是否有FileNotFoundException或类似资源加载错误。部署或Tomcat配置问题问题 WAR包未正确部署Tomcat配置有冲突端口占用等。解决确认部署成功 检查Tomcat日志确保应用已成功部署且没有启动错误。查找类似INFO: Deployment of web application archive [/path/to/war] has finished in [ms]的消息。清理工作目录 停止Tomcat删除webapps目录下你的应用目录如your-war-name和work/Catalina/localhost/your-war-name目录然后重新启动Tomcat。检查端口冲突 确保Tomcat配置的端口默认8080没有被其他进程占用。检查Tomcat版本 确保你使用的Tomcat版本与Spring Boot兼容一般Spring Boot文档会说明支持的版本。检查JDK版本 确保构建WAR的JDK版本与运行Tomcat的JDK版本兼容。排查步骤总结检查启动类 确认主类继承SpringBootServletInitializer并重写configure方法。检查pom.xmlpackagingwar/packaging排除spring-boot-starter-tomcat并添加provided范围的依赖。确保使用了spring-boot-maven-plugin。检查上下文路径查看Tomcat日志确定实际部署路径。尝试访问http://localhost:8080/your-war-name/用你的WAR文件名替换your-war-name。在application.properties中设置server.servlet.context-path。检查Tomcat日志 这是最重要的仔细阅读catalina.out和localhost.yyyy-mm-dd.log文件查找部署过程、启动过程以及访问时的错误信息如SEVERE或ERROR级别的日志。日志通常会明确指出问题所在如类找不到、Bean初始化失败、资源找不到、Servlet映射问题等。检查资源路径 如果应用部分加载但资源图片、CSS、JS或API端点404重点检查上下文路径和资源位置。清理并重新部署 停止Tomcat删除webapps和work目录下的相关应用目录重新部署WAR文件再启动Tomcat。关键点回顾启动类必须继承SpringBootServletInitializer。pom.xml必须正确配置为war打包并处理内嵌Tomcat依赖标记为provided。外部Tomcat部署后应用会有上下文路径Context Path不再是根路径/。Tomcat日志 (catalina.out,localhost_*.log) 是诊断问题的黄金标准务必仔细查看按照这些步骤逐一排查基本能解决Spring Boot WAR包部署到Tomcat后无法访问的问题。