在一臺遠端伺服器上執行Spring Web應用程式的傳統做法是,將其打包為war檔案並部署到servlet容器中。
雖然在過去這個方法很好很強大,然而要同時管理多個servlet容器總是有些繁瑣。
Spring Boot針對該問題提供了一種解決方案,它允許我們將web應用程式打包為一個可執行的jar檔案,這個檔案可以使用嵌入式的servlet容器。
這篇博文將描述如何建立一個滿足以下要求的Spring Boot web應用程式:
- Spring Boot應用程式必須使用Thymeleaf作為模版引擎。
- Spring Boot應用程式必須提供一種對其進行監控的方式。
- Gradle專案必須擁有獨立的原始檔和資原始檔目錄,以便進行單元和整合測試。
我們開始吧。
建立Java專案
由於我們需要建立的是一個Java專案,所以必須使用Java外掛。通過以下步驟可以完成:
1.應用Gradle的Java外掛。
2.設定Java原始碼的版本為1.8。
3.配置Gradle生成Java1.8的class檔案。
build.gradle檔案如下:
1 2 3 4 |
apply plugin: 'java' sourceCompatibility = 1.8 targetCompatibility = 1.8 |
Java外掛會在我們的構建中新增新的約定(如預設的目錄結構)、任務和屬性集。如果你想了解更多內容,可以閱讀以下博文:
我們繼續,下面是如何在Gradle構建中新增整合測試。
在Gradle構建中新增整合測試
我們可以使用Gradle測試集外掛(TestSets plugin)在構建中新增整合測試。由於我已經寫過一篇描述如何使用該外掛的教程了,所以在這篇文章中我就不再贅述其配置了。
在實現了“此文”所提到的需求以後,build.gradle 檔案如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
buildscript { repositories { jcenter() } dependencies { classpath( 'org.unbroken-dome.gradle-plugins:gradle-testsets-plugin:1.0.2' ) } } apply plugin: 'java' apply plugin: 'org.unbroken-dome.test-sets' sourceCompatibility = 1.8 targetCompatibility = 1.8 testSets { integrationTest { dirName = 'integration-test' } } project.integrationTest { outputs.upToDateWhen { false } } check.dependsOn integrationTest integrationTest.mustRunAfter test tasks.withType(Test) { reports.html.destination = file("${reporting.baseDir}/${name}") } |
我們繼續,下面將談到如何在Gradle專案中新增Spring Boot的支援。
在Gradle專案中新增Spring Boot的支援
我們可以使用Spring Boot Gradle外掛在Gradle專案中新增Spring Boot的支援。通過以下步驟使用該外掛:
1. 在構建指令碼的classpath中新增Spring Boot Gradle外掛(版本:1.2.5.RELEASE)。
2. 應用Spring Boot Gradle外掛。
build.gradle檔案的原始碼如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
buildscript { repositories { jcenter() } dependencies { classpath( 'org.springframework.boot:spring-boot-gradle-plugin:1.2.5.RELEASE', 'org.unbroken-dome.gradle-plugins:gradle-testsets-plugin:1.0.2' ) } } apply plugin: 'java' apply plugin: 'org.unbroken-dome.test-sets' apply plugin: 'spring-boot' sourceCompatibility = 1.8 targetCompatibility = 1.8 testSets { integrationTest { dirName = 'integration-test' } } project.integrationTest { outputs.upToDateWhen { false } } check.dependsOn integrationTest integrationTest.mustRunAfter test tasks.withType(Test) { reports.html.destination = file("${reporting.baseDir}/${name}") } |
我們無須使用Bintray的Jcenter Maven倉庫,但是由於Gradle測試集外掛依賴於該倉庫,因此本文中的演示程式也將其加入。
在應用Spring Boot Gradle外掛後,我們可以:
- 將應用程式打包為可執行的jar檔案。
- 使用bootrun任務執行程式。
- 省略Spring Boot依賴的版本資訊。
- 將應用程式打包為war檔案。
當然,我們也可以對Spring Boot Gradle外掛進行配置,並自定義執行和打包應用程式的任務。
我們繼續,下面是如何通過Gradle獲取所需的依賴項。
獲取所需的依賴項
我們可以通過所謂的starter POM來獲取Spring Boot應用的依賴。Spring Boot的參考指南將starter POM描述如下:
starter POM是一族可以被包含到專案中的便捷依賴描述符。你可以一站式的獲取所有需要的Spring和相關技術,無需苦苦尋找演示程式碼,也無需複製貼上大量的依賴描述符。
換句話說,我們只需選擇正確的starter POM,並將其加入到Gradle構建中即可。
我們可以通過以下步驟獲取所需的依賴:
- 確保所有的依賴都從Maven2的中央倉庫獲取。
- 在compile配置裡新增spring-boot-starter-actuator依賴,我們之所以需要這個依賴,是因為它提供了一種監控應用執行狀態的方法。
- 在compile配置裡新增spring-boot-starter-thymeleaf依賴,我們之所以需要該依賴,是因為我們需要使用Thymeleaf作為建立Web應用的模版引擎。
- 在testCompile配置裡新增spring-boot-starter-test依賴,我們之所以需要該依賴,是因為我們需要在Web應用中編寫單元測試和整合測試。
build.gradle的原始碼如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
buildscript { repositories { jcenter() } dependencies { classpath( 'org.springframework.boot:spring-boot-gradle-plugin:1.2.5.RELEASE', 'org.unbroken-dome.gradle-plugins:gradle-testsets-plugin:1.0.2' ) } } apply plugin: 'java' apply plugin: 'org.unbroken-dome.test-sets' apply plugin: 'spring-boot' sourceCompatibility = 1.8 targetCompatibility = 1.8 repositories { mavenCentral() } dependencies { compile( 'org.springframework.boot:spring-boot-starter-actuator', 'org.springframework.boot:spring-boot-starter-thymeleaf' ) testCompile('org.springframework.boot:spring-boot-starter-test') } testSets { integrationTest { dirName = 'integration-test' } } project.integrationTest { outputs.upToDateWhen { false } } check.dependsOn integrationTest integrationTest.mustRunAfter test tasks.withType(Test) { reports.html.destination = file("${reporting.baseDir}/${name}") } |
- Getting Started With Gradle: Dependency Management
- Spring Boot Reference Guide: 13.4 Starter POMs
- Spring Boot Reference Guide: 59.2 Declaring dependencies without versions
- Spring Boot Reference Guide: Appendix E. Dependency versions
- Spring Boot Reference Guide: Part V. Spring Boot Actuator: Production-ready features
我們繼續,下面是如何執行Spring Boot應用程式。
執行Spring Boot 應用程式
我們可以使用以下任一方法,執行Spring Boot應用程式:
首先,可以使用Spring Boot Gradle外掛中的bootRun任務執行應用程式,而無需建立jar檔案。我們應當在開發階段使用這個方法,因為它可以使我們靜態的classpath資源(即:在src/main/resources下的檔案)都成為可過載的資源。
換句話說,如果我們使用這個方法,就可以在Spring Boot應用程式執行時對這些檔案進行更改,而且可以在不重啟應用的情況下觀察到變化。
通過在命令提示符中輸入以下命令,就可以使用該方法了。
1 |
gradle clean bootRun |
其次,我們可以將應用程式打包為一個可執行的jar檔案,繼而執行所建立的檔案。如果想要在一臺遠端伺服器上執行Spring Boot應用,應當採用這種方法。
通過在命令提示符中輸入以下命令,就可以建立一個可執行的jar檔案了。
1 |
gradle clean build |
這條命令會在build/libs目錄下建立spring-boot-web-application.jar檔案。在將其複製到遠端伺服器上後,可以通過以下命令執行應用程式。
1 |
java -jar spring-boot-web-application.jar |
我們繼續來總結一下從這篇教程中的所學所得。
總結
這篇博文教會了我們以下四點:
- 我們可以使用Spring Boot Gradle外掛在Gradle專案中新增Spring Boot的支援。
- 我們可以通過設定Spring Boot Gradle外掛的版本來選擇偏愛的Spring Boot的版本。這意味著我們不再需要設定每個Spring Boot依賴項的版本。
- 如果我們想要在開發環境執行Spring Boot應用程式,應當使用Spring Boot Gradle外掛中的bootRun任務。
- 如果我們想要在遠端伺服器上執行Spring Boot應用程式,應當將其打包為可執行的jar檔案,並複製到遠端伺服器上,執行即可。
P.S. 你可以從Github上獲取本文的演示程式。