Gradle 入門

来源:https://www.cnblogs.com/kuangcp/archive/2018/08/04/9420621.html
-Advertisement-
Play Games

`目錄 start` "Gradle" "書籍" "發行版本列表" "安裝配置" "SDKMAN方式" "Chocolate" "命令行選項" "守護進程" "Docker安裝" "配置鏡像源" "關鍵配置文件" "build.gradle" "初始化一個新項目" "dependency" "統一依 ...


目錄 start

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

常用插件

官方文檔

  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項目


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 在企業應用中RPC的使用可以說是十分的廣泛,使用該技術可以方便的與各種程式交互而不用考慮其編寫使用的語言。 如果你對RPC的概念還不太清楚,可以點擊這裡。 現今市面上已經有許多應用廣泛的RPC框架,比如GRPC,而今天我們要介紹的是同樣使用廣泛的Apache Thrift。這篇文章將帶你安全越過所有 ...
  • 繼續統計演算法,這次也沒什麼特別的,還沒到那麼深入,也是比較基礎的1、方差-樣本2、協方差(標準差)-樣本3、變異繫數4、相關係數 依然是先造個list,這次把這個功能寫個函數,方便以後調用,另外上一篇寫過的函數這次也會繼承def create_rand_list(min_num,max_num,co ...
  • 背景: 利用phpspreadsheet可以輕鬆的解析excel文件,但是phpspreadsheet的記憶體消耗也是比較大的,我試過解析將近5M的純文字excel記憶體使用量就會超過php預設的最大記憶體128M。 當然這可以用調節記憶體大小的方法來解決,但是在併發量大的時候就比較危險了。所以今天介紹下第 ...
  • 7.1.糗事百科 安裝 pip install pypiwin32 pip install Twisted-18.7.0-cp36-cp36m-win_amd64.whl pip install scrapy 創建和運行項目 代碼 qsbk_spider.py item.py pipelines.p ...
  • 前言 微信小程式不存在 ,那麼它是如何實現數據請求功能的呢?在微信中提供了 的調用 ,這個是很不錯的。下麵就講一下如何請求數據,簡單到不行。 wx.request 看文檔時,提供了示例模板如下: 如何調取數據這是個難題,但是要模擬調用是有可能的。因為有個網址:https://easy mock.co ...
  • 今天我們來說一下for 和while迴圈 Python迴圈語句的控制結構圖如下所示: for 是Python程式員使用最多的語句,for 迴圈用於迭代容器對象中的元素,這些對象可以是列表、元組、字典、集合、文件,甚至可以是自定義類或者函數 Python 布爾迴圈實例: 輸出如下:a b c d in ...
  • 類中可以存在的成員: 類載入過程: 1、JVM會先去方法區中找有沒有類對應的.class存在,如果有,就直接使用;如果沒有,就把對應類的.class載入到方法區; 2、將.class載入到方法區的時候,分為兩部分,首先將非靜態內容載入到方法區的非靜態區域內; 3、再將靜態內容載入到方法區的靜態區域內 ...
  • 下麵整合SpringMVC和MyBatis框架,並做一個小案例 創建資料庫springmvc,並創建兩張表,加入一些數據: 兩張表:商品表,用戶表 新建Dynamic Web Project: 導包: 先把簡單的資料庫配置完成: db.properties: MyBatis的配置文件sqlMapCo ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...