1. 程式人生 > >Gradle 入門

Gradle 入門

不同 空閑 rst git sun flow 對比 創建 ide

目錄 start

  • Gradle
    • 書籍
    • 發行版本列表
    • 安裝配置
      • SDKMAN方式
      • Chocolate
      • 命令行選項
      • 守護進程
      • Docker安裝
    • 配置鏡像源
  • 關鍵配置文件
    • build.gradle
      • 初始化一個新項目
      • dependency
      • 統一依賴管理
      • 配置Wrapper
      • 插件
        • 常用插件
    • setting.gradle
      • Gradle多模塊的構建
        • 另一種方式
  • 部署
    • War包
    • Jar包
    • 上傳至構建倉庫
    • 構建Docker鏡像
      • 第二種插件方式

目錄 end |2018-08-03| 碼雲 | CSDN | OSChina
****************************************

Gradle

官方 guide | 其他 tutorial
參考博客: 零散知識點總結(1) - Gradle 使用配置總結

個人看法

參考: Gradle在大型Java項目上的應用

優缺點

Gradle大吐槽
官方對比Gradle和Maven

優點

  1. 相對於Maven, 配置文件簡潔了很多, 所以才入坑學習使用的
  2. 對於一些需要自定義的任務,因為核心為Groovy,所以實現能力高
    • 例如:將一個SpringBoot項目構建成一個鏡像,並tag上當前構建的鏡像為release,然後刪除舊有容器,使用新的鏡像啟動容器

缺點

  1. 內存占用巨大,存在內存泄露問題, 以至於在IDEA上不敢使用自動導入, 不然每動一下build.gradle 就會卡半天, 8G內存都不夠用!!
  2. 編譯速度慢, 如果和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在安裝包的時候,默認路徑是按照系統的默認路徑來的,如果想修改安裝路徑可以這樣處理:
  1. 執行“開始/運行”命令(或者WIN + R),輸入“regedit”,打開註冊表。
  2. 展開註冊表到下面的分支[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 : 輸出所有建立的task
  • properties : 輸出所有可用的配置屬性

守護進程

  • 命令加上 --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統一配置依賴, 管理多模塊

如果要添加一個項目也簡單

  1. 直接新建一個目錄 test
  2. 目錄下新建空的文件 build.gradle
  3. 在根項目的 setting.gradle 中的include 加入 test (可以和文件夾不同名, build.gradle配置下就行了, 建議同名)
  4. gradle build 整個項目, 就完成了
  5. 最後就是手動的新建項目結構

另一種方式

參考博客:重拾後端之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 入門