springboot打包成war,部署到tomcat,访问404

本文介绍如何将Spring Boot项目打成WAR包并部署到Tomcat服务器上,包括配置pom.xml文件去除内嵌Tomcat依赖,调整打包类型为WAR,修改启动类继承SpringBootServletInitializer,并提供解决部署后404错误的方法。

一、打成war包发布到tomcat(这步已经完成,自行跳过)

1. pom.xml

去掉内嵌tomcat

`
     <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-tomcat</artifactId>
        <scope>provided</scope><!-- 打成war的时候打开注释,本地开发用内嵌tomcat时加上注释 -->
    </dependency>
`
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

打成war

`
    <packaging>war</packaging>
`
  • 1
  • 2
  • 3
  • 4

2. 启动类

`
    @SpringBootApplication
    @ComponentScan(basePackages = "com.yzker")
    public class Application extends SpringBootServletInitializer {

        @Override
        protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
            return application.sources(Application.class);
        }

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


    }

`
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

mvn clean package 将war包放到tomcat下试试吧,如果报404,参考下面 
访问地址:localhost:{tomcat端口号} /重命名的war包名/xxxx


二、404解决办法

原因后续补充

1. pom.xml

`
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-legacy</artifactId>
        <version>1.1.0.RELEASE</version>
    </dependency>
`
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

2. 修改web.xml

复制下面的代码,修改com.yzker.test.application.Application为你自己的启动类

`
    <?xml version="1.0" encoding="UTF-8"?>
    <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">

      <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>com.yzker.test.application.Application</param-value>
      </context-param>

      <listener>
        <listener-class>org.springframework.boot.legacy.context.web.SpringBootContextLoaderListener</listener-class>
      </listener>

      <!--
          <filter>
              <filter-name>metricFilter</filter-name>
              <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
          </filter>

          <filter-mapping>
              <filter-name>metricFilter</filter-name>
              <url-pattern>/*</url-pattern>
          </filter-mapping>
      -->

      <servlet>
        <servlet-name>appServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
          <param-name>contextAttribute</param-name>
          <param-value>org.springframework.web.context.WebApplicationContext.ROOT</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
      </servlet>

      <servlet-mapping>
        <servlet-name>appServlet</servlet-name>
        <url-pattern>/</url-pattern>
      </servlet-mapping>

</web-app>
`
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45

3. 到此为止,404的问题解决,如果还有问题,请评论,我们共同解决记录

mvn clean package 
将target目录下生成war包放到tomcat里吧 
访问地址:localhost:{tomcat端口号} /重命名的war包名/xxxx

<think>好的,我现在需要解决用户的问题:将Spring Boot应用打包WAR文件部署Tomcat时出现404错误。用户已经提供了一些引用资料,我需要结合这些信息来分析可能的原因并提供解决方案。 首先,用户的问题可能涉及多个方面。根据引用[1][^1],常规步骤括排除Tomcat依赖、添加Servlet依赖、设置打包方式为WAR,以及启动类继承SpringBootServletInitializer并覆盖configure方法。用户可能已经按照这些步骤操作,但仍然遇到404错误,说明某些配置可能存在问题。 接下来,我需要检查可能的错误点。引用[4][^4]提到,必须排除内嵌Tomcat并添加Servlet API依赖。如果依赖配置不正确,比如没有正确排除Tomcat或未正确设置作用域,可能导致冲突。例如,在pom.xml中,应该将内嵌Tomcat的依赖设置为provided,如引用[2][^2]所示,这样打包时不会含内嵌Tomcat,避免冲突。 另外,启动类是否正确继承SpringBootServletInitializer并覆盖configure方法?如果启动类没有正确配置,应用可能无法正确初始化,导致Tomcat无法识别,从而返回404。例如,启动类需要像这样: ```java public class Application extends SpringBootServletInitializer { @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { return application.sources(Application.class); } } ``` 如果没有正确覆盖configure方法,部署时可能会出问题。 另外,项目结构是否正确?Spring Boot的静态资源和模板通常放在src/main/resources/static或src/main/resources/templates目录下。如果应用被打包WAR后,这些资源没有正确含,或者路径配置错误,也会导致404。需要检查生WAR文件结构,确认资源文件是否被正确打包。 还有上下文路径的问题。外部Tomcat部署时,默认会使用WAR文件名作为上下文路径。例如,如果应用打包为myapp.war访问路径应为http://localhost:8080/myapp/。如果应用预期使用根路径,可能需要配置Tomcat的ROOT上下文,或者调整应用的server.servlet.context-path属性。 此外,日志信息是关键。查看Tomcat的catalina.out或本地日志文件,看是否有应用启动时的错误信息。例如,启动时是否有异常导致应用未能正确部署,或者是否识别到了Spring Boot的入口类。 还有可能,项目中的web.xml或webapp目录缺失。虽然Spring Boot通常不需要web.xml,但某些情况下可能需要配置。或者,如果使用JSP,需要确保有正确的目录结构,比如src/main/webapp/WEB-INF。 总结下来,可能的解决方案步骤括: 1. 检查依赖配置是否正确排除内嵌Tomcat并添加Servlet API。 2. 确认启动类正确继承和覆盖configure方法。 3. 检查项目结构,确保资源文件正确打包。 4. 确认访问路径是否正确含上下文。 5. 查看Tomcat日志,定位启动错误。 6. 检查web.xml或目录结构是否符合要求。 现在需要将这些步骤整理清晰的解决方案,确保用户能逐步排查问题。同时,注意使用中文,结构清晰,并引用提供的资料。</think>### Spring Boot WAR部署Tomcat出现404的解决方案 #### 1. 检查依赖配置 在$pom.xml$中必须**排除内嵌Tomcat依赖**,并将Servlet API依赖的作用域设置为$provided$,确保打包时不含冲突的库: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> </exclusion> </exclusions> </dependency> <!-- 添加Servlet API --> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <scope>provided</scope> </dependency> ``` 若使用引用[2][^2]的配置,可简化为: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> <scope>provided</scope> </dependency> ``` #### 2. 确认启动类配置 启动类需继承$SpringBootServletInitializer$并重写$configure$方法: ```java @SpringBootApplication public class Application extends SpringBootServletInitializer { @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) { return builder.sources(Application.class); // 指定主启动类 } public static void main(String[] args) { SpringApplication.run(Application.class, args); } } ``` 若未覆盖此方法,Tomcat无法识别Spring Boot入口[^4]。 #### 3. 检查打包后的文件结构 通过解压WAR验证资源路径: ``` myapp.war ├── WEB-INF │ ├── classes (编译后的代码和配置文件) │ ├── lib (第三方依赖) │ └── web.xml (可选) ├── META-INF └── 静态资源目录(如static/) ``` 若$static/$或$templates/$目录缺失,需检查$src/main/resources$是否含这些目录。 #### 4. 调整上下文路径 - **默认路径**:Tomcat会以WAR文件名作为上下文路径,例如$myapp.war$对应访问路径为$http://localhost:8080/myapp/$。 - **修改路径**:在$application.properties$中添加: ```properties server.servlet.context-path=/myapp ``` 或通过重命名WAR文件为$ROOT.war$直接使用根路径。 #### 5. 查看Tomcat日志定位错误 检查$tomcat/logs/catalina.out$中的启动日志: - 若出现$No SpringApplication sources have been defined$,说明启动类未正确配置[^4]。 - 若提示$Failed to start component [StandardEngine[Catalina].StandardHost[localhost]]$,可能是依赖冲突导致。 #### 6. 补充Web配置(可选) - **添加web.xml**:在$src/main/webapp/WEB-INF$目录下创建$web.xml$(仅需基础配置): ```xml <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" version="3.1"> <display-name>myapp</display-name> </web-app> ``` - **JSP支持**:若使用JSP,需添加以下依赖并确保文件位于$src/main/webapp/WEB-INF/views/$: ```xml <dependency> <groupId>org.apache.tomcat.embed</groupId> <artifactId>tomcat-embed-jasper</artifactId> <scope>provided</scope> </dependency> ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值