Gradle - 實戰筆記

第一章,項目自動化介紹

重點:構建工具Gradle關係圖


第二章,下一代構建工具:Gradle

重點:

重要的Gradle特性集

1,Gradle 構建腳本<表達性的構建語言(Java/Groovy),底層的API,Gradle 的擴展機制,引入外部庫的依賴>

2,強大的依賴管理<Gradle 提供了一個基礎設施去管理解析,獲取和存儲依賴的複雜性。一旦它們被下載並存儲到本地緩存中,你的項目就可以使用了。>

使用Gradle

-q 選項: quiet,高速Gradle只輸出該task相關的信息。

-x 選項:排除執行任務。

左移符號<< 和doLast (Action)是等價的。

dependsOn 關鍵字來描述task之間的依賴,實際上,該關鍵字是task的一個方法。

Gradle 提供了任務組的概念,可以把它看作是多個tasks的集羣,我們可以添加新的任務組。

第三章,Gradle 項目

重點:

使用Java插件:要組裝一個可執行程序,需要編譯源代碼,之後將生成的class文件打包成Jar文件。這些都是構建項目的一個個任務(tasks)。Gradle 使用Java插件能夠自動化這些任務。

執行gradle build命令,注意到某些tasks被標記爲Up-to-date消息, 這意味着這個任務被跳過了。

項目被構建後,(1)可以通過classpath命令行選項 -cp build/ classes/ main 告訴java 運行時去哪裏找到class。 (2)可以通過Jar文件啓動,但是要在build清單文件MANIFEST.MF 中指定Main-Class 屬性。

//通過classpath的方式執行程序
>java -cp build/classes/main com.manning.gia.todo.ToDoApp

//通過在Manifest文件中指定Main Class的方式
jar{
   manifest{
         attributes 'Main-Class': 'com.manning.gia.todo.ToDoApp'
}
} 

外部依賴:源代碼(import external.jar)vs build 腳本 (repositories{}dependencies{}),事實上,兩者是有關聯的,源代碼中需要外部JAR的依賴,通過Import導入,但是外部依賴的JAR無需手動下載和配置,只要在build腳本中添加依賴管理和庫,項目會自動下載和配置所需要的JAR文件。

大部分工程都不太可能完全自給自足,一定你都會用到其他工程的文件。比如自己的工程需要Hibernate,就需要把它的類庫加進來,這些文件就是工程的依賴。Gradle 需要你來告訴它工程的依賴是什麼,它們在哪,然後幫你加入構建中。依賴可能需要遠程庫下載,也可能在本地,甚至可能是另一個工程。

大部分工程構建的主要目的是脫離工程使用。比如生成jar包,包含源代碼,文檔等,然後發佈出去。

war插件是Java插件的擴展,適用與web應用,war插件引入了兩個新的依賴配置(configuration)。Servlet 依賴使用到的配置是 providedCompile,它表示該以來在編譯時候需要,但是由運行時環境提供,運行時環境就是Jetty,配置是runtime。

jetty插件可以幫助你告訴嵌入式Servlet容器你的web應用的classpath和端口,通過運行‘gradle jettyRun’ 命令,jetty可以在運行時自動訪問war插件的信息,然後將url和端口反饋給你。

第四章,構建build腳本

重點:

project 和 task 屬性方法問題,當訪問屬性和方法時,不需要使用project/ task變量(Project/ Task接口實例)。也就是說,println project.description 和 println description都是可以的。然而對於task來說,卻只能使用println description。

添加task配置塊,task配置塊沒有定義動作或者使用左移操作符(<<), Gradle 稱之爲task配置。task配置塊永遠在task動作執行之前被執行,即使不被調用的情況下,最先執行。

Gradle 構建生命週期階段:初始化階段 ---  配置階段(定義擴展屬性以及task配置塊)---  執行階段(task動作代碼)。

Gradle build腳本中也是可以定義類的。

聲明task規則:tasks.addRule(String, 閉包)。e.g. tasks.addRule("String"){def var -> var}

第五章,依賴管理

重點:

依賴配置,插件可以引入配置來定義依賴的配置。也可以聲明自己的配置。例如Java插件,引入了6個現成的配置, compile(build task默認訪問), runtime(build task默認訪問), testCompile(test task默認訪問), testRuntime(test task默認訪問), archives, default。

自定義配置,直接在項目的根級別聲明添加自定義配置,聲明自定義配置後,可以在依賴中添加該配置的依賴,並通過指定該依賴的classpath給task來訪問該配置。

configurations{
       cargo{//通過名稱定義新的配置
           description=''
           visible=false //設置配置的描述信息
}
}
排除傳遞性依賴,使用exclude方法來排除傳遞性依賴。

dependencies{
       cargo('group:name:version'){
              exclude group: 'group_name', model:'model_name'
}
}
通過transitive=false屬性來排除說有傳遞性依賴。

倉庫的各種形式,<1> Maven 倉庫,預配置的Maven倉庫,本地Maven倉庫,自定義Maven倉庫

//預配置的Maven倉庫
repositories{
      mavenCentral ()
}
//本地Maven倉庫
repositories{
      mavenLocal()
}
//自定義的Maven倉庫
repositories{
      maven{
           name 'Custom maven repos'
           url 'http://repository-gradle-in-action...'
}
}
<2> Ivy 倉庫: 和Maven不同的是,Maven倉庫中的工件必須以一種固定的佈局存儲,Ivy倉庫可以完全自定義佈局。

repositories{
        ivy{
          url 'http://repositories.myenterprise.com/ivy/..'
          layout 'pattern',{
               artifact '[organization]/[module]/[revision]/[artifact]-[revision].[ext]'
                ivy '[organization]/[module]/[revision]/ivy-[revision].xml'
}
}
}
<3>扁平的目錄倉庫

repositories{
      flatDir(dir:"[path]",
      name:'Local libs directory')
}
//dependencies{}中聲明的依賴只能使用name和version
--offset 命令行選項高速Gradle在離線模式下不要檢查遠程倉庫。

第六章,多項目構建

重點:

調用子項目的命令 gradle :[sub-project-name]:[task-name]。

-a 命令行選項可以起到部分都建的作用。gradle :repository:build -a。

第七章,Gradle測試

重點:

如何讓Gradle使用一個特定的測試框架,需要聲明依賴外部的類庫。dependencise{testCompile 'junit:junit:4.11'}//依賴Junit框架

使用JUnit來進行單元測試,測試<代碼片段>是否成功實現。在測試類代碼中,@Before:使用這個註解標記的方法總會在每個類的測試方法之前執行;@Test:使用這個註解標記的方法將作爲測試用例運行。在build中,添加testCompile配置,聲明依賴JUnit。

使用TestNG來進行單元測試,測試類代碼和JUnit相同,在build中,首先需要聲明TestNG的依賴,testCompile 'org.testing:testing:6.8',其次,需要指定TestNG用來執行測試。可以通過test.useTestNG()// test 測試task調用useTestNG方法。也可以通過test{useTestNG()}閉包方法聲明。

在build中指定默認的測試任務域(test task),默認包含所有的測試類,可以使用exclude來排除部分不願意在默認模塊中執行的類。在默認的測試域中可以設置控制測試的配置。

test{
    testLogging {//testLogging 是一個接口類
            showStandardStreams=true//把日誌標準流輸出到終端
            exceptionFormat 'full'//顯示全部的異常信息
            events 'started', 'passed', 'skipped', 'failed'//記錄特定測試事件
            exclude '**.class'//排除不願默認執行的類
}
}
可以自定義test task,task testOne(type:Test){}

驗證task:check。check task是java插件提供的生命週期task,它依賴於任何測試task,如test。如果你想自動執行整個測試task鏈,這個task是最便捷的。

集成測試,測試類中可以將集成測試的類名約定爲**IntegrateTest 結尾的文件(單元測試類和集成測試類都放置在src/test/java中),在build中可以定義一個test task,e.g. 

task IntegratedTest (type: Test){
      include '**/*IntegrateTest.class'
}
假如想分離集成測試類到src/IntegrateTest/java, 需要使用sourceSets{},並在其中指定classpath。
功能測試和以上過程類似。

第八章,擴展Gradle

編寫定製的task類,Gradle 標準插件的task都是繼承DefaultTask 類的。如果想定製task類,可以<1> 在build中構建一個task類,例如,

class MyTask extends DefaultTask{
       @TaskAction
       public void start(){

}
}

task obj_task(type: MyTask){}

<2> 將定製的task類放到項目根目錄下的 buildSrc/ src/ main/ java目錄下。 Gradle 將該目錄當作默認的源代碼目錄,自動可用。在buildSrc目錄中也需要創建一個build腳本用來引入定製task類中依賴的類。

<3>還可以將定製的task類打包成jar,在build中依賴它的classpath配置項。

@TaskAction: task的行爲封裝在task 的action中。要指定哪個action執行,需要在執行方法上加上註解@TaskAction。執行方法是可以任意取的,只要不覆蓋父類的void execute()方法就可以。

buildSrc 目錄(主要用於存放自定義task類的目錄)和src目錄(源代碼目錄)可以同時存在在根目錄下,同時可以在根目錄下直接添加BuildSrc路徑。如果在build腳本中使用該類型的task,只需要import該類的path,Gradle 就可以識別到該類。

在build腳本中創建指定type的task不能定義動作或者使用左移操作符(<<)。

Gradle 中含有插件庫類,可以稱爲內部插件,包括Java,Eclipse,Jetty等,這些插件可以通過apply'plugin: 'plugin-name' 直接引用。還有一些插件不在Gradle插件庫中,稱爲外部插件,包括Tomcat,JS等,對於這些插件需要通過buildscript 塊來引用。

buildscript{
    repositories{
         mavenCentral()
}
    dependencies{
         classpath 'org.gradle.api.plugins:gradle-tomcat-plugin:0.9.7'
}
}

apply plugin: 'tomcat'
第九章,集成與遷移

重點:

構建工具Ant不支持增量構建,而Gradle可以幫助Ant實現增量構建,Gradle 會意識到源文件沒有改變,輸出文件已經存在,這麼做節省了大量時間,特別是在有許多依賴和源文件的企業級構建。

Gradle 可以通過AntBuilder對象ant來定義一個Ant任務,對於Ant來說,所謂的Ant任務就是Ant任務標籤,不是通過<target>標籤定義的任務,而是直接的任務標籤,例如Ant中<get>獲取任務標籤。

如果將Ant target定義的任務遷移到Gradle 的task,需要用Gradle的方式去實現target的邏輯。

<target name="target_name">
   ***
</target>
//遷移到Gradle task
task target_name{
   ***
}
//在Gradle中使用該target
target_name{
   ***
}
Gradle 有依賴管理,而Ant是沒有依賴管理的,除非結合使用Ivy。

Gradle 並不支持在運行時對POM中Maven目標的導入,Gradle 提供了maven2Gradle 轉換task,可以根據有效的POM生成build.gradle文件。maven2Gradle task只有在當前目錄中包含一個pom.xml 文件的時候纔可見。執行這個maven2Gradle task後,根據pom.xml, Gradle 可以轉化成相應的build.gradle 和 settings.gradle 文件。

第十章,IDE支持和工具

重點:

Eclipse插件:eclipse 和 eclipse-wtp (負責生成Eclipse的web工具平臺)。

這兩個插件提供了一些task來生成Eclipse項目。eclipse task負責生成所有的Eclipse項目文件,包括.project,classpath,.settings 目錄下的設置文件。cleaneclipes task負責清除所有已經存在Eclipse項目文件。

Gradle ——> 構建腳本(apply plugin: 'eclipse')——> IDE項目文件 ——> Eclipse IDE

         <執行task>                                                          <生成>                      <導入>

//通過eclipse.project.name來設置Eclipse的項目名,默認的項目名和Gradle Project Name相同
eclipse{
     project{
           name='***'
}
}
//subproject
project(':web'){
     eclipse{
           project{
                comment ='***'
}
}
}
事實上,Eclipse有一個安裝包可以導入現成的Gradle項目結構,無需在構建腳本中添加Eclipse插件:SpringSource Tool Suite(STS)

第十一章,構建多語言項目

重點:

Groovy 自定義項目結構(事實上和Java自定義項目結構是一樣的,但是在Java自定義項目結構時沒有說明,在這裏一併說明。)

//通過sourceSets來自定義項目結構
sourceSets{
      main{
          groovy{
              srcDirs=['src/groovy']//編譯路徑
}
}
      test{
         groovy{
              srcDirs=['test/groovy']//測試路徑
}
}
}
sourceSets.main.java 或者 sourceSets{ main{ java{  } } }可以被認爲是java編譯器,sourceSets.test.java 或者 sourceSets{ test{ java{  } } }可以被認爲是java測試編輯器。

Groovy和上面相同。

Groovy可以依賴Java,但是Java 無法依賴Groovy。爲了解決這一個問題,需要聯合編輯,配置Groovy編譯器,讓groovy編譯Java和Groovy的源碼。

sourceSets.main.java.srcDirs=[]
sourceSets.main.groovy.srcDirs=['src/main/java','src/main/groovy']
第十二章,代碼質量管理和監測
重點:
衡量代碼覆蓋率工具:它將代碼中沒有被測試到的執行分支暴露出來:JaCoCo (構建JaCoCo腳本插件,在root下mkdir一個gradle路徑,裏面添加JaCoCo腳本插件。在build腳本中通過路徑應用插件,例如apply plugin: "$rootDir/gradle/jacoco.gradle")

靜態代碼分析工具:僅僅分析源代碼,而沒有必要真正的執行軟件得到質量結構:checkstyle

集中監控,可視化和整合報告信息:Sonar,它可以和JaCoCo,checkstyle 很好的集成。Sonnar Runner插件被用來分析源代碼,結合JaCoCo來發布代碼覆蓋率報告。所有信息都發布到Sonar,Sonar Dashboard中可見。

第十三章,持續集成

重點:

CI:Continuous Integration 持續集成,頻繁的集成代碼,對於每個變化,源代碼都會通過自動化構建被編譯和測試。持續集成就是通過定義的構建項目的時間間隔(如,每5分鐘構建一次)或者每次VCS中的變化來觸發構建。Hudson/Jenkins 是比較流行的CI server

VCS:將不同開發人員的代碼集成到一箇中央VCS中,GitHub 後端使用的是免費的開源的 VCS 叫做Git。

//搭Git環境:

安裝Git,創建SSH key,將Key添加到GitHub Setting中,可以安裝一個GitHub應用在windows上。將源代碼上傳到Git中,安裝Hudson來構建項目。創建一個Hudson Job,配置代碼倉庫,也就是告訴Hudson到什麼地方去獲得源代碼(Git)。Repository URL: [email protected]:<username>/todo.git。每次每一個Dev修改代碼並提交到Git後,都會觸發這個Hudson Job。Job來調用Gradle build中的命令。Hudson會把結構發佈到Dashboard中。當構建失敗時會有Email通知。點擊job名字,可以看到輸出結構。

事實上,在本地執行可以直接執行Gradle命令執行各個Task,Hudson是用來多次的,頻繁的,自動化構建項目。

第十四章,打包和發佈

重點:

artifact:工件

在默認情況下,所有應用了Java插件的項目在執行assemble task的時候都會生成一個單獨的JAR文件(包含項目的類文件和基本數據的標準JAR文件),path:<root project>/build/libs。有些時候,你想要在組建過程中創建額外的工件,換句話說,爲項目添加自定義的包。

如果你的項目交付的非標準工件(自定義的包)需要被其他用戶或項目使用,那麼需要將他們包含在組建過程中。

對於Java插件的項目都有一個archives配置項,該配置定義了一個項目的輸出包。這個配置默認是標準JAR文件,也就是項目構建生成的工件。我們可以通過這個配置項來添加更多的輸出包來豐富插件項目。

當執行gradle assemble 時,項目會創建標準JAR文件到libs目錄下,通過指定archives配置來註冊你所定義的自定義的包,再次執行assemble,標準Jar和附加Jar都會在libs目錄中創建。

使用distribution插件創建自定義包:

apply plugin: 'distribution'
distributions{
       main{
          baseName = "***"
          contents{
              from {libsDir}//打包build/libs 目錄下的所有文件
      }
  }
}
通過執行gradle assemble distZip/ distTar 命令創建包,包默認地址放置到build/ distributions目錄下。
發佈工件:可以發佈到Maven倉庫中,有三種類型的Maven倉庫,1 位於<USER_HOME>/.m2/repository目錄下的本地緩存,2 本地文件系統中任意目錄下的倉庫,3 通過HTTP(S)可訪問的遠程二進制倉庫。通過 Maven-publish插件可以發佈工件。

publishing{
	publications{
		plugin(MavenPublication){
			from components.java//添加JAR組件到發佈包列表中。
			artifactId 'artifactTodo-plugin'//必須定義工件id
			groupId 'com.manning'//必須定義組id
		}
	}
}


發佈了66 篇原創文章 · 獲贊 9 · 訪問量 17萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章