新一代構建工具gradle
一. 課程介紹
1.1 項目自動化介紹
-
石器時代:
- 依賴管理,測試,打包,上傳
-
構建工具的作用:
- 依賴管理
- 測試、打包、發佈
- 機器能幹的事情,自己絕不動手;
-
主流構建工具:
- Ant:編譯、測試、打包
- Maven:依賴管理、發佈
- Gradle:Groovy(避免了囉嗦和臃腫,具有更高的靈活性和可擴展性)
-
Gradle:
- 它是一個開源的項目自動化構建工具,建立在Apache Ant和Apache Maven概念的基礎上,並引入了基於Groovy的特定領域語言(DSL),而不再使用XML形式管理構建腳本;
1.2 課程介紹
- 快速嚐鮮:
- 準備使用Gradle
- 第一個Gradle項目
- 基本原理:
- 構建腳本介紹
- 依賴管理
- 深入實戰:
- 多項目構建
- 測試
- 發佈
二. 準備使用Gradle
2.1 gradle的安裝
- 確保已經安裝了JDK,打開cmd命令窗口,輸入以下命令校驗:
java -version
成功如圖所示:
- 安裝Gradle:
- 從Gradle官網下載Gradle,地址爲:
https://gradle.org
- 配置環境變量:GRADEL_HOME
- 添加到Path,%GRADLE_HOME%\bin;
- 驗證是否安裝成功,gradle -v
成功如圖所示:
- 從Gradle官網下載Gradle,地址爲:
2.2 Groovy基礎知識–理論介紹
- Groovy是什麼?
- Groovy是用於Java虛擬機的一種敏捷的動態語言,它是一種成熟的面向對象編程語言,既可以用於面向對象編程,又可以用作純粹的腳本語言。使用該種語言不必編寫過多的代碼,同時又具有閉包和動態語言中的其他特性;
- 與Java比較?
- Groovy完全兼容Java的語法
- 分號是可選的(一行代碼的分號可以省略)
- 類、方法默認是public的;
- 編譯器給屬性自動添加getter/setter方法
- 屬性可以直接用點號獲取
- 最後一個表達式的值會被作爲返回值;
- ==等同於equals(),不會有NullPointerExceptions;
- 高效的Groovy特性
- assert語句
- 可選類型定義
- 可選的括號
- 字符串
- 集合API
- 閉包
2.3 Groovy高效特性
- 可選的類型定義
def version=1
- assert
def version=1
assert version == 2
- 括號是可選的
def version=1
println version
- 字符串(單引號是字符串,雙引號可以插入變量,三引號可以換行)
def s1='my'
def s2="my name is ${version}"
def s3='''my
name
is
zhangsan'''
- 集合api
// list
def buildTools=[‘ant’,‘maven’]
buildTools << ‘gradle’
assert buildTools.getClass() == ArrayList
assert buildTools.size() == 3
在groovy中,集合對應的是ArrayList,以上兩個assert斷言結果均爲true
// map
def buildYears= [‘ant’:2000,‘maven’:2004]
buildYears.gradle=2009
println buildYears.ant
println buildYears[‘gradle’]
println buildYears.getClass()
在Groovy中,map對應的是LinkedHashMap;
// 閉包
它類似一個方法或者代碼塊,簡單瞭解一下即可。需要詳細瞭解可百度;
2.4 Groovy基礎知識-- 重點
- 代碼如下:
apply plugin:'java' version = '0.1' // 閉包 repositories { mavenCentral() } // 閉包 dependencies { compile 'commons-codec:commons-codec:1.6' }
默認作用域都是public
每一個Groovy構建腳本都有一個Project實例
三. 第一個Gradle項目
3.1 第一個Gradle項目介紹
- 實例介紹:
- ToDO應用程序,只實現添加待辦事項
- Java應用程序版
- Web版
3.2 創建一個Gradle項目
- 選擇 File -> New Project -> 選擇Gradle. 如圖所示:
- 根據實際填入: GroupId、ArtifactId、Version
- 選擇GradleHome路徑、Gradle JVM路徑,如圖所示:
- 根據實際填入: Project Name 、 Project Location(工程路徑)
- 創建項目成功後,自動生成了配置文件build.gradle,如圖所示:
- 目錄結構如下:
- IDEA右側小窗口,點擊Gradle-> Tasks->build,裏面是常用的命令;
- clean: 與Maven類似
- build: 構建,執行的是所屬項目下的 build.gradle文件,如果使用的是java的插件,生成的也是jar包;
- jar,與build命令類似,把當前源文件編譯打成jar包;
jar包在build目錄的libs下面,如圖所示:
- 啓動jar包:
- 如果裏面沒有main方法,則可以被其他項目所引用
- 如果裏面有main方法,我們可以通過命令運行,如圖所示:
3.3 TODO-WEB版
- 如圖所示,提供一個web應用程序
- 我們需要打成war包,在build.gradle進行修改,添加war插件:
apply plgin: 'war'
如圖所示:
- 點擊 war,構建成war包。 將此war包放入tomcat中進行執行,放入webapps,運行tomcat,訪問web頁面能成功顯示則說明成功;
gradle有很多構建工具,我們可以訪問官網及其他文檔瞭解詳細;
四. 高級應用
4.1 構建腳本介紹
-
構建塊:
- Gradle構建中的兩個基本概念是項目(project)和任務(task),每個構建至少包含一個項目,項目中包含一個或多個任務。在多項目構建中,一個項目可以依賴於其他項目;類似的,任務可以形成一個依賴關係圖來確保他們的執行順序;
-
項目-任務 關係:
-
項目(project)
- 一個項目代表一個正在構建的組件(比如一個jar文件),當構建啓動後,Gradle會基於build.gradle實例化一個org.gradle.api.Project類,並且能夠通過project變量使其隱式可用;
- 屬性:
- group: 組
- name:名,不能重名
- version:版本號
通過組,名稱和版本的組合,最終確定一個唯一的項目;
- apply: 應用一個插件
- dependencies:聲明用到哪些依賴
- repositories:告訴gradle去哪裏的倉庫去找這些依賴jar包(這裏可以將中央倉庫替換爲公共倉庫)
- task: 用來聲明項目中有哪些人物
- ext:定義屬性,直接引用
- gradle.properties:鍵值對定義屬性
-
任務(task)
- 概述:
- 任務對應org.gradle.api.Task. 主要包括人物動作和任務依賴。任務動作定義了一個最小的工作單元。可以定義依賴於其他任務、動作序列和執行條件;
- 字段:
- dependsOn: 聲明任務依賴
- doFirst、doLast:簡寫,表示在任務之前或者之後添加一個動作;
當我們執行一個jar任務時,會先進行編譯等其他任務操作。說明jar任務是依賴於其他任務的;
任務在一個項目中是非必需的。同時一般情況下我們使用插件提供的任務即可,若有不滿足的,可自定義任務; - 概述:
4.2 自定義任務
-
自定義任務,自動創建java目錄
- 在build.gradle中創建代碼:
def createDir={ path-> File dir =new File(path) if(!dir.exists()){ dir.mkdirs(); } } task makeJavaDir(){ def paths=['src/main/java','src/main/resources','src/test/java'] } doFirst{ paths.forEach(createDir); }
如圖所示:
- 在build.gradle中創建代碼:
-
新建一個任務,可引入別的任務基礎上新建,如圖所示:
自定義任務在other下;
4.3 構建生命週期
- 構建生命週期,如圖所示:
在配置階段就要決定任務的執行順序以及關係,而執行時則直接執行代碼了;在執行時是不能再去決定任務的執行順序等操作;
- 詳細生命週期:
- 初始化: 初始化項目,確定有哪些項目要參與到構建中來;
- 配置階段:生成task的依賴關係及執行順序
- 執行階段:執行task的動作
4.4 依賴管理
-
概述:
- 幾乎所有的基於JVM的軟件項目都需要依賴外部類庫來重用現有的功能。自動化的依賴管理可以明確依賴的版本,可以解決因傳遞性依賴帶來的版本衝突。
-
工件座標:
- group、name、version
根據這三種,可以唯一確定一個項目;
-
常用倉庫:
- mavenLocal: 本機倉庫
- mavenCentral/jcenter: 公共倉庫
- 自定義maven倉庫
- 文件倉庫
-
依賴的傳遞性
- B依賴A,如果C依賴B,那麼C依賴A
正是依賴的傳遞性,纔會出現依賴衝突;
-自動化依賴管理:
-
依賴階段配置:
- compile、 runtime
- testCompile、testRuntime
-
依賴階段關係:
源代碼依賴的,測試一定依賴。測試依賴的,源代碼不一定依賴;
-
serch.maven.org 中央倉庫
-
添加依賴:
dependencies{ compile 'ch.qos.logback:logback-classic:1.2.1', testCompile group:'junit',name:'junit',version:'...' }
-
添加依賴後,在右側Source Sets下會出現相應的jar包,在Dependencies中;
-
倉庫配置如下:
倉庫可以配置多個,以前後順序,在前面的優先執行;同時中央倉庫在國外,可能下載網速較慢,我們可以使用公司公共倉庫,提高下載速度;
4.5 解決版本衝突
- 查看依賴報告
- 排除依賴jar包
- 強制制定一個版本(可以制定一個最新的版本)
gradle可以幫我們處理版本衝突,它會默認使用最新的jar包。如果這樣也解決不了,我們可以修改默認解決策略,然後查看依賴報告;
- 修改默認解決策略:
configurations.all{ resolutionStrategy{ failOnVersionConflict(); } }
如圖所示:
- 排除一個jar包,如圖所示:
- 強制指定一個版本
configurations.all{ resolutionStrategy{ force 'org.slf4j:slf4j-api:1.7.24' } }
如圖所示:
4.6 多項目構建
-
項目模塊化
- 在企業項目中,包層次和類關係比較複雜,把代碼拆分成模塊通常是最佳實踐,這需要你清晰的劃分功能的邊界,比如把業務邏輯和數據持久化拆分開來。項目符合高內聚低耦合時,模塊化就變得很容易,這是一條非常好的軟件開發實踐;
- 使用compile project(":要引入的項目名"),可以引入其他項目進此項目中,如圖所示:
-
settings.gradle:用來構建多項目的。
-
當我們在根目錄的 build.gradle配置時,一些通用的配置可以在根目錄進行配置,以減少重複配置;
- 如圖所示:
- 如圖所示:
4.7 自動化測試
- 一些開源的測試框架比如JUnit,TestNG能夠幫助你編寫可複用的結構化測試,爲了運行這些測試,你要先編譯它們,就像編譯源代碼一樣。測試代碼的作用僅僅用於測試的情況,不應該被髮布到生產環境中,需要把源代碼和測試代碼分開來。
- 測試配置:
dependencies{ testCompile 'junit:junit:4.11' }
- 測試發現:
- 任何集成至
junit.framework.TestCase
或groovy.util.GroovyTestCase
的類 - 任何被@RunWith註解的類
- 任何至少包含一個被@Test註解的類
- 任何集成至
4.8 發佈
- 通過引入maven-publish插件,並配置了publishing內容,我們可以將生成的jar包推送至本地倉庫或者遠程公共倉庫,如圖所示:
五. 課程總結
- 安裝gradle
- groovy知識
- 構建腳本
- 依賴管理
- 測試
- 發佈
- 如圖所示:
課程已結束,學習無終點,祝大家好運。點擊關注,查看更多,期待更多~