当前位置: 首页 > news >正文

springboot用jar启动能访问,但是打成war,部署到tomcat却访问不到 - 详解

这个问题很常见,通常是由于Spring Boot应用在打包为WAR并部署到外部Tomcat时,配置或代码需要做一些特定的调整导致的。以下是详细的排查步骤和解决方案:

核心原因排查点

​spring boot 配置java版本不能高于tomcat运行java版本:​

<properties>
<java.version>17</java.version>
</properties>

  1. 启动类未正确配置:​

    • 问题:​​ 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应用。

  2. pom.xml打包配置不正确:​

    • 问题:​​ 打包类型未设置为war,或者内嵌容器依赖未正确排除/标记为provided

    • 解决:​

      • <packaging>标签设置为war

        war
      • 排除内嵌Tomcat依赖并将其标记为provided:​

        org.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
  3. 上下文路径(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.outlocalhost.yyyy-mm-dd.log),里面会明确记录应用部署的上下文路径。

        • 访问http://localhost:8080/manager/html(需要配置Tomcat用户权限)查看已部署应用列表及其上下文路径。

      • 配置应用上下文路径:​

        • application.propertiesapplication.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应用部署时指定上下文路径。

  4. 资源加载问题:​

    • 问题:​​ WAR包结构(包含WEB-INF目录)可能与JAR包结构不同,导致静态资源、模板文件或类路径资源加载失败。

    • 解决:​

      • 静态资源:​​ 确保放在src/main/webapp目录下(这是WAR的标准静态资源目录)。Spring Boot默认也会从classpath:/static,classpath:/public等加载,但在WAR中相对路径可能不同。

      • 模板文件(Thymeleaf, Freemarker等):​​ 通常放在src/main/resources/templates下,一般问题不大,但检查模板引擎配置中是否有硬编码的绝对路径。

      • 检查日志:​​ 查看是否有FileNotFoundException或类似资源加载错误。

  5. 部署或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版本兼容。

排查步骤总结
  1. 检查启动类:​​ 确认主类继承SpringBootServletInitializer并重写configure方法。

  2. 检查pom.xml:​

    • <packaging>war</packaging>

    • 排除spring-boot-starter-tomcat并添加provided范围的依赖。

    • 确保使用了spring-boot-maven-plugin

  3. 检查上下文路径:​

    • 查看Tomcat日志确定实际部署路径。

    • 尝试访问http://localhost:8080/your-war-name/(用你的WAR文件名替换your-war-name)。

    • application.properties中设置server.servlet.context-path

  4. 检查Tomcat日志:​​ 这是最重要的!仔细阅读catalina.outlocalhost.yyyy-mm-dd.log文件,查找部署过程、启动过程以及访问时的错误信息(如SEVEREERROR级别的日志)。日志通常会明确指出问题所在(如类找不到、Bean初始化失败、资源找不到、Servlet映射问题等)。

  5. 检查资源路径:​​ 如果应用部分加载但资源(图片、CSS、JS)或API端点404,重点检查上下文路径和资源位置。

  6. 清理并重新部署:​​ 停止Tomcat,删除webappswork目录下的相关应用目录,重新部署WAR文件,再启动Tomcat。

关键点回顾
  • 启动类必须继承SpringBootServletInitializer。​

  • pom.xml必须正确配置为war打包并处理内嵌Tomcat依赖(标记为provided)。​

  • 外部Tomcat部署后应用会有上下文路径(Context Path),不再是根路径/。​

  • Tomcat日志 (catalina.out,localhost_*.log) 是诊断问题的黄金标准,务必仔细查看!​

按照这些步骤逐一排查,基本能解决Spring Boot WAR包部署到Tomcat后无法访问的问题。

http://www.gsyq.cn/news/1486126.html

相关文章:

  • 红桥区2026年黄金回收白银回收铂金回收 5 家高性价比门店实地测评盘点 - 三大殿
  • 2026 昆山厨卫屋面地下室漏水测评,苏易修缮五星高分稳居榜首 - 苏易修缮
  • 2026上海品牌首饰回收性价比测评!哪家变现最划算? - 薛定谔的梨花猫
  • 贵阳市2026年黄金回收白银回收铂金回收 5 家高性价比门店实地测评盘点 - 干豆腐啊
  • Windows HEIC 缩略图生成器:让iPhone照片在Windows资源管理器中原生预览
  • 葫芦岛市2026年黄金回收白银回收铂金回收 5 家高性价比门店实地测评盘点 - 三大殿
  • 红桥区2026年本地黄金回收铂金白银回收哪家强?TOP5 正规门店榜单 +联系方式 - 三大殿
  • 【分享】6.2 简历不是自传,是“匹配度证明“——这一字之差改变一切
  • 5分钟实战抖音无水印下载:douyin-downloader完全解密
  • 蓟州区2026年黄金回收白银回收铂金回收 5 家高性价比门店实地测评盘点 - 三大殿
  • 华三路由器端口映射配置避坑指南:从拓扑规划到安全加固的全流程解析
  • 网盘直链下载助手终极指南:免费解锁8大网盘全速下载
  • 荆门市2026年黄金回收白银回收铂金回收 5 家高性价比门店实地测评盘点 - 三大殿
  • 3个终极技巧:彻底解决Minecraft启动器内存不足问题
  • 珠海黄金回收正规门店盘点 - 余生黄金回收
  • 保姆级教程:用H3C路由器把内网服务器“搬到”公网,远程SSH登录不求人
  • 广州亿源贸易商行:番禺诚信的红酒回收找哪家 - LYL仔仔
  • UABEA:面向现代Unity版本的跨平台资源编辑框架深度解析
  • 从零搭建企业监控:手把手教你用Zabbix 5.0 + MariaDB + Nginx部署监控系统
  • 不只是电压测量:用ADS1115和树莓派DIY一个高精度环境监测站(Python代码分享)
  • 荆州市2026年黄金回收白银回收铂金回收 5 家高性价比门店实地测评盘点 - 三大殿
  • 荆门市2026年本地黄金回收铂金白银回收哪家强?TOP5 正规门店榜单 +联系方式 - 三大殿
  • Hadoop 3.x 实战:手把手教你配置HDFS透明加密与KMS(附常见报错排查)
  • 天津高端全屋定制厂家选购指南:如何选对靠谱高端定制服务商 - 速递信息
  • 聊城市2026年黄金回收白银回收铂金回收 5 家高性价比门店实地测评盘点 - 三大殿
  • 前端开发必看:一招解决图片403防盗链问题,用HTML meta标签轻松搞定
  • 数据科学家必学的Docker容器化实战:从环境隔离到GPU训练部署
  • 无锡市三菱电机空调维修师傅电话|各区金牌师傅,靠谱选欧米到家 - 欧米到家
  • 聊城市2026年本地黄金回收铂金白银回收哪家强?TOP5 正规门店榜单 +联系方式 - 三大殿
  • 远程服务器无图形界面?手把手教你用命令行在CentOS上静默安装Matlab 2019b