天天看點

飛舞的spring boot2(52)——Spring Boot Gradle插件

Spring Boot Gradle插件

飛舞的spring boot2(52)——Spring Boot Gradle插件

Spring Boot Gradle插件為Gradle提供Spring Boot支援,它允許你打包可執行jar或war存檔,運作Spring Boot應用,使用spring-boot-dependencies提供的依賴管理。以下為參考官方文檔:

  • Reference (HTML and PDF)
  • API

包含該插件

想要使用Spring Boot Gradle插件,你隻需簡單的包含一個buildscript依賴,并應用spring-boot插件:

buildscript {
dependencies {
classpath("org.springframework.boot:spring-boot-gradle-plugin:1.4.1.RELEASE")
}
}
apply plugin: 'spring-boot'      

如果使用的是一個裡程碑或快照版本,你需要添加相應的repositories引用:

buildscript {
repositories {
maven.url "http://repo.spring.io/snapshot"
maven.url "http://repo.spring.io/milestone"
}
// ...
}      

Gradle依賴管理

spring-boot插件自動應用Dependency Management Plugin,并配置它導入spring-boot-starter-parentbom。這提供了跟Maven使用者喜歡的相似依賴管理體驗,例如,如果聲明的依賴在bom中被管理的話,你就可以省略版本。為了充分使用該功能,隻需要想通常那樣聲明依賴,但将版本号設定為空:

dependencies {
compile("org.springframework.boot:spring-boot-starter-web")
compile("org.thymeleaf:thymeleaf-spring4")
compile("nz.net.ultraq.thymeleaf:thymeleaf-layout-dialect")
}      

注 你聲明的spring-boot Gradle插件的版本決定了spring-boot-starter-parent bom導入的版本(確定可以重複建構)。你最好将spring-boot gradle插件版本跟Spring Boot版本保持一緻,版本詳細資訊可以在附錄中檢視。

spring-boot插件對于沒有指定版本的依賴隻會提供一個版本。如果不想使用插件提供的版本,你可以像平常那樣在聲明依賴的時候指定版本。例如:

dependencies {
compile("org.thymeleaf:thymeleaf-spring4:2.1.1.RELEASE")
}      

打包可執行jar和war檔案

一旦spring-boot插件被應用到你的項目,它将使用bootRepackage任務自動嘗試重寫存檔以使它們能夠執行。為了建構一個jar或war,你需要按通常的方式配置項目。

你想啟動的main類既可以通過一個配置選項指定,也可以通過向manifest添加一個Main-Class屬性。如果你沒有指定main類,該插件會搜尋帶有public static void main(String[] args)方法的類。

為了建構和運作一個項目artifact,你可以輸入以下内容:

$ gradle build
$ java -jar build/libs/mymodule-0.0.1-SNAPSHOT.jar      

為了建構一個即能執行也可以部署到外部容器的war包,你需要将内嵌容器依賴标記為providedRuntime,比如:

...
apply plugin: 'war'
war {
baseName = 'myapp'
version =  '0.5.0'
}
repositories {
jcenter()
maven { url "http://repo.spring.io/libs-snapshot" }
}
configurations {
providedRuntime
}
dependencies {
compile("org.springframework.boot:spring-boot-starter-web")
providedRuntime("org.springframework.boot:spring-boot-starter-tomcat")
...
}      

注 具體參考“Section 81.1, “Create a deployable war file””。

就地(in-place)運作項目

為了在不先建構jar的情況下運作項目,你可以使用bootRun任務:

$ gradle bootRun

如果項目中添加了devtools,它将自動監控你的應用變動。此外,你可以運作應用,這樣靜态classpath資源(比如,預設位于src/main/resources下)在應用運作期間将能夠重新加載,這在開發期間是非常有用的:

bootRun {

addResources = true

}

讓靜态classpath資源可加載意味着bootRun不使用processResources任務的輸出,例如,當使用bootRun調用時,你的應用将以未經處理的形式使用資源。

Spring Boot插件配置

Gradle插件自動擴充你的建構腳本DSL,它為腳本添加一個springBoot元素以此作為Boot插件的全局配置。你可以像配置其他Gradle擴充那樣為springBoot設定相應的屬性(下面有配置選項清單)。

springBoot {

backupSource = false

}

Repackage配置

該插件添加了一個bootRepackage任務,你可以直接配置它,比如:

bootRepackage {

mainClass = 'demo.Application'

}

下面是可用的配置選項:

名稱 描述
enabled 布爾值,用于控制repackager的開關(如果你隻想要Boot的其他特性而不是這個,那它就派上用場了)
mainClass 要運作的main類。如果沒有指定,則使用project屬性mainClassName。如果該應用插件沒有使用或沒有定義mainClassName,則搜尋存檔以尋找一個合适的類。"合适"意味着一個唯一的,具有良好格式的main()方法的類(如果找到多個則建構會失敗)。你也可以通過run任務(main屬性)指定main類的名稱,和/或将"startScripts"(mainClassName屬性)作為"springBoot"配置的替代。
classifier 添加到存檔的一個檔案名字段(在擴充之前),這樣最初儲存的存檔仍舊存放在最初的位置。在存檔被重新打包(repackage)的情況下,該屬性預設為null。預設值适用于多數情況,但如果你想在另一個項目中使用原jar作為依賴,最好使用一個擴充來定義該可執行jar
withJarTask Jar任務的名稱或值,用于定位要被repackage的存檔
customConfiguration 自定義配置的名稱,用于填充内嵌的lib目錄(不指定該屬性,你将擷取所有編譯和運作時依賴)
executable 布爾值辨別,表示jar檔案在類Unix系統上是否完整可執行,預設為false
embeddedLaunchScript 如果jar是完整可執行的,該内嵌啟動腳本将添加到jar。如果沒有指定,将使用Spring Boot預設的腳本
embeddedLaunchScriptProperties 啟動腳本暴露的其他屬性,預設腳本支援mode屬性,值可以是auto,service或run
excludeDevtools 布爾值辨別,表示devtools jar是否應該從重新打包的存檔中排除出去,預設為false

使用Gradle自定義配置進行Repackage

有時候不打包解析自compile,runtime和provided作用域的預設依賴可能更合适些。如果建立的可執行jar被原樣運作,你需要将所有的依賴内嵌進該jar中;然而,如果目的是explode一個jar檔案,并手動運作main類,你可能在CLASSPATH下已經有一些可用的庫了。在這種情況下,你可以使用不同的依賴集重新打包(repackage)你的jar。

使用自定義的配置将自動禁用來自compile,runtime和provided作用域的依賴解析。自定義配置即可以定義為全局的(處于springBoot部分内),也可以定義為任務級的。

task clientJar(type: Jar) {
appendix = 'client'
from sourceSets.main.output
exclude('**/*Something*')
}
task clientBoot(type: BootRepackage, dependsOn: clientJar) {
withJarTask = clientJar
customConfiguration = "mycustomconfiguration"
}      

在以上示例中,我們建立了一個新的clientJar Jar任務從你編譯後的源中打包一個自定義檔案集。然後我們建立一個新的clientBoot BootRepackage任務,并讓它使用clientJar任務和mycustomconfiguration。

configurations {
mycustomconfiguration.exclude group: 'log4j'
}
dependencies {
mycustomconfiguration configurations.runtime
}      

在BootRepackage中引用的配置是一個正常的Gradle配置。在以上示例中,我們建立了一個新的名叫mycustomconfiguration的配置,訓示它來自一個runtime,并排除對log4j的依賴。如果clientBoot任務被執行,重新打包的jar将含有所有來自runtime作用域的依賴,除了log4j jars。

配置選項

可用的配置選項如下:

名稱 描述
mainClass 可執行jar運作的main類
providedConfiguration provided配置的名稱(預設為providedRuntime)
backupSource 在重新打包之前,原先的存檔是否備份(預設為true)
customConfiguration 自定義配置的名稱
layout 存檔類型,對應于内部依賴是如何制定的(預設基于存檔類型進行推測),具體檢視available layouts
requiresUnpack 一個依賴清單(格式為"groupId:artifactId",為了運作,它們需要從fat jars中解壓出來。)所有節點被打包進胖jar,但運作的時候它們将被自動解壓

可用的layouts

layout屬性用于配置存檔格式及啟動加載器是否包含,以下為可用的layouts:

名稱 描述 可執行
JAR 正常的可執行JAR layout
WAR 可執行WAR layout,provided依賴放置到WEB-INF/lib-provided,以免war部署到servlet容器時造成沖突
ZIP(别名DIR) 跟JAR layout類似,使用PropertiesLauncher
MODULE 捆綁(Bundle)依賴(排除那些provided作用域的依賴)和項目資源
NONE 捆綁(Bundle)所有依賴和項目資源

了解Gradle插件是如何工作的

當spring-boot應用到你的Gradle項目,一個預設的名叫bootRepackage的任務被自動建立。bootRepackage任務依賴于Gradle assemble任務,當執行時,它會嘗試找到所有限定符為空的jar artifacts(也就是說,tests和sources jars被自動跳過)。

由于bootRepackage會查找'所有'建立的jar artifacts,Gradle任務執行的順序就非常重要了。多數項目隻建立一個單一的jar檔案,是以通常這不是一個問題。然而,如果你正打算建立一個更複雜的,使用自定義jar和BootRepackage任務的項目setup,有幾個方面需要考慮。

如果'僅僅'從項目建立自定義jar檔案,你可以簡單地禁用預設的jar和bootRepackage任務:

jar.enabled = false

bootRepackage.enabled = false

另一個選項是訓示預設的bootRepackage任務隻能使用一個預設的jar任務:

bootRepackage.withJarTask = jar

如果你有一個預設的項目setup,在該項目中,主(main)jar檔案被建立和重新打包。并且,你仍舊想建立額外的自定義jars,你可以将自定義的repackage任務結合起來,然後使用dependsOn,這樣bootJars任務就會在預設的bootRepackage任務執行以後運作:

task bootJars
bootJars.dependsOn = [clientBoot1,clientBoot2,clientBoot3]
build.dependsOn(bootJars)      

上面所有方面經常用于避免一個已經建立的boot jar又被重新打包的情況。重新打包一個存在的boot jar不是什麼大問題,但你可能會發現它包含不必要的依賴。

使用Gradle将artifacts釋出到Maven倉庫

自定義Gradle,用于産生一個繼承依賴管理的pom

uploadArchives {
repositories {
mavenDeployer {
pom {
project {
parent {
groupId "org.springframework.boot"
artifactId "spring-boot-starter-parent"
version "1.4.1.RELEASE"
}
}
}
}
}
}      

自定義Gradle,用于産生一個導入依賴管理的pom

uploadArchives {
repositories {
mavenDeployer {
pom {
project {
dependencyManagement {
dependencies {
dependency {
groupId "org.springframework.boot"
artifactId "spring-boot-dependencies"
version "1.4.1.RELEASE"
type "pom"
scope "import"
}
}
}
}
}
}
}
}      

繼續閱讀