新構建工具__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:
    1. 從Gradle官網下載Gradle,地址爲:
      https://gradle.org
      
    2. 配置環境變量:GRADEL_HOME
    3. 添加到Path,%GRADLE_HOME%\bin;
    4. 驗證是否安裝成功,gradle -v

    成功如圖所示:
    在這裏插入圖片描述

2.2 Groovy基礎知識–理論介紹

  • Groovy是什麼?
    • Groovy是用於Java虛擬機的一種敏捷的動態語言,它是一種成熟的面向對象編程語言,既可以用於面向對象編程,又可以用作純粹的腳本語言。使用該種語言不必編寫過多的代碼,同時又具有閉包和動態語言中的其他特性;
  • 與Java比較?
    • Groovy完全兼容Java的語法
    • 分號是可選的(一行代碼的分號可以省略)
    • 類、方法默認是public的;
    • 編譯器給屬性自動添加getter/setter方法
    • 屬性可以直接用點號獲取
    • 最後一個表達式的值會被作爲返回值;
    • ==等同於equals(),不會有NullPointerExceptions;
  • 高效的Groovy特性
    • assert語句
    • 可選類型定義
    • 可選的括號
    • 字符串
    • 集合API
    • 閉包

2.3 Groovy高效特性

  1. 可選的類型定義
def version=1
  1. assert
def version=1
assert version == 2
  1. 括號是可選的
def version=1
println version
  1. 字符串(單引號是字符串,雙引號可以插入變量,三引號可以換行)
def s1='my'
def s2="my name is ${version}"
def s3='''my
name
is
zhangsan'''
  1. 集合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項目

  1. 選擇 File -> New Project -> 選擇Gradle. 如圖所示:
    在這裏插入圖片描述
  2. 根據實際填入: GroupId、ArtifactId、Version
  3. 選擇GradleHome路徑、Gradle JVM路徑,如圖所示:
    在這裏插入圖片描述
  4. 根據實際填入: Project Name 、 Project Location(工程路徑)
  5. 創建項目成功後,自動生成了配置文件build.gradle,如圖所示:
    在這裏插入圖片描述
  6. 目錄結構如下:
    在這裏插入圖片描述
  7. IDEA右側小窗口,點擊Gradle-> Tasks->build,裏面是常用的命令;
    1. clean: 與Maven類似
    2. build: 構建,執行的是所屬項目下的 build.gradle文件,如果使用的是java的插件,生成的也是jar包;
    3. jar,與build命令類似,把當前源文件編譯打成jar包;

    jar包在build目錄的libs下面,如圖所示:
    在這裏插入圖片描述

  • 啓動jar包:
  • 如果裏面沒有main方法,則可以被其他項目所引用
  • 如果裏面有main方法,我們可以通過命令運行,如圖所示:
    在這裏插入圖片描述

3.3 TODO-WEB版

  1. 如圖所示,提供一個web應用程序
    在這裏插入圖片描述
  2. 我們需要打成war包,在build.gradle進行修改,添加war插件:
    apply plgin: 'war'
    

    如圖所示:
    在這裏插入圖片描述

  3. 點擊 war,構建成war包。 將此war包放入tomcat中進行執行,放入webapps,運行tomcat,訪問web頁面能成功顯示則說明成功;

gradle有很多構建工具,我們可以訪問官網及其他文檔瞭解詳細;

四. 高級應用

4.1 構建腳本介紹

  • 構建塊:

    • Gradle構建中的兩個基本概念是項目(project)和任務(task),每個構建至少包含一個項目,項目中包含一個或多個任務。在多項目構建中,一個項目可以依賴於其他項目;類似的,任務可以形成一個依賴關係圖來確保他們的執行順序;
  • 項目-任務 關係:
    在這裏插入圖片描述

  • 項目(project)

    • 一個項目代表一個正在構建的組件(比如一個jar文件),當構建啓動後,Gradle會基於build.gradle實例化一個org.gradle.api.Project類,並且能夠通過project變量使其隱式可用;
    • 屬性:
      1. group: 組
      2. name:名,不能重名
      3. version:版本號

      通過組,名稱和版本的組合,最終確定一個唯一的項目;

      1. apply: 應用一個插件
      2. dependencies:聲明用到哪些依賴
      3. repositories:告訴gradle去哪裏的倉庫去找這些依賴jar包(這裏可以將中央倉庫替換爲公共倉庫)
      4. task: 用來聲明項目中有哪些人物
      5. ext:定義屬性,直接引用
      6. gradle.properties:鍵值對定義屬性
  • 任務(task)

    • 概述:
      • 任務對應org.gradle.api.Task. 主要包括人物動作和任務依賴。任務動作定義了一個最小的工作單元。可以定義依賴於其他任務、動作序列和執行條件;
    • 字段:
      • dependsOn: 聲明任務依賴
      • doFirst、doLast:簡寫,表示在任務之前或者之後添加一個動作;

    當我們執行一個jar任務時,會先進行編譯等其他任務操作。說明jar任務是依賴於其他任務的;
    任務在一個項目中是非必需的。同時一般情況下我們使用插件提供的任務即可,若有不滿足的,可自定義任務;

4.2 自定義任務

  • 自定義任務,自動創建java目錄

    1. 在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);
      }
      

    如圖所示:
    在這裏插入圖片描述

  • 新建一個任務,可引入別的任務基礎上新建,如圖所示:
    在這裏插入圖片描述

自定義任務在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'
    }
    
  • 測試發現:
    1. 任何集成至junit.framework.TestCasegroovy.util.GroovyTestCase的類
    2. 任何被@RunWith註解的類
    3. 任何至少包含一個被@Test註解的類

4.8 發佈

  • 通過引入maven-publish插件,並配置了publishing內容,我們可以將生成的jar包推送至本地倉庫或者遠程公共倉庫,如圖所示:
    在這裏插入圖片描述

五. 課程總結

  1. 安裝gradle
  2. groovy知識
  3. 構建腳本
  4. 依賴管理
  5. 測試
  6. 發佈
  7. 如圖所示:
    在這裏插入圖片描述

課程已結束,學習無終點,祝大家好運。點擊關注,查看更多,期待更多~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章