Spring Boot —— Thymeleaf + Gradle run on Tomcat(war形式)

執筆記憶的空白發表於2016-12-08

Spring Boot 以Jar的方式部署啟動,這個不用介紹了, 之前也介紹了關於 Spring Boot + thymeleaf 的簡單使用 ,但是今天遇到一個問題, 我先描述下問題的場景:

由於運維部門的需求,專案需要以war的形式放到tomcat執行  ,而不是原定的jar的方式執行

配置了一下午,也查了一下午的資料,以war的方式在Tomcat能執行,並且能訪問Controller,但是在返回html檢視時,找不到檢視模板。最終發現問題在Thymeleaf的配置,話不多說,具體看操作步驟:


1、Spring boot 容器配置需要繼承 SpringBootServletInitializer 

這裡我繼承的是web.suport下面的SpringBootServletInitializer。

@SpringBootApplication
public class Application extends SpringBootServletInitializer {

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(Application.class);
    }

    public static void main(String[] args) throws Exception {
        SpringApplication.run(Application.class, args);
    }

}

2、更新你的Maven or Gradle 打包方式配置

下一步是更新你的構建配置,這樣你的專案將產生一個war包而不是jar包。如果你使用Maven,並使用spring-boot-starter-parent(為了配置Maven的war外掛),所有你需要做的就是更改pom.xml的packaging為war:

<packaging>war</packaging>


如果你使用Gradle,你需要修改build.gradle來將war外掛應用到專案上:

apply plugin: 'war'

3、確保內嵌的servlet容器不能干擾war包將部署的servlet容器

為了達到這個目的,你需要將內嵌容器的依賴標記為provided。

如果使用Maven:

<dependencies>
    <!-- … -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-tomcat</artifactId>
        <scope>provided</scope>
    </dependency>
    <!-- … -->
</dependencies>


如果使用Gradle:
dependencies {
    // …
    providedRuntime 'org.springframework.boot:spring-boot-starter-tomcat'
    // …
}

以上步驟配置好,maven or Gradle 在build的時候就會打成war包,這裡可能還需要注意一個編碼的問題,這個就大家自己去找了,具體詳情參照:Spring 原始碼


配置好這些,確實能在Tomcat啟動了,但是對於Controller返回頁面檢視,卻還不夠,還需要配置模板的引數,這裡我使用的是Thymeleaf ,所以就介紹Thymeleaf 的配置方式

4、Thymeleaf 的配置

如果你是用的.properties方式配置的 引數,那麼只需要在你的application.properties配置下面加上:

# THYMELEAF (ThymeleafAutoConfiguration)
spring.thymeleaf.check-template-location=true
spring.thymeleaf.prefix=classpath:/templates/
spring.thymeleaf.suffix=.html
spring.thymeleaf.mode=HTML5
spring.thymeleaf.encoding=UTF-8
spring.thymeleaf.content-type=text/html
spring.thymeleaf.cache=false

每一個配置項的具體意思就自己去查了,這裡不細說,  如果你是用.yml的方式進行配置項的話,那麼需要在application.yml裡面配置如下引數:

spring:
  thymeleaf:
    cache: false
    check-template-location: true
    prefix: classpath:/templates/
    suffix: .html
    mode: HTML5
    encoding: UTF-8
    content-type: text/html


其實重要的就是prefix,因為放到tomat裡面之後, Thymeleaf  就找不到預設的templates 模板路徑了,所以這裡需要重新指明一下,這個問題也困擾了我一下午加一晚上,剛剛才調完, 現在寫篇部落格記錄下,後人謹記!!


相關文章