記一次springboot用外部tomcat部署踩的坑

springboot打war包配置外部tomcat

pom.xml中的配置

  1. 添加<packaging>war</packaging>
  2. 排除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>
  1. 添加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中啟動了,但是在配置過程中,我依然遇到了幾個問題

問題

  1. 無法使用ServletContextListener,該監(jiān)聽器可以監(jiān)聽Context也就是容器的創(chuàng)建和銷毀,在springboot中使用是沒有問題的,但是在外部tomcat中會報錯,原因暫不明確,如果要監(jiān)聽容器創(chuàng)建,可以繼承ApplicationRunner,并重寫run方法。如果想在容器銷毀時做一些事兒,暫時沒找到好的辦法。
  2. Filter相關(guān)
    • springboot的Filter和外部Tomcat的Filter是有區(qū)別的,springboot的Filter的init()和destroy()方法都是default的,但是外部tomcat的這兩個方法都是抽象的,如果不重寫會報錯。
    • springboot的啟動順序和外部tomcat不一樣,外部tomcat的Filter會在Spring容器之前初始化,也就是Filter中的@Autowire和@Value等注入屬性都是null,會報錯,解決方法是,設(shè)置成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;
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容