Springboot打war包部署,以及出现404错误的原因

一、(重要) 与打jar包直接部署不同,需要在启动类上继承SpringBootServletInitializer类,并重写configure方法。
二、排除内置tomcat
三、修改pom.xml的packaging坐标为:war
四、404原因:

大概分为三种: 没运行起来;运行起来报错;路径没输对;

  • 1、项目根本没有运行起来,启动类上没有继承springbootservletinitializer;
  • 2、jdk版本不同 或 使用了tomcat10,导致项目缺少包,运行报错;
  • 3、路径应为war包的文件名(e.g. crud.war 对应 localhost:8080/crud)

详细:
  • 1、排除内置tomcat
<!-- 移除springboot中web模块的tomcat依赖 -->
<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>
<!--上下两种二选一,都可以达到同样的效果 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-tomcat</artifactId>
    <scope>provided</scope><!-- 该依赖会参与编译,测试,运行等周期。相当于compile,但是打包阶段做了exclude操作 -->
</dependency>
  • 2、继承SpringBootServletInitializer,重写configure方法。
>>>>>Before
@SpringBootApplication()
public class LocalserviceApplication {
    
    

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

}
>>>>>Before

变为:

@SpringBootApplication()
>>>>>>new
public class LocalserviceApplication extends SpringBootServletInitializer {
    
    
    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
    
    
        return builder.sources(LocalserviceApplication.class);
    }
<<<<<<new
    public static void main(String[] args) {
    
    
        SpringApplication.run(LocalserviceApplication.class, args);
    }
}
  • 3、添加或修改项目pom文件的packaging坐标
	<groupId>com.myself</groupId>
    <artifactId>spring-boot-web-crud</artifactId>
    <version>0.0.1-SNAPSHOT</version>
>>>>>new
    <packaging>war</packaging>
<<<<<new
	<name>spring-boot-web-crud</name>
    <description>Demo project for Spring Boot</description>
  • 4、最后,将war包拖到webapps目录里面就行了。(url为项目名,即自动解压后的文件夹名)
  • 5、因为默认打包名通常不适合,所以可以在pom文件进行修改 (添加finalName标签)
<build>
	<finalName>crud</finalName> <!--打包名就会变为crud-->
	<plugins>
    	<plugin>
    	....
  • 6、配置文件设置的前缀和端口,会在war包下失效
server:
  port: 8081  <<<<<<该端口会失效,请以tomcat配置的端口为准
  servlet:
    context-path: /prefix   <<<<该前缀在打成war包部署在tomcat后,失效
  • 7、jar包和war包启动区别

    • jar包:执行SpringBootApplication的run方法,启动IOC容器,然后创建嵌入式Servlet容器;
    • war包:先是启动Servlet服务器,服务器启动Springboot应用springBootServletInitizer,然后启动IOC容器;
  • 8、其他问题

    • 由于tomcat 10 的servlet规范等,由JAVA EE 8 变为了Jakarta EE 9;所以最新的tomcat10会出现问题。

    Servlet 5.0 API:Java包已从 javax.servlet 升级至 jakarta.servlet;

    • SpringBoot 1.x内置的tomcat 版本为8;SpringBoot 2.x内置的tomcat 版本为9;所以tomcat 7 及以下,也不推荐尝试(tomcat7大概率会出现问题)

(完)

猜你喜欢

转载自blog.csdn.net/howeres/article/details/109746369
今日推荐