一、(重要) 与打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容器;
- jar包:执行
-
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大概率会出现问题)
(完)