gradle簡(jiǎn)明教程

gradle簡(jiǎn)明教程

前言

本文沒(méi)有 gradle 與 maven 對(duì)比,也沒(méi)有深入 gradle 實(shí)現(xiàn)。只有 gradle 從 0 開(kāi)始使用的說(shuō)明。

  • 簡(jiǎn)介
  • 安裝
  • 新建一個(gè) gradle 項(xiàng)目
  • 引入一個(gè) gradle 項(xiàng)目
  • 常見(jiàn)問(wèn)題
  • 交流

簡(jiǎn)介

gradle 是一個(gè)構(gòu)建工具。負(fù)責(zé)管理項(xiàng)目依賴,組織項(xiàng)目結(jié)構(gòu),完成項(xiàng)目構(gòu)建的工作。

安裝

從 官網(wǎng) 下載,解壓即可,并將 bin/gradle 命令加入到 path 中。

新建一個(gè) gradle 項(xiàng)目

  1. 新建一個(gè)文件夾作為項(xiàng)目文件夾

    mkdir project-example
    cd project-example
    
  2. 使用 gradle 初始化

    gradle init
    

    然后目錄下會(huì)生成這些文件

    build.gradle       // 構(gòu)建腳本文件,主要的構(gòu)建配置都在這里寫
    gradle               // 存放gradle wrapper 執(zhí)行配置和工具的文件夾,
    gradlew             // gradle wrapper 執(zhí)行腳本文件,用來(lái)在沒(méi)有安裝 gradle 的情況下執(zhí)行 gradle 命令。當(dāng)然,第一次執(zhí)行時(shí)會(huì)下載 gradle。
    gradlew.bat       // gradle wrapper 執(zhí)行腳本文件的 windows 版
    settings.gradle  // 項(xiàng)目配置,指明根項(xiàng)目名字和引入的 module
    
  3. 修改 build.gradle 文件,結(jié)果像下面這樣

    /*
    聲明插件,聲明插件的方式有兩種,下面這種是 2.* 版本之后的新的定義方式。可以聲明兩種插件:
    1. 官方內(nèi)置插件,如 java,idea。
    2. 在 gradle 插件中心注冊(cè)過(guò)的插件,如第三個(gè)就是,這種要還要聲明版本。
    聲明插件的目的是因?yàn)椴寮?huì)提供很多 task,而每一個(gè) task 就是一段構(gòu)建腳本,可以執(zhí)行不同的任務(wù)。比如 compileJava,test 等。
    */
    plugins {
        id 'java'
        id 'idea'
        id "com.yangxiaochen.scaffold" version "1.0.2"
    }
    
    /*
    聲明 group 和 版本,而 project 的名字在 settings.gradle 文件中,而子 module ,或者又稱為 sub projects 的名字通常和文件夾名字一樣。
    */
    group 'com.yangxiaochen.gradle'
    version '1.0.0-SNAPSHOT'
    
    /*
    聲明依賴倉(cāng)庫(kù),這里使用的是 jcenter,也可以使用其他的如 mavenCentral 等。也可以聲明多個(gè),會(huì)按順序查找。
    */
    repositories {
        jcenter()
    }
    
    /*
    聲明依賴
    */
    dependencies {
        compile 'org.slf4j:slf4j-api:1.7.21'
        testCompile 'junit:junit:4.12'
    }
    

    編輯 settings.gradle 文件如下,聲明了project name

    rootProject.name = 'project-example'
    // include 'sub-project'
    
  4. 引入到 Idea IDE 中

    gradle idea
    

    目錄下新生成了三個(gè)文件

    project-example.iml
    project-example.ipr
    project-example.iws
    

    接下來(lái)只要用 Idea IDE 來(lái) open project-example.ipr 文件,就可以引入 project 了, 之后每當(dāng)

    1. 依賴更改

    2. 目錄結(jié)構(gòu)更改

    只要執(zhí)行 gradle cleanIdea idea 就可以刷新這三個(gè)文件,Idea IDE 就會(huì)重新加載識(shí)別項(xiàng)目了。

    我的經(jīng)驗(yàn)是不要使用 Idea IDE 來(lái)直接用 build.gradle 來(lái)打開(kāi)文件,因?yàn)?Idea IDE 在解析 build.gradle 文件時(shí)有其他操作,而且 Idea IDE 與 gradle 版本有時(shí)會(huì)不太兼容,導(dǎo)致項(xiàng)目解析錯(cuò)誤;而使用 gradle 來(lái)生成 Idea IDE 工程文件的方式就不會(huì)有問(wèn)題,而且速度更快,更容易debug。

  5. 引入之后,還需要生成 src 文件夾和 sub project

    gradle createSrc
    gradle idea
    
    // 或者直接連起來(lái)些,像這樣
    gradle createSrc idea
    gradle createModule --name foo idea
    

    createSrccreateModule都是插件 com.yangxiaochen.scaffold里的 task,而 ideacleanIdea 是插件 idea提供的 task

引入一個(gè) gradle 項(xiàng)目

跟上一節(jié)創(chuàng)建一個(gè) gradle 項(xiàng)目類似,引入idea插件,然后生成 Idea IDE 的工程文件,再 open 即可

常見(jiàn)問(wèn)題

插件選擇

內(nèi)置插件都在官方文檔中有說(shuō)明,除了內(nèi)置插件外, 可以 Search Gradle plugins,gradle 插件的官方倉(cāng)庫(kù)。

build速度慢

速度慢一般來(lái)說(shuō)是依賴更新慢,因?yàn)楸娝苤脑?,?guó)內(nèi)使用國(guó)外的倉(cāng)庫(kù)速度并不樂(lè)觀,所以可以替換repositories, 使用阿里云的倉(cāng)庫(kù)

repositories {
  maven {
    url "http://maven.aliyun.com/nexus/content/groups/public"
  }
}

再者, 有的同學(xué)使用私服, 可能是公司搭建的. 這個(gè)有時(shí)候會(huì)有不穩(wěn)定, 且有時(shí)需要認(rèn)證的情況. 看稍后的章節(jié).

如何debug

gradle 運(yùn)行中的提示并不算很友好, 尤其在鏈接倉(cāng)庫(kù)和下載jar包時(shí), 在連接有問(wèn)題的時(shí)候, 經(jīng)常沒(méi)有提示(新版本的可能好一些.)

經(jīng)常使用

gradle idea -i
gradle idea -id

還可以加入 --no-daemon 參數(shù)來(lái)避免daemon啟動(dòng)產(chǎn)生的日志干擾
gradle idea -id --no-daemon
一般來(lái)說(shuō)就能定位到構(gòu)建問(wèn)題.

來(lái)獲取更多的信息. 比較常見(jiàn)的卡住是因?yàn)?code>倉(cāng)庫(kù)鏈接不上, jar包下載鏈接不上, 又不返回 response (私有倉(cāng)庫(kù)偶爾有問(wèn)題), 資源下載緩慢, 倉(cāng)庫(kù)需要認(rèn)證登陸

  • 倉(cāng)庫(kù)連接不上: 檢查倉(cāng)庫(kù)地址, 檢查網(wǎng)絡(luò).
  • 資源無(wú)法連接又沒(méi)有response: 這種通常會(huì)在上面打出的日志中體現(xiàn), 請(qǐng)求一個(gè) url 便沒(méi)有響應(yīng).
  • 下載緩慢: 更換倉(cāng)庫(kù), 或者忍耐下第一次, 以后會(huì)好很多

在 IDEA 刷新有問(wèn)題時(shí), 可以執(zhí)行這個(gè)命令debug, 一般這個(gè)命令能成功, 那么 IDEA 刷新通常也能成功. (請(qǐng)注意版本問(wèn)題, 命令行里執(zhí)行的 gradle 版本需要跟 IDEA 里配置的 gradle 版本一致)

私服使用和包管理混亂引起的問(wèn)題

私服使用中會(huì)有以下問(wèn)題:

  1. 不穩(wěn)定, 偶爾服務(wù)無(wú)響應(yīng).

  2. 配置出錯(cuò), 無(wú)法 proxy maven 主倉(cāng)庫(kù). 或者出現(xiàn)私服中存在第三方包但是卻不完整到時(shí)無(wú)法下載.

    一般來(lái)說(shuō)會(huì)嘗試把第三方倉(cāng)庫(kù)配置到私服之前:

    maven {
      url "http://maven.aliyun.com/nexus/content/groups/public"
    }
    
    maven {
      url "http://你家私服地址/"
      credentials {
        username "xxx"
        password "xxx"
      }
      authentication {
         basic(BasicAuthentication)
      }
    }
    

    這樣先去第三方查找, 再到私服查找.

  3. 私服有認(rèn)證. 可以參照第二條私服的認(rèn)證方式. 其中

      authentication {
         basic(BasicAuthentication)
      }
    

    是可選填的, 不填的話會(huì)自動(dòng)識(shí)別認(rèn)證方式.

  4. 打包方式不完整. 有的同學(xué)上傳包的時(shí)候雖然包含了編譯后的jar包, pom文件, 但是有時(shí)卻沒(méi)有把source包上傳, gradle 默認(rèn)是會(huì)下載source的, 如果沒(méi)有, 私服返回404還好, 最怕會(huì)卡主(遇到過(guò)私服雖然沒(méi)有這個(gè)文件卻遲遲不返回response的情況.), 所以, 如果遇到這種問(wèn)題, 可以:

    idea {
     module {
         downloadJavadoc = false
         downloadSources = false
     }
    }
    

    不讓 IDEA 刷新的時(shí)候下載源碼和文檔, 萬(wàn)不得已還是不要用.

常用命令或參數(shù)

--refresh-dependencies 刷新依賴,刷新那些SNAPSHOT的依賴,類似于 maven 的 -U 參數(shù)

gradle tasks 列出所有可執(zhí)行的task

gradle tasks --all 列出所有可執(zhí)行的task, 并附加上 mudole

gradle help --task taskName 查看一個(gè)task的幫助, 不過(guò)并不是所有task都有, 因?yàn)閠ask都是可以自己來(lái)實(shí)現(xiàn)的.

gradle idea -id 用來(lái)debug IDEA進(jìn)行刷新時(shí)遇到的問(wèn)題, 一般這個(gè)任務(wù)能成功, 刷新就能成功. 注意使用的 gradle 版本要一致.

--no-daemon 不是使用daemon進(jìn)行構(gòu)建. daemon的作用是不用每次 build 都再啟動(dòng)一個(gè)進(jìn)程, 節(jié)省時(shí)間. 但卻會(huì)在我們 debug 問(wèn)題的時(shí)候不停的生產(chǎn)日志, 產(chǎn)生干擾.

依賴沖突處理

可以通過(guò)命令來(lái)查看一個(gè)項(xiàng)目的依賴

gradle webapp:dependencies --configuration=compile

不同于maven的最近原則,gradle 依賴使用的是最新原則.

依賴排除, 通??梢允褂?/p>

compile("org.springframework.boot:spring-boot-starter-web") {
    exclude module: "spring-boot-starter-logging"
}

這樣的語(yǔ)法, 還有更為粗暴直接的:

configurations {
    all*.exclude group: 'ch.qos.logback', module: 'logback-classic'
    all*.exclude group: 'ch.qos.logback', module: 'logback-core'
}

參考資料

官方文檔相當(dāng)?shù)脑敿?xì),且附有很多example,配合 gradle 安裝包里的 example 源文件閱讀

交流

歡迎加入群 661035226,gradle,spring,activiti 交流

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,554評(píng)論 19 139
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 47,273評(píng)論 6 342
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,036評(píng)論 25 709
  • 這個(gè)學(xué)期笑寶爺爺奶奶送上學(xué)的次數(shù)多很多,難得今天麻麻送,昨兒晚上就跟笑寶把今日早上安排妥當(dāng)。結(jié)果我提早睡,一覺(jué)醒來(lái)...
    藤花舊館閱讀 312評(píng)論 0 1
  • 性是什么?在我看來(lái),性既是生命的傳承,又是生命的大和諧。 在中國(guó),談性色變是一件很普遍的現(xiàn)象,無(wú)論是在工作單位、學(xué)...
    埃姆先生閱讀 3,299評(píng)論 7 6

友情鏈接更多精彩內(nèi)容