打包
大约 1 分钟Spring全家桶SpringBoot精讲细讲
jar包
SpringBoot默认的打包方式。
在IDEA中,点击package即可在项目编译之后的target目录下生成jar文件。

jar -jar jar包名称 参数
即可运行jar包。
war包
porm文件修改
<packaging>war</packaging>
<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>
</dependency>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>3.1.0</version>
<configuration>
<failOnMissingWebXml>false</failOnMissingWebXml>
</configuration>
</plugin>
</plugins>
</build>
scope取值 | 有效范围(compile, runtime, test) | 依赖传递 | 例子 |
---|---|---|---|
compile | all | 是 | spring-core |
provided | compile, test | 否 | servlet-api |
runtime | runtime, test | 是 | JDBC驱动 |
test | test | 否 | JUnit |
system | compile, test | 是 |
main方法
如果以war包的方式打包,SpringBoot的main方法就没用了。这时候程序的入口就是Tomcat
。这时候我们必须要写一个类注入到容器中,这个类要把SpringBoot的主启动类传入
。
@Component
public class ServletInitializer extends SpringBootServletInitializer {
/**
* Springboot01Application 主启动类 Springboot
*/
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
return builder.sources(Springboot01Application.class);
}
}
这时候就是由Tomcat加载ApplicationContext。SpringBootServletInitializer就相当于之前的web.xml文件。
在IDEA中直接打包

Tomcat启动干了什么
https://www.bilibili.com/video/BV1JU4y1p75q?p=19
- ServletContainerInitializer接口的实现类
- file META-INF/services/javax.servlet.ServletContainerInitializer (spi机制)。调用onStartup方法。

- servletContext 配置过滤器、servlet、filter、listener