13. 構建系統
強烈建議你選擇一個支援依賴管理的構建系統,並且可以使用釋出到“Maven中心”儲存庫的工件。我們建議你選擇Maven或Gradle,可以讓Spring Boot與其他構建系統(例如Ant)一起工作,但是它們並不是特別受支援。
13.1 依賴關係管理
Spring Boot的每一個版本都提供了它所支援的一個被整理的依賴項列表,實際上,在構建配置中,你不需要為這些依賴項提供一個版本,因為Spring Boot為你管理這些依賴項,當你升級Spring Boot本身時,這些依賴項也會以一致的方式升級。
如果需要,你仍然可以指定一個版本並覆蓋Spring Boot的建議。
經過管理的列表包含所有spring模組,你可以使用spring Boot以及一個經過細化的第三方庫列表,這個列表可以作為一個標準的材料清單(spring-boot-dependencies
),它可以與Maven和Gradle一起使用。
Spring Boot的每個版本都與Spring框架的一個基本版本相關聯,我們強烈建議你不要指定它的版本。
13.2 Maven
Maven使用者可以從spring-boot-starter-parent
專案繼承來獲得合理的預設值,父專案提供了以下特性:
- Java 1.8作為預設的編譯器級別
- utf-8編碼
- 依賴關係管理部分,繼承自
spring-boot-dependencies
pom,管理通用依賴項的版本,這個依賴項管理允許你在自己的pom中使用這些依賴項時省略<版本>標記。 - 合理的資源過濾
- 合理的外掛配置(exec外掛,Git commit ID和shade)。
-
application.properties
和指定屬性的檔案的application.yml
(例如,application-dev.properties
和application-dev.yml
) 的合理資源過濾。
注意,由於application.properties
和application.yml
檔案接受Spring樣式的佔位符(${…}
),Maven過濾被更改為使用@..@
佔位符。(你可以通過設定一個名為resource.delimiter
的Maven屬性來覆蓋它。)
13.2.1 繼承啟動器的父POM
要將你的專案配置為從spring-boot-starter-parent
繼承,請將parent
設定為:
<!-- Inherit defaults from Spring Boot -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.5.RELEASE</version>
</parent>
你應該僅在此依賴項上指定Spring Boot版本號,如果你匯入額外的啟動器,你可以安全地省略版本號。
通過這種設定,你還可以通過在自己的專案中覆蓋一個屬性來覆蓋單個依賴項。例如,要升級到另一個Spring Data release train,你需要將以下內容新增到你的pom.xml
:
<properties>
<spring-data-releasetrain.version>Fowler-SR2</spring-data-releasetrain.version>
</properties>
檢查spring-boot-dependencies pom,以獲得支援的屬性列表。
13.2.2 使用沒有父POM的Spring Boot
並不是每個人都喜歡從spring-booot-starter-parent
POM繼承,你可能有你自己的企業標準父類,你需要使用它們,或者你可能傾向於顯式地宣告所有的Maven配置。
如果你不想使用spring-boot-starter-parent
,那麼你仍然可以使用scope=import
依賴項來保持依賴管理(但不是外掛管理)的好處:
<dependencyManagement>
<dependencies>
<dependency>
<!-- Import dependency management from Spring Boot -->
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.0.5.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
前面的示例設定不允許你使用屬性來覆蓋單個依賴項,如上所述。為了達到同樣的結果,在spring-boot-dependencies
進入之前,需要對你的專案dependencyManagement
新增一個條目。例如,要升級到另一個Spring Data release train,你可以將以下元素新增到你的pom.xml
:
<dependencyManagement>
<dependencies>
<!-- Override Spring Data release train provided by Spring Boot -->
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-releasetrain</artifactId>
<version>Fowler-SR2</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.0.5.RELEASE</version> <type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
在前面的示例中,我們指定了一個BOM,但是任何依賴型別都可以以相同的方式被覆蓋。
13.2.3 使用Spring Boot Maven外掛
Spring Boot包括一個Maven外掛,它可以將專案打包為可執行jar,如果你想要使用它,請將外掛新增到你的<plugins>
部分,如下面的示例所示:
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
如果你使用Spring Boot starter parent pom,你只需要新增外掛,不需要對其進行配置,除非你想更改parent中定義的設定。
13.3 Gradle
要了解使用Gradle的Spring Boot,請參考Spring Boot的Gradle外掛的文件:
13.4 Ant
可以使用Apache Ant+Ivy構建Spring Boot專案,spring-boot-antlib
“AntLib”模組也可用來幫助Ant建立可執行的jar。
宣告依賴關係,典型的ivy.xml
檔案看起來像是下面的例子:
<ivy-module version="2.0">
<info organisation="org.springframework.boot" module="spring-boot-sample-ant" />
<configurations>
<conf name="compile" description="everything needed to compile this module" />
<conf name="runtime" extends="compile" description="everything needed to run this module" />
</configurations>
<dependencies>
<dependency org="org.springframework.boot" name="spring-boot-starter"
rev="${spring-boot.version}" conf="compile" />
</dependencies>
</ivy-module>
一個典型的buld.xml
看起來像是下面的例子:
<project xmlns:ivy="antlib:org.apache.ivy.ant"
xmlns:spring-boot="antlib:org.springframework.boot.ant" name="myapp" default="build">
<property name="spring-boot.version" value="2.0.5.RELEASE" />
<target name="resolve" description="--> retrieve dependencies with ivy">
<ivy:retrieve pattern="lib/[conf]/[artifact]-[type]-[revision].[ext]" />
</target>
<target name="classpaths" depends="resolve"> <path id="compile.classpath">
<fileset dir="lib/compile" includes="*.jar" /> </path>
</target>
<target name="init" depends="classpaths">
<mkdir dir="build/classes" />
</target>
<target name="compile" depends="init" description="compile">
<javac srcdir="src/main/java" destdir="build/classes" classpathref="compile.classpath" />
</target>
<target name="build" depends="compile">
<spring-boot:exejar destfile="build/myapp.jar" classes="build/classes">
<spring-boot:lib>
<fileset dir="lib/runtime" />
</spring-boot:lib>
</spring-boot:exejar>
</target>
</project>
如果你不想使用
spring-boot-antlib
模組,請參見第87.9節,“從Ant構建一個可執行的存檔,而不使用spring-boot-antlib” “How-to”。
13.5 Starter
Starters是一組方便的依賴描述符,你可以將它們包括在應用程式中,你可以獲得所需的所有Spring和相關技術的一站式服務,而無需搜尋示例程式碼和複製貼上依賴描述符的負載。例如,如果你想要開始使用Spring和JPA進行資料庫訪問,請在專案中包含Spring-boot-starter-data-JPA
依賴項。
starters包含大量的依賴項,你需要通過一個一致的、受支援的管理傳遞依賴集來快速地啟動專案並執行。
叫什麼名稱
所有官方 starters都遵循類似的命名模式;
spring-boot-starter-*
,其中*
是一種特殊型別的應用程式。這種命名結構旨在幫助你找到一個starter,許多IDE中的Maven整合讓你可以通過名稱搜尋依賴項。例如,如果安裝了適當的Eclipse或STS外掛,你可以在POM編輯器中按下ctrl-space
,並在一個完整的列表中鍵入“spring-boot-starter”。正如在“建立你自己的starter”部分中所解釋的,第三方starter不應該從
Spring-Boot
開始,因為它是為官方Spring Boot工件預留的。相反,第三方starter通常以專案的名稱開始,例如,一個名為thirdpartyproject
的第三方啟動專案通常會被命名為thirdpartyproject-spring-boot-starter
。
下列應用程式starter由org.springframework.boot
組下的Spring Boot提供:
表13.1. Spring Boot應用程式starter
名稱 | 描述 | Pom |
---|---|---|
spring-boot-starter |
核心啟動器,包括自動配置支援,日誌記錄和YAML | Pom |
spring-boot-starter-activemq |
使用Apache ActiveMQ的JMS訊息傳遞啟動器 | Pom |
spring-boot-starter-amqp |
使用Spring AMQP和Rabbit MQ的啟動器 | Pom |
spring-boot-starter-aop |
使用Spring AOP和AspectJ進行面向切面程式設計的啟動器 | Pom |
sspring-boot-starter-artemis |
使用Apache Artemis的JMS訊息傳遞啟動器 | Pom |
spring-boot-starter-batch |
使用Spring batch的啟動器 | Pom |
spring-boot-starter-cache |
使用Spring框架快取支援的啟動器 | Pom |
spring-boot-starter-cloud-connectors |
使用Spring Cloud聯結器,它簡化了連線到雲平臺的服務,如Cloud Foundry和Heroku | Pom |
spring-boot-starter-data-cassandra |
使用Cassandra分散式資料庫和Spring Data Cassandra的啟動器 | Pom |
spring-boot-starter-data-cassandra-reactive |
使用Cassandra分散式資料庫和Spring Data Cassandra Reactive的啟動器 | Pom |
spring-boot-starter-data-couchbase |
使用Couchbase面向文件的資料庫和Spring Data Couchbase的啟動器 | Pom |
spring-boot-starter-data-couchbase-reactive |
使用Couchbase面向文件的資料庫和Spring Data Couchbase Reactive的啟動器 | Pom |
spring-boot-starter-data-elasticsearch |
使用Elasticsearch搜尋和分析引擎與Spring Data Elasticsearch的啟動器 | Pom |
spring-boot-starter-data-jpa |
使用Hibernate的Spring Data JPA啟動器 | Pom |
spring-boot-starter-data-ldap |
使用Spring Data LDAP的啟動器 | Pom |
spring-boot-starter-data-mongodb |
使用MongoDB面向文件資料庫和Spring Data MongoDB的啟動器 | Pom |
spring-boot-starter-data-mongodb-reactive |
使用MongoDB面向文件資料庫和Spring Data MongoDB Reactive的啟動器 | Pom |
spring-boot-starter-data-neo4j |
使用Neo4j圖形資料庫和Spring Data Neo4j的啟動器 | Pom |
spring-boot-starter-data-redis |
使用Redis鍵值資料儲存和Spring Data Redis和Lettuce客戶端的啟動器 | Pom |
spring-boot-starter-data-redis-reactive |
使用Redis鍵值資料儲存和Spring Data Redis Reactive和Lettuce客戶端的啟動器 | Pom |
spring-boot-starter-data-rest |
使用Spring Data REST公開Spring Data儲存庫的啟動器 | Pom |
spring-boot-starter-data-solr |
使用Spring Data Solr的Apache Solr搜尋平臺的啟動器 | Pom |
spring-boot-starter-freemarker |
使用FreeMarker檢視構建MVC web應用程式的啟動器 | Pom |
spring-boot-starter-groovy-templates |
使用Groovy模板檢視構建MVC web應用程式的啟動器 | Pom |
spring-boot-starter-hateoas |
使用Spring MVC和Spring HATEOAS構建基於超媒體的RESTful web應用程式的啟動器 | Pom |
spring-boot-starter-integration |
使用Spring Integration的啟動器 | Pom |
spring-boot-starter-jdbc |
使用JDBC與HikariCP連線池的啟動器 | Pom |
spring-boot-starter-jersey |
使用JAX-RS和Jersey構建基於RESTful的web應用程式的啟動器,另一種選擇spring-boot-starter-web
|
Pom |
spring-boot-starter-jooq |
使用jOOQ訪問SQL資料庫的啟動器,另一種選擇是spring-boot-starter-data-jpa 或spring-boot-starter-jdbc
|
Pom |
spring-boot-starter-json |
閱讀和編寫json的啟動器 | Pom |
spring-boot-starter-jta-atomikos |
使用Atomikos的JTA事務的啟動器 | Pom |
spring-boot-starter-jta-bitronix |
使用Bitronix的JTA事務的啟動器 | Pom |
spring-boot-starter-jta-narayana |
使用Narayana的JTA事務的啟動器 | Pom |
spring-boot-starter-mail |
使用Java Mail和Spring框架的email傳送支援的啟動器 | Pom |
spring-boot-starter-mustache |
使用Mustache檢視構建web應用程式的啟動器 | Pom |
spring-boot-starter-quartz |
使用Quartz排程器的啟動器 | Pom |
spring-boot-starter-security |
使用Spring Security的啟動器 | Pom |
spring-boot-starter-test |
使用包括JUnit、Hamcrest和Mockito來測試Spring Boot 應用程式的啟動器 | Pom |
spring-boot-starter-thymeleaf |
使用Thymeleaf檢視構建MVC web應用程式的啟動器 | Pom |
spring-boot-starter-validation |
使用Hibernate驗證器驗證Java Bean的啟動器 | Pom |
spring-boot-starter-web |
使用Spring MVC構建web(包括RESTful)應用程式的啟動器,使用Tomcat作為預設的嵌入式容器 | Pom |
spring-boot-starter-web-services |
使用Spring Web Services的啟動器 | Pom |
spring-boot-starter-webflux |
使用Spring框架的Reactive Web支援構建WebFlux應用程式的啟動器 | Pom |
spring-boot-starter-websocket |
使用Spring框架的WebSocket支援構建WebSocket應用程式的啟動器 | Pom |
除了應用程式starter之外,下面的啟動器還可以用於新增生產就緒特性:
表13.2. Spring Boot生產starter
名稱 | 描述 | Pom |
---|---|---|
spring-boot-starter-actuator |
使用Spring Boot Actuator提供生產就緒特性,幫助你監視和管理應用程式的啟動器 | Pom |
最後,Spring Boot還包括以下啟動器,如果你想要排除或交換特定的技術方面,可以使用:
表13.3.Spring boot技術型的啟動器
名稱 | 描述 | Pom |
---|---|---|
spring-boot-starter-jetty |
使用Jetty作為嵌入式servlet容器的啟動器,替代spring-boot-starter-tomcat
|
Pom |
spring-boot-starter-log4j2 |
使用Log4j2進行日誌記錄的啟動器,替代spring-boot-starter-logging
|
Pom |
spring-boot-starter-logging |
使用Logback進行日誌記錄的啟動器,預設的日誌起動器 | Pom |
spring-boot-starter-reactor-netty |
使用Reactor Netty作為嵌入式reactive HTTP伺服器的啟動器 | Pom |
spring-boot-starter-tomcat |
使用Tomcat作為嵌入式servlet容器的啟動器,預設的servlet容器啟動器使用spring-boot-starter-web | Pom |
spring-boot-starter-undertow |
使用Undertow作為嵌入式servlet容器的啟動器,替代spring-boot-starter-tomcat
|
Pom |
對於一個附加的社群貢獻starter列表,請參閱GitHub上的
spring-boot-starters
模組中的README檔案。