SpringBoot项目从内置tomcat启动切换到外部tomcat部署

Outshine 2019-06-14 | 阅读 3566

SpringBoot项目从内置tomcat启动切换到外部tomcat部署

1、修改启动类,并重写初始化方法,继承SpringBootServletInitializer

我们平常用main方法启动的方式,都有一个App的启动类,代码如下:

@SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } } 外部容器部署的话,就不能依赖于Application的main函数了,而是要以类似于web.xml文件配置的方式来启动Spring应用上下文,此时我们需要在启动类中继承SpringBootServletInitializer并实现configure方法: 我们需要类似于web.xml的配置方式来启动spring上下文了,在Application类的同级添加一个SpringBootStartApplication类,其代码如下:

/**

  • 修改启动类,继承 SpringBootServletInitializer 并重写 configure 方法 */ public class SpringBootStartApplication extends SpringBootServletInitializer {

    @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) { // 注意这里要指向原先用main方法执行的Application启动类 return builder.sources(Application.class); } }

2、修改pom.xml里tomcat相关的配置 如果要将打包形式改为war的话,需要对pom.xml文件进行修改,因为spring-boot-starter-web中包含内嵌的tomcat容器,所以直接部署在外部容器会冲突报错。下面提供两种解决方法如下: 在pom.xml文件添加 org.springframework.boot spring-boot-starter-web

Reimport移除对嵌入式Tomcat的依赖,这样打出的war包中,在lib目录下才不会包含Tomcat相关的jar包,否则将会出现启动错误。

因为SpringBootServletInitializer需要依赖 javax.servlet,而tomcat-embed-jasper下面的tomcat-embed-core中就有这个javax.servlet,如果没用provided,最终打好的war里面会有servlet-api这个jar,这样就会跟tomcat本身的冲突了。这种方式的好处是,打包的war包同时适合java -jar命令启动以及部署到外部容器中。