一、demo的结构预览
二、在jar包启动的基础上,需要增加的地方
1)、改成war的maven项目,并且用maven插件忽略web.xml或者像我这样建个空的web.xml
1.1 pom中加 <packaging>war</packaging>
1.2 加空文件。
2)、建立一个类实现SpringBootServletInitializer ,并且覆盖 configure方法,在方法内注入你标记启动的类。
/**
* war包启动! ----就是图1标了红圈的第二个类
*/
public class ApplicationWar extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(Application.class);
}
}
3)、在pom文件中将内置容器变成provided
<!-- 内置容器标记成provided -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
4)、(不是必须)加个tomcat插件或者jetty插件。
<!-- tomcat 启动插件 -->
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<path>/</path>
<uriEncoding>UTF-8</uriEncoding>
<port>8082</port> //我这个端口故意弄成和jar启动不一样
<server>tomcat7</server>
</configuration>
</plugin>
三、效果。
3.1、用maven的tomcat插件启动了个war包端口8082,还用main函数启动内置tomcat,端口8080.
3.2、war包部署到tomcat解压的样子
因为这种war包部署方式其实内部调用的是servlet3.0,所以web.xml直接被吃掉了。
四、其他
提升了下这个demo的版本到1.4,发现日志框架不能用log4j只能用log4j2。
启动原理猜测:
想象下,main函数里面SpringApplication.run()是先启动内置tomcat,再把spring容器建立,并注入servletContext。而用war启动,等于servlet3.0里面只要实现了“某接口”,就会执行这个接口的startup方法,而spring内部就实现了这个接口,再去找你实现的spring的某个接口,最后把你的启动类注入进去,然后调用SpringApplication.run,这个时候就不会注入内置tomcat的servletContext,而是外部的servletContext了。