簡介
Spring Boot Gradle Plugin為Spring Boot提供了對Gradle的支持,允許你將打包可執行的jar或者war archives,運行Spring Boot程序,然后使用spring-boot-dependencies提供的依賴管理。Spring Boot's Gradle插件需要Gradle 3.4及以上。原文地址:http://docs.spring.io/spring-boot/docs/2.0.0.M2/gradle-plugin//reference/html/
除了這個用戶指南,API 文檔也已經有了。
開始
需要在項目里加上下面的配置來使用插件。
buildscript { repositories { maven { url 'https://repo.spring.io/libs-milestone' } } dependencies { classpath 'org.springframework.boot:spring-boot-gradle-plugin:2.0.0.M2' } } apply plugin: 'org.springframework.boot'
使用這個插件可以讓減少項目的改動。而且,會檢測其他插件的使用或者更新。比如,當應用了java插件,會自動在構建時打包成可執行的jar。
一個經典的Spring Boot項目至少會使用groovy
, java
, or org.jetbrains.kotlin.jvm
插件 and the io.spring.dependency-management
插件. 比如:
apply plugin: 'java'
apply plugin: 'io.spring.dependency-management'
依賴管理
當使用了io.spring.dependency-management
插件, Spring Boot的插件會自動地從你使用的Spring Boot版本里導入spring-boot-dependencies bom。
Maven用戶使用起來感覺區別不大。比如,允許你在聲明依賴的時候忽略掉版本號,使用這項功能,只需要正常的聲明依賴,不用寫版本號就可以了。
dependencies {
compile 'org.springframework.boot:spring-boot-starter-web'
compile 'org.springframework.boot:spring-boot-starter-data-jpa'
}
自定義管理版本號
當應用了依賴管理插件,spring-boot-dependencies bom會被自動導入,使用屬性控制它管理的依賴的版本號。點擊 bom 查看完整的屬性列表。
如果要自定義管理版本,設置它的擴展屬性。比如,自定義被管理的SLF4J的版本號,設置屬性:
ext['slf4j.version'] = '1.7.20'
每個Spring Boot版本都與制定的第三方依賴設計和測試好了。覆蓋版本可能會造成兼容問題,所以自定義的時候小心一點
打包可執行文件
插件可以創建可執行文件(jar文件或者war文件),里面包含所有應用的依賴並且可以使用java -jar執行。
打包可執行jars
可以使用bootJar任務構建可執行的jars。如果應用了java插件,這個任務會自動的創建,並且是 BootJar
的實例.assemble任務會自動配置依賴於bootJar任務,所以運行assemble也會運行bootJar任務。
打包可執行和普通文件
默認的,當bootJar或者bootWar任務配置了,jar或者war任務會被禁用掉。但是可以同時構建一個可執行和普通的文件通過設置jar或者war任務可用:
jar {
enabled = true
}
為了避免可執行文件和普通文件生成在同一個目錄,其中一個應該使用不同的位置。一種方法就是配置一個classifier:
bootJar {
classifier = 'boot'
}
配置可執行文件打包
BootJar
和 BootWar
任務分別是Gradle的jar或者war任務的子類。所以,所有的在打包jar或者war時用的標准配置都對可執行的jar或者war可用。當然也有對可執行jars或者wars的特殊配置。
配置主類
默認的,可執行文件的主類會自動的在任務的類路徑目錄里查找一個帶有public static void main(String[])的方法。主類也可以顯示的使用mainCalss設置:
bootJar {
mainClass = 'com.example.ExampleApplication'
}
另外,如果應用了 application plugin 可以這么設置mainClassName屬性:
mainClassName = 'com.example.ExampleApplication'
最后,Start-Class屬性可以在任務的manifest里配置:
bootJar {
manifest {
attributes 'Start-Class': 'com.example.ExampleApplication'
}
}
Excluding Devtools
默認SpringBoot的Devtools模塊org.springframework.boot:spring-boot-devtools不會被打包進可執行的jar或者war。如果打包Devtools到文件里,設置excludeDevtools屬性為false:
bootWar {
excludeDevtools = false
}
配置需要移除的庫
大多數庫可以直接嵌套進可執行的文件里,但是某些庫可能有問題。比如,JRuby引入了它自己的內嵌jar支持,比如jruby-complete.jar總是直接在文件系統上可用。
處理這個問題庫,可執行文件可以配置在運行(run)的時候移除指定的嵌套jars到臨時目錄。庫可以使用Ant-style模式匹配源jar文件的絕對路徑移除需要的包:
bootJar {
requiresUnpack '**/jruby-complete-*.jar'
}
讓文件完全可執行
Spring Boot對完全可執行文件提供支持。通過已知的如何啟動應用的預shell腳步來制造完全可執行。在類Unix平台上,這個啟動腳本運行文件可以像任何可執行文件直接運行或者作為服務安裝。
啟用這個特性,launchScript必須啟用:
bootJar {
launchScript {
included = true
}
}
這將添加Spring Boot的默認腳本到文件里。默認的啟動腳本包含若干個屬性並且設置了合適的默認值,當然也可以通過properties屬性自定義默認值:
bootJar {
launchScript {
included = true
properties 'logFilename': 'example-app.log'
}
}
如果啟動腳本沒有你想要的,script屬性可以提供一個自定義的啟動腳本:
bootJar {
launchScript {
included = true
script = file('src/custom.script')
}
}
使用PropertiesLauncher
要想使用PropertiesLauncher啟動可執行jar或者war,配置任務的manifest來設置Main-Class屬性:
bootWar {
manifest {
attributes 'Main-Class': 'org.springframework.boot.loader.PropertiesLauncher'
}
}
發布應用
使用maven插件發布應用
應用了 maven plugin ,uploadBootArchives的BootArchives上傳任務會被自動創建。默認的,bootArchives配置包含了bootJar或者bootWar任務產生文件。uploadBootArchives任務可以這么配置來發布到Maven repository里:
uploadBootArchives { repositories { mavenDeployer { repository url: 'https://repo.example.com' } } }
使用maven-publish插件發布
使用MavenPublication的artifact方法發布你的Spring Boot jar或者war。將任務傳給到你想要發布的artifact方法上。比如,通過默認的bootJar任務發布artifact:
publishing { publications { bootJava(MavenPublication) { artifact bootJar } } repositories { maven { url 'https://repo.example.com' } } }
使用application插件分發
當使用了application plugin ,boot分發器會被創建。這個分發器包含了通過bootJar或者bootWar任務和腳本在類Unix和Windows上啟動。可以通過bootDistZip和bootDistTar任務壓縮或者解壓構建分發器。
使用Gradle運行程序
使用bootRun任務來運行程序,不需要產生文件:
$ ./gradlew bootRun
bootRun任務是JavaExec子類的 BootRun
的實例. 所以, 所有的 usual configuration options在Gradle里執行Java處理都可用。任務會使用主源文件的運行期類路徑自動配置。
默認的,通過查找任務的類路徑下的public static void main(String[])會自動配置。
主類也可以顯示的配置:
bootRun {
main = 'com.example.ExampleApplication'
}
另外,如果使用了application pluginmainClassName項目屬性可以被使用:
mainClassName = 'com.example.ExampleApplication'
重加載資源
如果項目里加入了devtools,它會自動的監控你的程序變化。另外,如果你配置了bootRun比如靜態資源,應用程序的靜態資源會從源位置被加載:
bootRun {
sourceResources sourceSets.main
}
這在開發時很有用。
整合Actuator
生成構建信息
Spring Boot Actuator的信息endpoint自動發布META-INF/build-info.properties文件里的信息。BuildInfo
任務可以用來生成這個文件。最簡單的方式是通過插件的DSL使用任務:
springBoot {
buildInfo()
}
這會配置一個bootBuildInfo的任務BuildInfo
,並且如果他存在,會讓Java插件的類任務基於它。任務的目標目錄將會是META-INF在主源設置的資源的輸出目錄(通常是build/resources/main)。
默認的,生成的信息是從項目里派生出來的:
| 屬性 | 默認值 |
|---|---|
| build.artifact | bootJar或者bootWar任務的base name,如果沒有就是unspecified |
| build.group | The group of the project |
| build.name | The name of the project |
| build.version | The version of the project |
屬性可以使用DSL自定義:
springBoot { buildInfo { properties { artifact = 'example-app' version = '1.2.3' group = 'com.example' name = 'Example application' } } }
可以添加額外的構建信息:
springBoot {
buildInfo {
properties {
additional = [
'a': 'alpha',
'b': 'bravo'
]
}
}
}
為其他插件動態化
當使用了其他插件,Spring Boot插件會相應的為項目配置做出一些改變。本章節描述這些改變。
動態化Java插件
當項目里使用了java plugin,Spring Boot插件會:
- 創建一個名為
bootJar的BootJar
任務,它會為項目創建一個可執行的fat jar。jar會包含所有main source set下運行時的類路徑;類會被打包進BOOT-INF/classes里,jars會被打包進BOOT-INF/lib里。 - 配置一個依賴於
bootJar任務的assemble任務。 - 禁止
jar任務 - 創建一個名為
bootRun的BootRun
任務, 用來運行你的程序。 - 創建一個名為bootArchives的配置包含通過
bootJar產生的artifact。 - 無需配置,所有的Java編譯任務都使用
UTF-8。
動態化War插件
當項目用用了Gradle的war plugin,Spring Boot插件會:
- 創建一個名為bootWar的BootWar
任務,用來為項目創建可執行的,far war。另外對於標准的打包,所以是providedRuntime的配置都會打包進WEB-INF/lib-provided里; - 配置一個依賴於
bootWar任務的assemble任務; - 禁止war任務;
- 配置
bootArchives任務包含通過bootWar任務產生的artifact。
動態化application插件
當項目使用了Gradle的application plugin插件,Spring Boot插件會:
- 創建一個名為
bootStartScripts的CreateStartScripts的任務,它會創建一個腳本用來使用java -jar命令啟動在bootArchives配置里的artifact。 - 創建一個名為
boot的新分發並且將它配置到lib目錄下的包含artifact的bootArchives配置里,然后start scripts在bin目錄里。 - 使用
mainClassName作為main屬性配置bootRuntask。 - 使用
applicationDefaultJvmArgs參數作為jvmArgs屬性配置bootRun任務。 - 使用
mainClassName屬性在mainifest作為Start-Class入口配置bootJar任務。 - 使用
mainClassName作為mainifest的Start-Class入口配置bootWar任務。
動態化Maven插件
當使用了Gradle的 maven
plugin 插件, Spring Boot插件會配置一個uploadBootArchives上傳任務保證在它產生的pom里沒有依賴被聲明。
作者:竹天亮
鏈接:https://www.jianshu.com/p/01588c396a29
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。
