Springboot项目打war包部署到tomcat上,tomcat正常启动,访问报错404

问题描述;Springboot项目打成war包,部署到tomcat上,正常启动(tomcat控制台没有报错!)访问报错404

     //参考了别人的博客,自己做个记录

    1,需要创建一个初始化类,两种方式:

             我的启动类是:DemoTomcatApplication,

             方式一:启动类直接继承:SpringBootServletInitializer,重写方法:configure

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;

@SpringBootApplication
public class DemoApplication  extends SpringBootServletInitializer {
    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
        return builder.sources(DemoApplication.class);
    }

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }


}

                   方式二:重新创建一个配置类实现类,放在启动类同样的位置,sources方法的参数是启动类class

import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;

public class DemoServletApplication extends SpringBootServletInitializer {
    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
        return builder.sources(DemoApplication.class);//注意:参数是启动类.class,不是当前类
    }
}

  2,修改pom文件,排除web启动器中的tomcat,防止和tomcat服务器起冲突

             方式一:直接在依赖spring-boot-starter-web中排除

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <!--  排除Tomcat的干扰用于打war 包   -->
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-tomcat</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

           方式二:修改依赖

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
            <!-- 打成war的时候打开注释,本地开发用内嵌tomcat时加上注释 -->
            <scope>provided</scope>
        </dependency>

       3,jar访问不需要项目名:IP地址:端口号/url路径,war访问需要项目名:IP地址:端口号:项目名/url路径

            http://localhost:8080/demo-0.0.1-SNAPSHOT/test/show  ,我没有修改war包名称为项目名,所以直接用war包名访问。

### 解决Tomcat部署Spring Boot应用时的404错误 当遇到在Tomcat部署Spring Boot应用程序并收到404错误的情况,可以采取以下几个措施来解决问题。 #### 修改`pom.xml` 为了确保Spring Boot不会使用其默认内嵌的Tomcat服务器而是利用外部配置好的Tomcat实例,在项目的`pom.xml`文件中应调整依赖项设置。具体来说,对于`spring-boot-starter-tomcat`这个组件应该将其作用域设为`provided`,表明该库仅用于编译阶段而不在运行期提供[^3]: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> <scope>provided</scope> </dependency> ``` 这样做能够防止打过程中重复引入不必要的资源,并允许Web容器管理自己的Servlet API实现。 #### 更新启动类 为了让Spring Boot应用程序能够在传统的Java EE环境中作为WAR工作,还需要对主程序入口做出相应改动——即让启动类继承自`SpringBootServletInitializer`并且覆盖其中的方法以便正确初始化上下文环境[^4]: ```java @SpringBootApplication public class DemoApplication extends SpringBootServletInitializer { @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { return application.sources(DemoApplication.class); } } ``` 注意这里移除了原有的静态main函数定义,因为当以WAR形式部署至外置Tomcat时并不需要它;不过如果希望保留直接通过命令行执行的能力,则可以选择保持此方法不变。 #### 检查Tomcat与JDK兼容性 另一个可能导致404响应的原因在于所使用的Apache Tomcat版本可能无法很好地支持当前开发工具链中的某些特性或标准。例如,较老版本如6.x系列可能会存在一些局限性,尤其是在搭配现代编程语言特性和框架的情况下。因此建议确认目标Tomcat版本是否匹配正在使用的JDK版本以及Spring Boot的要求[^2]。通常情况下推荐选用最新稳定版的组合以获得更好的性能和支持度。 #### 验证URL路径映射 最后还需仔细核对自己试图访问的具体地址是否确实存在于项目内部路由表里。有时开发者会误以为某个端点已经注册成功但实际上并未如此处理过,从而引发找不到请求资源的现象。可以通过查阅控制器层代码或者借助IDE内置调试功能来进行排查验证。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值