1. 程式人生 > 實用技巧 >Spring Boot - Gradle Plugin

Spring Boot - Gradle Plugin

簡介

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上啟動。可以通過bootDistZipbootDistTar任務壓縮或者解壓構建分發器。

使用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外掛會:

  1. 建立一個名為bootJarBootJar
    任務,它會為專案建立一個可執行的fat jar。jar會包含所有main source set下執行時的類路徑;類會被打包進BOOT-INF/classes裡,jars會被打包進BOOT-INF/lib裡。
  2. 配置一個依賴於bootJar任務的assemble任務。
  3. 禁止jar任務
  4. 建立一個名為bootRunBootRun
    任務, 用來執行你的程式。
  5. 建立一個名為bootArchives的配置包含通過bootJar產生的artifact。
  6. 無需配置,所有的Java編譯任務都使用UTF-8
動態化War外掛

當專案用用了Gradle的war plugin,Spring Boot外掛會:

  1. 建立一個名為bootWar的BootWar
    任務,用來為專案建立可執行的,far war。另外對於標準的打包,所以是providedRuntime的配置都會打包進WEB-INF/lib-provided裡;
  2. 配置一個依賴於bootWar任務的assemble任務;
  3. 禁止war任務;
  4. 配置bootArchives任務包含通過bootWar任務產生的artifact。
動態化application外掛

當專案使用了Gradle的application plugin外掛,Spring Boot外掛會:

  1. 建立一個名為bootStartScripts的CreateStartScripts的任務,它會建立一個指令碼用來使用java -jar命令啟動在bootArchives配置裡的artifact。
  2. 建立一個名為boot的新分發並且將它配置到lib目錄下的包含artifact的bootArchives配置裡,然後start scripts在bin目錄裡。
  3. 使用mainClassName作為main屬性配置bootRuntask。
  4. 使用applicationDefaultJvmArgs引數作為jvmArgs屬性配置bootRun任務。
  5. 使用mainClassName屬性在mainifest作為Start-Class入口配置bootJar任務。
  6. 使用mainClassName作為mainifest的Start-Class入口配置bootWar任務。
動態化Maven外掛

當使用了Gradle的 maven
plugin
外掛, Spring Boot外掛會配置一個uploadBootArchives上傳任務保證在它產生的pom裡沒有依賴被宣告。



作者:竹天亮
連結:https://www.jianshu.com/p/01588c396a29
來源:簡書
著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。