慕課網_《新一代構建工具gradle》學習總結

時間:2017年05月16日星期二
說明:本文部份內容均來自慕課網。@慕課網:http://www.imooc.com
教學示例源碼:無
我的學習源碼:https://github.com/zccodere/s...java

第一章:課程介紹

1-1 項目自動化介紹

石器時代:自動化構建工具產生以前git

依賴管理:將全部使用到的jar包放到lib目錄下,不易管理,易出錯
測試:能不寫就不寫,一個一個運行測試
打包:經過eclipse的export導出jar包或war包
上傳:經過ftp工具進行上傳到服務器解壓運行

構建工具的做用github

依賴管理:各類jar包及版本
測試、打包、發佈:自動執行測試、打包、發佈到指定的地方
機器能幹的活,毫不本身動手

主流構建工具web

Ant:編譯、測試、打包
Maven:依賴管理、發佈
Gradle:Groovy語言管理構建腳本

示意圖編程

clipboard.png

Gradle是什麼api

一個開源的項目自動化構建工具,創建在Apache Ant和Apache Maven概念的基礎上,並引入基於Groovy的特定領域語言(DSL),而再也不使用XML形式管理構建腳本。

Gradle能作什麼數組

進行依賴管理
自動化運行測試
打包
發佈到指定地方

1-2 課程介紹

快速嚐鮮服務器

準備使用Gradle
第一個Gradle項目

基本原理閉包

構建腳本介紹
依賴管理

深刻實戰app

多項目構建
測試
發佈

示意圖

clipboard.png

第二章:準備使用Gradle

2-1 gradle安裝

安裝

確保已近安裝JDK,java –version驗證是否已經安裝。
從Gradle官網下載Gradle,https://gradle.org
配置環境變量,GRADLE_HOME
添加到path,%GRADLE_HOME%\bin;
驗證是否安裝成功,gradle –v

2-2 Groovy理論介紹

Groovy是什麼

Groovy是用於Java虛擬機的一種敏捷的動態語言,它是一種成熟的面向對象編程語言,既能夠用於面向對象編程,又能夠用做純碎的腳本語言。使用該種語言沒必要編寫過多的代碼,同時又具備閉包和動態語言中的其餘特性。

與Java比較

Groovy徹底兼容Java的語法
分號是可選的
類、方法默認是public的
編譯器給屬性自動添加getter/setter方法
屬性能夠直接用點號獲取
最後一個表達式的值會被做爲返回值
「==」等同於「equals()」,不會有NullPointerExceptions

高效的Groovy特性

assert語句
可選類型定義
可選的括號
字符串
集合API
閉包

2-3 Groovy與Java比較

Java語法編寫標準JavaBean

代碼演示:

public class ProjectVersion{
    private int major;
    private int minor;

    public ProjectVersion(int major,int minor){
        this.major = major;
        this.minor = minor;
    }

    public int getMajor(){
        return major;
    }

    public void setMajor(int major){
        this.major = major;
    }

    public int getMinor(){
        return minor;
    }

    public void setMinor(int minor){
        this.minor = minor;
    }
}

Groovy語言編寫JavaBean

class ProjectVersion{
    private int major
    private int minor
    ProjectVersion(int major,int minor){
        this.major = major
        this.minor = minor
    }
}

2-4 Groovy高效特性

Groovy高效特性

可選的類型定義
assert斷言
括號是可選的
字符串
集合API

代碼演示:

// 高效特性
// 1 可選的類型定義
def version = 1

// 2 assert
//assert version == 2

// 3 括號是可選的
println version

// 4 字符串
def s1 = 'imooc'
def s2 = "gradle version is ${version}"
def s3 = '''my
name is
imooc'''

//println s1
//println s2
//println s3

// 5 集合API
// list
def buildTools = ['ant','maven']
buildTools << 'gradle'
assert buildTools.getClass() == ArrayList
assert buildTools.size() == 3
// map
def buildYear = ['ant':2000,'maven':2004]
buildYear.gradle = 2009

//println buildYear.ant
//println buildYear['gradle']
//println buildYear.getClass()

// 6 閉包
def c1 = {
    v ->
        print v
}
def c2 = {
    print 'hello'
}
def method1(Closure closure){
    closure('param')
}
def method2(Closure closure){
    closure()
}
method1(c1)
method2(c2)

2-5 Groovy重點

代碼演示:

// 構建腳本中默認都是有Project實例的
//Project實例的apply方法
apply plugin:'java'
//Project實例的version屬性
version = '0.1'
// 閉包做爲參數調用repositories方法
repositories {
    mavenCentral()
}
// 閉包做爲參數調用dependencies方法
dependencies {
    compile 'commons-codes:commons-codes:1.6'
}

第三章:第一個Gradle項目

3-1 第一個Gradle項目介紹

示例介紹

ToDo應用程序,只實現添加代辦事項
Java應用程序版
Web版

3-2 應用程序版

目錄結構

clipboard.png

3-2 Web版

代碼演示:

group 'com.myimooc'
version '1.0-SNAPSHOT'

apply plugin: 'java'
apply plugin: 'war'

sourceCompatibility = 1.8

configurations.all {
    resolutionStrategy {
        failOnVersionConflict()
        // 強制指定一個版本
        force 'org.slf4j:slf4j-api:1.7.22'
    }
}

repositories {
//    maven{
//        url ''
//    }
    mavenLocal()
    mavenCentral()
}

dependencies {
    // https://mvnrepository.com/artifact/org.hibernate/hibernate-core
    compile (group: 'org.hibernate', name: 'hibernate-core', version: '3.6.3.Final'){
        // 排除傳遞依賴
        exclude group:'org.slf4j',module:'slf4j-api'
    }
    // https://mvnrepository.com/artifact/ch.qos.logback/logback-classic
    compile 'ch.qos.logback:logback-classic:1.2.3'
    testCompile group: 'junit', name: 'junit', version: '4.11'
}
// 聲明 閉包:建立目錄,需傳入參數爲字符串目錄路徑
def createDir = {
    // 參數
    path ->
        // 功能
        println path
        File dir = new File(path);
        if(!dir.exists()){
            dir.mkdirs();
        }
}

// 任務:自動建立Java工程目錄結構
task makeJavaDir(){
    // 定義數組存放目錄路徑
    def paths = ['src/main/java', 'src/main/resources', 'src/test/java', 'src/test/resources'];
    // 添加動做:doFirst:在動做列表的前面插入一個動做
    doFirst{
        for(String path : paths){
            // 調用 閉包
            createDir(path)
        }
    }
}
// 任務:自動建立Web工程目錄結構
task makeWebDir(){
    // 聲明當前任務依賴 makeJavaDir 任務
    dependsOn 'makeJavaDir'
    def paths = ['src/main/webapp', 'src/test/webapp']
    // 添加動做:doLast:在動做列表的後面插入一個動做
    doLast{
        for(String path : paths){
            // 調用 閉包
            createDir(path)
        }
    }
}

第四章:高級應用

4-1 構建腳本介紹

構建塊

Gradle構建中的兩個基本概念是項目(Project)和任務(task),每一個構建至少包含一個項目,項目中包含一個或多個任務。在多項目構建中,一個項目能夠依賴於其餘項目;相似的,任務能夠造成一個依賴關係圖來確保他們的執行順序。

clipboard.png

項目(Project)

一個項目表明一個正在構建的組件(好比一個jar文件),當構建啓動後,Gradle會基於build.gradle實例化一個org.gradle.api.Project類,而且可以經過project變量使其隱式可用。

項目的屬性和方法

group、name、version
apply、dependencies、repositories、task
屬性的其餘配置方式:ext、gradle.properties

任務(task)

任務對應org.gradle.api.Task。主要包括任務動做和任務依賴。任務動做定義了一個最小的工做單元。能夠定義依賴於其餘任務、動做序列和執行條件。

任務的方法

dependsOn
doFirst、doLast<<

4-2 自定義任務

代碼演示:

// 聲明 閉包:建立目錄,需傳入參數爲字符串目錄路徑
def createDir = {
    // 參數
    path ->
        // 功能
        println path
        File dir = new File(path);
        if(!dir.exists()){
            dir.mkdirs();
        }
}

// 任務:自動建立Java工程目錄結構
task makeJavaDir(){
    // 定義數組存放目錄路徑
    def paths = ['src/main/java', 'src/main/resources', 'src/test/java', 'src/test/resources'];
    // 添加動做:doFirst:在動做列表的前面插入一個動做
    doFirst{
        for(String path : paths){
            // 調用 閉包
            createDir(path)
        }
    }
}
// 任務:自動建立Web工程目錄結構
task makeWebDir(){
    // 聲明當前任務依賴 makeJavaDir 任務
    dependsOn 'makeJavaDir'
    def paths = ['src/main/webapp', 'src/test/webapp']
    // 添加動做:doLast:在動做列表的後面插入一個動做
    doLast{
        for(String path : paths){
            // 調用 閉包
            createDir(path)
        }
    }
}

4-3 構建生命週期

構建生命週期

初始化:初始化須要參與構建的項目
配置:根據配置代碼生成task的依賴順序和執行順序
執行:執行動做代碼

示意圖:

clipboard.png

構建週期構造方法

clipboard.png

4-4 依賴管理

概述

幾乎全部的基於JVM的軟件項目都須要依賴外部類庫來重用現有的功能。自動化的依賴管理能夠明確依賴的版本,能夠解決因傳遞依賴帶來的版本衝突。

工件座標

group:工件組
name:工件名稱
version:版本
經過這三個屬性來惟一肯定一個jar包

經常使用倉庫

mavenCentral:公共倉庫
jcenter:公共倉庫
mavenLocal:本地倉庫
自定義maven倉庫:maven私服,公司內部倉庫
文件倉庫:不建議使用

依賴的傳遞性

B依賴A,若是C依賴B,那麼C依賴A。

自動化依賴管理

clipboard.png

依賴管理階段

源代碼:compile:編譯階段;runtime:運行階段。
測試代碼:testCompile:編譯階段;testRuntime:運行階段。

依賴階段關係

clipboard.png

4-5 解決版本衝突

版本衝突例子

clipboard.png

解決衝突

查看依賴報告
排除傳遞性依賴
強制指定一個版本

clipboard.png

clipboard.png

clipboard.png

4-6 多項目構建介紹

項目模塊化

在企業項目中,包層次和類關係比較複雜,把代碼拆分紅模塊一般是最佳實踐,這須要你清晰的劃分功能的邊界,好比把業務邏輯和數據持久化拆分開來。項目符合高內聚低耦合時,模塊化就變得很容易,這是一條很是好的軟件開發實踐。

TODO模塊依賴關係

clipboard.png

配置要求

全部項目應用Java插件
web子項目打包成war
全部項目添加logback日誌功能
統一配置公共屬性

項目範圍

clipboard.png

4-7 多項目構建實戰

詳見源代碼。

4-8 自動化測試

自動化測試

一些開源的測試框架好比JUnit,TestNG可以幫助你編寫複用的結構化的測試,爲了運行這些測試,你要先編譯它們,就想編譯源代碼同樣。測試代碼的做用僅僅用於測試的狀況,不該該被髮布到生產環境中,須要把源代碼和測試代碼分開來。

項目佈局

clipboard.png

測試配置

clipboard.png

測試任務

clipboard.png

測試發現

任何繼承自junit.framework.TestCase或groovy.util.GroovyTestCase的類
任何被@RunWith註解的類
任何至少包含一個@Test註解的類

4-9 發佈

發佈到本地和遠程倉庫

clipboard.png

發佈過程

使用maven-publish插件
配置發佈任務,倉庫地址
執行發佈任務,發佈完成

第五章:課程總結

5-1 課程總結

示意圖

clipboard.png

相關文章
相關標籤/搜索