Gradle 入門

目錄 starthtml

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

Gradle

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

我的見解github

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

優缺點spring

Gradle大吐槽
官方對比Gradle和Mavenmongodb

優勢docker

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

缺點windows

  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'
}

經常使用插件

官方文檔

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默認是隻會打包源碼,並不會打包依賴(爲了更方便依賴的做用)
  • 添加 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項目

相關文章
相關標籤/搜索