一、打jar包部署
确认pom.xml中是<packaging>jar</packaging>
在pom.xml同级目录下,运行mvn package
命令,在target目录下可查找到jar文件
运行java -jar .xxx.jar
启动tomcat
ps:如果不知道打包后jar的位置,可打印完整的pom文件查看输出位置mvn help:effective-pom > pom.bak
二、打war包部署到tomcat
首先springboot去掉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>
</dependency>
改打包方式为war:<packaging>war</packaging>
因为不是jar无法从main函数开始,同时springboot没有web.xml文件也没法配置,所以依赖servlet特性写一个类继承SpringBootServletInitializer
:
/*修改启动类,继承SpringBootServletInitializer类并重写configure方法 */
public class SpringBootStartApplication extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
//注意这里的参数要指向原先用main方法执行的Application启动类
return builder.sources(SpringbootConfigApplication.class);
}
}
注释中写到,如果SpringBootServletInitializer 专为部署war而用,如果不是war没必要使用这个类。
原理:
请看:
public class SpringServletContainerInitializer implements ServletContainerInitializer
ServletContainerInitializer实现类
可以通过SPI机制spring-web-5.2.6.RELEASE.jar!\META-INF\services\javax.servlet.ServletContainerInitializer
被servlet容器执行。
SpringServletContainerInitializer就是ServletContainerInitializer实现类
,它实现了加载所有WebApplicationInitializer实现类
:
@Override
public void onStartup(@Nullable Set<Class<?>> webAppInitializerClasses, ServletContext servletContext)
throws ServletException {
List<WebApplicationInitializer> initializers = new LinkedList<>();
if (webAppInitializerClasses != null) {
for (Class<?> waiClass : webAppInitializerClasses) {
// Be defensive: Some servlet containers provide us with invalid classes,
// no matter what @HandlesTypes says...
if (!waiClass.isInterface() && !Modifier.isAbstract(waiClass.getModifiers()) &&
WebApplicationInitializer.class.isAssignableFrom(waiClass)) {
try {
initializers.add((WebApplicationInitializer)
ReflectionUtils.accessibleConstructor(waiClass).newInstance());
}
catch (Throwable ex) {
throw new ServletException("Failed to instantiate WebApplicationInitializer class", ex);
}
}
}
}
}
所以只要继承SpringBootServletInitializer,而SpringBootServletInitializer 是WebApplicationInitializer的实现类,环环相扣就执行到了.