Gradle 入門
目錄 start
- Gradle
- 書籍
- 發行版本列表
- 安裝配置
- SDKMAN方式
- Chocolate
- 命令行選項
- 守護進程
- Docker安裝
- 配置鏡像源
- 關鍵配置文件
- build.gradle
- 初始化一個新項目
- dependency
- 統一依賴管理
- 配置Wrapper
- 插件
- 常用插件
- setting.gradle
- Gradle多模塊的構建
- 另一種方式
- Gradle多模塊的構建
- build.gradle
- 部署
- War包
- Jar包
- 上傳至構建倉庫
- 構建Docker鏡像
- 第二種插件方式
目錄 end
|2018-08-03| 碼雲 | CSDN | OSChina
****************************************
Gradle
官方 guide | 其他 tutorial
參考博客: 零散知識點總結(1) - Gradle 使用配置總結
個人看法
參考: Gradle在大型Java項目上的應用
優缺點
Gradle大吐槽
官方對比Gradle和Maven
優點
- 相對於Maven, 配置文件簡潔了很多, 所以才入坑學習使用的
- 對於一些需要自定義的任務,因為核心為Groovy,所以實現能力高
- 例如:將一個SpringBoot項目構建成一個鏡像,並tag上當前構建的鏡像為release,然後刪除舊有容器,使用新的鏡像啟動容器
缺點
- 內存占用巨大,存在內存泄露問題, 以至於在IDEA上不敢使用自動導入, 不然每動一下build.gradle 就會卡半天, 8G內存都不夠用!!
- 編譯速度慢, 如果和Maven進行對比, 編譯速度和資源占用確實慢
書籍
Gradle in Action 中譯
如果沒有一點Groovy基礎, 閱讀自定義Task等一些高自定義的地方還是比較困惑
發行版本列表
官方網址 有各個版本的下載以及版本發行說明
似乎版本越高,內存占用越大, 從4.7降級回了4.2
4.6
發行說明 |
支持Junit5, 還有解決依賴沖突的一種聲明式方式
安裝配置
和maven使用同一個本地庫 只要加上 M2_HOME 環境變量即可, 值和 MAVEN_HOME 一樣, 並沒有用
SDKMAN方式
- 先安裝sdkman
- 使用Bash運行
curl -s "https://get.sdkman.io" | bash
sdk install gradle
即可安裝
Chocolate
- windows 上安裝 chocolate
- PowerShell中運行
wr https://chocolatey.org/install.ps1 -UseBasicParsing | iex
- 若操作系統默認禁止執行腳本,執行一次
set-executionpolicy remotesigned
後腳本順利執行 - Chocolatey在安裝包的時候,默認路徑是按照系統的默認路徑來的,如果想修改安裝路徑可以這樣處理:
- 執行“開始/運行”命令(或者WIN + R),輸入“regedit”,打開註冊表。
- 展開註冊表到下面的分支[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion],在右側窗口中找到名為“ProgramFilesDir”的字符串,雙擊把數值“C:\Program Files”修改為“D:\ProgramFiles”,確定退出後,即可更改常用軟件的安裝路徑了。
命令行選項
gradle 構建文件中的task名
: 直接運行task-b,--build-file test.gradle
指定運行腳本文件--offline
離線模式-P ,--project-prop
:配置參數 -Pmyprop=value-i,--info
: 打印info級別的輸出-s,--stacktrace
: 輸出錯誤棧-q,--quiet
:減少構建出錯時打印的錯誤信息tasks
: 輸出所有建立的taskproperties
: 輸出所有可用的配置屬性
守護進程
- 命令加上
--daemon
就會開啟一個守護進程,只會開啟一次, - 守護進程會在空閑3小時後銷毀
- 手動關閉
gadle --stop
- 構建時不采用守護進程
--no--daemon
Docker安裝
Docker 文檔
配置鏡像源
阿裏雲
參考博客: 配置Gradle的鏡像為阿裏雲鏡像
當前項目的build.gradle
repositories {
def aliyun = "http://maven.aliyun.com/nexus/content/groups/public/"
def abroad = "http://central.maven.org/maven2/"
maven {
url = aliyun
artifactUrls abroad
}
// 馬雲上自己的庫
maven {
url = "https://gitee.com/gin9/MavenRepos/raw/master"
}
mavenCentral()
jcenter()
}
全局的配置
~/.gradle/init.gradle
allprojects{
repositories {
def ALIYUN_REPOSITORY_URL = ‘http://maven.aliyun.com/nexus/content/groups/public‘
def ALIYUN_JCENTER_URL = ‘http://maven.aliyun.com/nexus/content/repositories/jcenter‘
all { ArtifactRepository repo ->
if(repo instanceof MavenArtifactRepository){
def url = repo.url.toString()
if (url.startsWith(‘https://repo1.maven.org/maven2‘)) {
project.logger.lifecycle "Repository ${repo.url} replaced by $ALIYUN_REPOSITORY_URL."
remove repo
}
if (url.startsWith(‘https://jcenter.bintray.com/‘)) {
project.logger.lifecycle "Repository ${repo.url} replaced by $ALIYUN_JCENTER_URL."
remove repo
}
}
}
maven {
url ALIYUN_REPOSITORY_URL
url ALIYUN_JCENTER_URL
}
}
}
關鍵配置文件
build.gradle
Hello World
task helloworld{
doLast {
printf ‘Hello World!‘
}
}
// 或者是 使用 << 代表doLast:
task helloworld<<{
println ‘Hello world!‘
}
- 運行:
gradle -q helloworld
初始化一個新項目
doc:building java application
dependency
- 和Maven用的是同一種方式 groupId artifactId version
使用本地依賴
compile files(‘lib/ojdbc-14.jar‘)
相對的根目錄是src同級目錄- 但是依賴的類別要多於Maven
- compile
- testCompile
- runtime
- provide
統一依賴管理
新建一個文件 dependency.gradle
ext {
ver = [
junit : ‘4.12‘,
]
libs = [
"junit" : "junit:junit:$ver.junit",
]
}
- 在 build.gradle 中引入
apply from: ‘dependency.gradle‘
- 使用依賴時 只需
compile libs[‘junit‘]
即使在子模塊中也是如此使用
配置Wrapper
在使用IDE生成項目的時候,可以選擇gradle的執行目錄,可以選
gradle wrapper
也可以選自己下載解壓的完整包
如果使用的不是這個wrapper,那麽別人在下載項目後,運行gradle命令就要先安裝gradle,使用wrapper更好
task wrapper(type: Wrapper){
gradleVersion = ‘4.8‘
distributionUrl = ‘限定訪問內網的URL‘
distributionPath = ‘包裝器被解壓縮放的相對路徑‘
}
- 運行 gradle wrapper 一次即可開始使用包裝器的腳本來構建項目了
- 生成gradle包管理器:
gradle wrapper --gradle-version 2.0
插件
有多種方式:
// 1
apply plugin: ‘java‘
// 2
apply{
‘java‘
}
// 3
plugins{
id ‘java‘
}
常用插件
lombok
使用Lombok的正確方式 | gradle lombok plugin
官方文檔
annotationProcessor ‘org.projectlombok:lombok:1.18.2‘
compileOnly ‘org.projectlombok:lombok:1.18.2‘
testAnnotationProcessor ‘org.projectlombok:lombok:1.18.2‘
testCompileOnly ‘org.projectlombok:lombok:1.18.2‘
- maven
apply plugin: "maven"
然後就能執行 install等命令了- gradle 4.8 用不了 需要這種方式
shadowJar 含依賴的jar進行打包
- docker 提供Docker操作
apply plugin: ‘docker‘
- buildscript dependencies 中添加
classpath(‘se.transmode.gradle:gradle-docker:1.2‘)
setting.gradle
項目的配置信息, 一般存在這個文件的時候, Gradle就會認為當前目錄是作為一個完整的根項目的, 並在當前目錄添加 .gradle 目錄
一般默認內容為rootProject.name = ‘‘
Gradle多模塊的構建
官網文檔 creating multi project builds
采用一個文件統一管理依賴, 然後各個子項目獨立引用 | 完整示例 JavaBase
統一配置依賴, 管理多模塊
如果要添加一個項目也簡單
- 直接新建一個目錄 test
- 目錄下新建空的文件 build.gradle
- 在根項目的 setting.gradle 中的include 加入 test (可以和文件夾不同名, build.gradle配置下就行了, 建議同名)
- gradle build 整個項目, 就完成了
- 最後就是手動的新建項目結構
另一種方式
參考博客:重拾後端之Spring Boot(六) -- 熱加載、容器和多項目
直接在build.gradle中配置
// 一個典型的根項目的構建文件結構
buildscript {
// 構建腳本段落可以配置整個項目需要的插件,構建過程中的依賴以及依賴類庫的版本號等
}
allprojects {
// 在這個段落中你可以聲明對於所有項目(含根項目)都適用的配置,比如依賴性的倉儲等
}
subprojects {
// * 在這個段落中你可以聲明適用於各子項目的配置(不包括根項目哦)
version = "0.0.1"
}
// * 對於子項目的特殊配置
project(‘:common‘) {
}
project(‘:api‘) {
}
project(‘:report‘) {
}
project(‘:common‘) {
dependencies {
compile("org.springframework.boot:spring-boot-starter-data-rest")
compile("org.springframework.boot:spring-boot-starter-data-mongodb")
compile("org.projectlombok:lombok:${lombokVersion}")
}
}
project(‘:api‘) {
dependencies {
compile project(‘:common‘)
compile("org.springframework.boot:spring-boot-devtools")
}
}
project(‘:report‘) {
dependencies {
compile project(‘:common‘)
compile("org.springframework.boot:spring-boot-devtools")
compile files(["lib/simsun.jar"])
compile("org.springframework.boot:spring-boot-starter-web")
}
}
- 有關多模塊的構建詳情參考這裏
- 參考更為規範的多項目構建
部署
War包
Jar包
- Gradle默認是只會打包源碼,並不會打包依賴(為了更方便依賴的作用)
- shadow插件官網文檔
- 添加
apply plugin: "maven"
然後就能和mvn install 一樣的執行 gradle install 了
上傳至構建倉庫
特別註意使用gpg, 如果按這下面的一堆文檔跟著做的話你要保證你的gpg小於等於2.0版本, 不然就卡在這裏了
參考項目
參考
官方文檔
參考博客
最簡單的方式就是利用碼雲等平臺創建私服
構建Docker鏡像
用 Docker、Gradle 來構建、運行、發布一個 Spring Boot 應用
build.gradle
apply plugin: ‘docker‘
buildscript {
ext {
springBootVersion = ‘2.0.1.RELEASE‘
}
repositories {
mavenCentral()
}
dependencies {
classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
classpath(‘se.transmode.gradle:gradle-docker:1.2‘)
}
}
task buildDocker(type: Docker, dependsOn: build) {
//設置自動上傳的話,命名就不能亂取了,倉庫名/鏡像名:tag
// push = true
test.enabled=false
applicationName = jar.baseName
dockerfile = file(‘src/main/docker/Dockerfile‘)
doFirst {
copy {
from war
into stageDir
}
}
}
Dockerfile
FROM frolvlad/alpine-oraclejdk8:slim
VOLUME /tmp
# 配置通配符是為了不受版本影響
ADD weixin*.war app.war
# ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.war"]
ENTRYPOINT ["java","-jar","/app.war"]
gradle buildDocker
即可構建鏡像- 運行
docker run --name web --link postgre:db -p 5678:8889 -it 鏡像
註意其中要關聯PostgreSQL的容器
第二種插件方式
參考 通過Gradle使用Docker部署 Spring Boot項目
Gradle 入門