springboot打war包配置外部tomcat
pom.xml中的配置
- 添加
<packaging>war</packaging>
- 排除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>
- 添加servlet-api依赖
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
启动类配置
继承SpringBootServletInitializer并重写configure方法
public class ImageStorageApplication extends SpringBootServletInitializer {
public static void main(String[] args) {
SpringApplication.run(ImageStorageApplication.class, args);
}
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
return builder.sources(ImageStorageApplication.class);
}
}
完成上述配置就可以打war包在外部tomcat中启动了,但是在配置过程中,我依然遇到了几个问题
问题
- 无法使用ServletContextListener,该监听器可以监听Context也就是容器的创建和销毁,在springboot中使用是没有问题的,但是在外部tomcat中会报错,原因暂不明确,如果要监听容器创建,可以继承
ApplicationRunner
,并重写run方法。如果想在容器销毁时做一些事儿,暂时没找到好的办法。 - Filter相关
- springboot的Filter和外部Tomcat的Filter是有区别的,springboot的Filter的init()和destroy()方法都是default的,但是外部tomcat的这两个方法都是抽象的,如果不重写会报错。
- springboot的启动顺序和外部tomcat不一样,外部tomcat的Filter会在Spring容器之前初始化,也就是Filter中的@Autowire和@Value等注入属性都是null,会报错,解决方法是,设置成static,然后再赋值:
修改
@Value("${server.servlet.context-path}")
private String contentPath;
为:
private static String contentPath;
@Value("${server.servlet.context-path}")
public void setContentPath(String contentPath) {
LoginFilter.contentPath = contentPath;
}
网友评论