時間:2017年05月16日星期二
說明:本文部份內容均來自慕課網。@慕課網:http://www.imooc.com
教學示例源碼:無
我的學習源碼:https://github.com/zccodere/s...java
石器時代:自動化構建工具產生以前git
依賴管理:將全部使用到的jar包放到lib目錄下,不易管理,易出錯 測試:能不寫就不寫,一個一個運行測試 打包:經過eclipse的export導出jar包或war包 上傳:經過ftp工具進行上傳到服務器解壓運行
構建工具的做用github
依賴管理:各類jar包及版本 測試、打包、發佈:自動執行測試、打包、發佈到指定的地方 機器能幹的活,毫不本身動手
主流構建工具web
Ant:編譯、測試、打包 Maven:依賴管理、發佈 Gradle:Groovy語言管理構建腳本
示意圖編程
Gradle是什麼api
一個開源的項目自動化構建工具,創建在Apache Ant和Apache Maven概念的基礎上,並引入基於Groovy的特定領域語言(DSL),而再也不使用XML形式管理構建腳本。
Gradle能作什麼數組
進行依賴管理 自動化運行測試 打包 發佈到指定地方
快速嚐鮮服務器
準備使用Gradle 第一個Gradle項目
基本原理閉包
構建腳本介紹 依賴管理
深刻實戰app
多項目構建 測試 發佈
示意圖
安裝
確保已近安裝JDK,java –version驗證是否已經安裝。 從Gradle官網下載Gradle,https://gradle.org 配置環境變量,GRADLE_HOME 添加到path,%GRADLE_HOME%\bin; 驗證是否安裝成功,gradle –v
Groovy是什麼
Groovy是用於Java虛擬機的一種敏捷的動態語言,它是一種成熟的面向對象編程語言,既能夠用於面向對象編程,又能夠用做純碎的腳本語言。使用該種語言沒必要編寫過多的代碼,同時又具備閉包和動態語言中的其餘特性。
與Java比較
Groovy徹底兼容Java的語法 分號是可選的 類、方法默認是public的 編譯器給屬性自動添加getter/setter方法 屬性能夠直接用點號獲取 最後一個表達式的值會被做爲返回值 「==」等同於「equals()」,不會有NullPointerExceptions
高效的Groovy特性
assert語句 可選類型定義 可選的括號 字符串 集合API 閉包
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 } }
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)
代碼演示:
// 構建腳本中默認都是有Project實例的 //Project實例的apply方法 apply plugin:'java' //Project實例的version屬性 version = '0.1' // 閉包做爲參數調用repositories方法 repositories { mavenCentral() } // 閉包做爲參數調用dependencies方法 dependencies { compile 'commons-codes:commons-codes:1.6' }
示例介紹
ToDo應用程序,只實現添加代辦事項 Java應用程序版 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) } } }
構建塊
Gradle構建中的兩個基本概念是項目(Project)和任務(task),每一個構建至少包含一個項目,項目中包含一個或多個任務。在多項目構建中,一個項目能夠依賴於其餘項目;相似的,任務能夠造成一個依賴關係圖來確保他們的執行順序。
項目(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<<
代碼演示:
// 聲明 閉包:建立目錄,需傳入參數爲字符串目錄路徑 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) } } }
構建生命週期
初始化:初始化須要參與構建的項目 配置:根據配置代碼生成task的依賴順序和執行順序 執行:執行動做代碼
示意圖:
構建週期構造方法
概述
幾乎全部的基於JVM的軟件項目都須要依賴外部類庫來重用現有的功能。自動化的依賴管理能夠明確依賴的版本,能夠解決因傳遞依賴帶來的版本衝突。
工件座標
group:工件組 name:工件名稱 version:版本 經過這三個屬性來惟一肯定一個jar包
經常使用倉庫
mavenCentral:公共倉庫 jcenter:公共倉庫 mavenLocal:本地倉庫 自定義maven倉庫:maven私服,公司內部倉庫 文件倉庫:不建議使用
依賴的傳遞性
B依賴A,若是C依賴B,那麼C依賴A。
自動化依賴管理
依賴管理階段
源代碼:compile:編譯階段;runtime:運行階段。 測試代碼:testCompile:編譯階段;testRuntime:運行階段。
依賴階段關係
版本衝突例子
解決衝突
查看依賴報告 排除傳遞性依賴 強制指定一個版本
項目模塊化
在企業項目中,包層次和類關係比較複雜,把代碼拆分紅模塊一般是最佳實踐,這須要你清晰的劃分功能的邊界,好比把業務邏輯和數據持久化拆分開來。項目符合高內聚低耦合時,模塊化就變得很容易,這是一條很是好的軟件開發實踐。
TODO模塊依賴關係
配置要求
全部項目應用Java插件 web子項目打包成war 全部項目添加logback日誌功能 統一配置公共屬性
項目範圍
詳見源代碼。
自動化測試
一些開源的測試框架好比JUnit,TestNG可以幫助你編寫複用的結構化的測試,爲了運行這些測試,你要先編譯它們,就想編譯源代碼同樣。測試代碼的做用僅僅用於測試的狀況,不該該被髮布到生產環境中,須要把源代碼和測試代碼分開來。
項目佈局
測試配置
測試任務
測試發現
任何繼承自junit.framework.TestCase或groovy.util.GroovyTestCase的類 任何被@RunWith註解的類 任何至少包含一個@Test註解的類
發佈到本地和遠程倉庫
發佈過程
使用maven-publish插件 配置發佈任務,倉庫地址 執行發佈任務,發佈完成
示意圖