外面安装tomcat,项目打包为war,嵌入式tomcat指定为provide
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provide</scope>
</dependency>
新建 SpringBootServletInitializer 子类
public class MyServletInitializer extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
return builder.sources(StartApplication.class);
}
}
启动tomcat服务器
启动报错 查看tomcat版本,tomcat使用的jdk版本
查看tomcat jdk版本:
bin目录下 命令version
查看版本
修改tomcat jdk版本:
windows
找到bin下的setclasspath.bat文件;在文件的开始出添加如下代码来设定JAVA_HOME和JRE_HOME的路径:
set JAVA_HOME=C:\Program Files\Java\jdk1.8.0_181
linux
在bin下找到setclasspath.sh,在文件的最开始加入如下代码:
set JAVA_HOME=C:\Program Files\Java\jdk1.8.0_181
修改了setclasspath文件之后,tomcat在启动时便使用设定的JDK。启动tomcat可以通过运行bin下的startup.bat,startup.bat会调用catalina.bat文件,而catalina.bat会调用setclasspath.bat文件来获取JAVA_HOME和JRE_HOME这两个环境变量的值,因此若要在tomcat启动时指向特定的JDK,则需在setclasspath.bat文件的开头处加上JAVA_HOME和JRE_HOME。
原理:
jar包方式运行:执行springboot主类的main方法,启动ioc容器,创建嵌入式的servlet容器
war包方式:启动服务器,服务器启动springboot容器,启动ioc容器
- servlet3.0标准ServletContainerInitializer扫描jar包中META-INF/services/ServletContainerInitializer文件指定的类并加载
- 加载spring web包下的SpringServletContainerInitializer
- 扫描@HandleTypes(WebApplicationInitializer)注解
- 加载SpringBootServletInitializer 并运行onStartup方法
- 加载@SpringBootApplication主类,启动容器等
servlet3.0中 服务器web应用启动,会创建当前web应用里面每一个jar包里面的ServletContainerInitializer 实例,
ServletContainerInitializer 的实现放在jar包的META-INF/services文件夹下,有一个名为javax.servlet.ServletContainerInitializer 的文件,内容就是ServletContainerInitializer 实现类的全类名
我们还可以使用@HandleTypes注解,在应用启动的时候,加载我们感兴趣的类
流程:
-
启动tomcat
-
查找jar包下的SpringBootServletInitializer 实例,先找到jar包下的META-INF/services文件夹
在spring的web模块org.springframework.web下有这个文件javax.servlet.ServletContainerInitializer
web包下 META-INF\services\javax.servlet.ServletContainerInitializer中指定的SpringServletContainerInitializer类:@HandlesTypes({ WebApplicationInitializer.class}) public class SpringServletContainerInitializer implements ServletContainerInitializer { public SpringServletContainerInitializer() { } public void onStartup(@Nullable Set<Class<?>> webAppInitializerClasses, ServletContext servletContext) throws ServletException { List<WebApplicationInitializer> initializers = new LinkedList(); Iterator var4; if(webAppInitializerClasses != null) { var4 = webAppInitializerClasses.iterator(); while(var4.hasNext()) { Class<?> waiClass = (Class)var4