Gradle系列之Java Gradle插件

原文發於微信公衆號 jzman-blog,歡迎關注交流。

上篇文章中瞭解了 Gradle 插件相關知識以及如何自定義一個 Gradle 插件,爲方便理解能夠先閱讀下面幾篇文章:java

本篇文章主要來學習 Java Gradle 插件相關的知識,由於 Java Gradle 插件相關的內容也是 Android Gradle 插件的基礎。使用 Gradle 來構建項目無非就是幫助開發者作一些重複性的工做,如配置第三方依賴、編譯源文件、單元測試、打包發佈等,使用相應的 Grade 插件可方便項目的構建以及必定程度上提升開發效率,下面是今天學習的主要內容:api

  1. Java Gradle 插件的使用
  2. Java 插件約定的項目結構
  3. 配置第三方依賴
  4. 如何構建 Java 項目
  5. SourceSet 源集概念
  6. Java 插件可添加的任務
  7. Java 插件可添加的屬性
  8. 多項目構建
  9. 發佈構件

Java Gradle 插件的使用

使用一個 Gradle 插件使用的是 Project 的 apply() 方法:微信

//java是Java Gradle插件的plugin id
apply plugin:'java'

使用 Java 插件以後會爲當前工程添加默認設置和約定,如源代碼的位置、單元測試代碼的位置、資源文件的位置等,通常使用默認設置便可。閉包

Java 插件約定的項目結構

Java 插件設置一些默認的設置和約定,下面來看一看 Java 項目的默認工程目錄,目錄結構基本以下:app

JavaGradle
└─src
    ├─main
    │  ├─java
    │  └─resources
    └─test
        ├─java
        └─resources

上面目錄結構中,src/main/java 默認是源代碼存放目錄,src/main/resources 是資源文件、配置文件等目錄,arc/test 下面的目錄固然是與其相對應的單元測試相關文件的存儲目錄,main 和 test 是 Java Gradle 插件內置的兩個源代碼集合,固然除此以外能夠本身定義其餘源代碼集合,定義方式以下:maven

apply plugin : 'java'

sourceSets{
    //指定新的源代碼集合
    vip{
        
    }
}

而後在 src 下面建立相應的 java 和 resources 目錄,具體目錄下存放的文件內容與默認相似,默認目錄結構以下:post

//源代碼目錄
src/vip/java
//資源文件目錄
src/vip/resource

上述目錄結構都是 Java Gradle 插件默認實現的,固然還能夠修改具體目錄的位置,配置方式以下:單元測試

sourceSets{
    //修改默認目錄,下面仍是和默認位置同樣,如需配置其餘目錄修改便可
    main{
        java{
            srcDir 'src/java'
        }
        
        resources{
            srcDir 'src/resources'
        }
        
    }
}

配置第三方依賴

開發過程當中總會使用第三方 jar 包,此時就要對 jar 包進行依賴配置,依賴的倉庫類型以及倉庫的位置,具體依賴時 Gradle 就會從配置的倉庫中去尋找相關依賴,配置倉庫和配置具體依賴參考以下:學習

//配置倉庫位置
repositories{
    //倉庫類型如jcenter庫、ivy庫、maven中心庫、maven本地庫、maven私服庫等
    mavenCentral()
    mavenLocal()
    maven {
        uri "http"//xxxx
    }
    jcenter()
    google()
    //...
}

//配置具體的依賴
dependencies{
    //依賴三要素:group(組別)、name(名稱)、version(版本)
    //分別對應Maven中的GAV(groupid、artifactid、version)
    
    //完整寫法
    compile group: 'com.squareup.okhttp3', name: 'okhttp', version:'3.0.1'
    //簡寫
    compile 'com.squareup.okhttp3:okhttp:3.0.1'
}

上述代碼中 compile 是一個編譯時依賴,Gradle 還提供了其餘依賴,具體參考以下:測試

compile:編譯時依賴
runtime:運行時依賴
testCompile:測試時編譯時依賴
testRuntime:僅在測試用例運行時依賴
archives:發佈構件時依賴,如jar包等
default:默認依賴配置

在 Gradle 3.0 以後還會有 implementation、api 來替代 compile,這裏就很少說這兩個依賴方式了,關於新 API 的學習不是本文的重點,Java Gradle 插件還支持爲不一樣的源代碼集合指定不一樣的依賴,具體參考以下:

//爲不一樣的源代碼集合配置不一樣的依賴
dependencies{
    //配置格式:sourceSetCompile、sourceSetRuntime
    mainCompile 'com.squareup.okhttp3:okhttp:3.0.1'
    vipCompile 'com.squareup.okhttp3:okhttp:2.0.1'
}

上面介紹的是某個外部庫的依賴,除此以外在開發中還會遇到 Module 的依賴、文件的依賴,實際上 Module 的依賴實際上就是某個子項目的依賴,文件以來通常就是 jar 包的依賴。

在Gradle系列之構建腳本基礎這篇文章中已經知道構建某個子項目必須在 setting.gradle 文件中使用 include 關鍵字將子項目引入進來,這裏也是同樣,如今 setting.gradle 文件中要依賴的項目引入進來,而後按照以下方式依賴某個子項目,具體以下:

//依賴一個子項目
dependencies{
    //setting.gradle文件中 include ':childProject'
    
    //依賴子項目
    compile project('childProject')
}

文件依賴主要就是 jar 包的依賴,通常都是將 jar 包放在項目的 libs 目錄下,而後在起來 jar 包,具體參考以下:

//依賴一個jar包
dependencies{
    //配置單個jar
    compile file('libs/java1.jar')
    //配置多個jar
    compile files('libs/java1.jar','libs/java2.jar')
    //批量配置jar,配置好jar所在路徑,會將後綴爲jar的全部文件依賴到項目中
    compile fileTree(dir:'libs',include:'*.jar')
}

如何構建Java項目

Gradle 中全部的操做都是基於任務的,Java Gradle 插件一樣內置了一系列的任務幫助咱們構建項目,執行 build 任務 Gradle 就開始構建當前項目了,可使用 gradlew build 開始執行構建任務,Gradle 會編譯源代碼文件、處理資源文件、生成 jar 包、編譯測試代碼、運行單元測試等。

如在 Android 開發中有個 clean 任務,執行 clean 操做就會刪除 build 文件夾以及其餘構建項目生成的文件,若是編譯出錯能夠嘗試向 clean 而後 build。此外還有 check 任務,該任務會在單元測試的時候使用到,javadoc 任務能夠方便生成 Java 格式的 doc api 文檔,學習 Java 項目的構建目的仍是爲了學習 Android 項目構建作準備,因此如何使用 Gradle 構建一個 Java 項目就到此爲止。

SourceSet 源集概念

這一小節來認識一下 SourceSet ,這也就是前問中提到的源代碼集合,它是 Java Gradle 插件用來描述和管理源代碼及其資源的一個抽象概念,是一個 Java 源代碼文件和資源文件的集合,故能夠經過源代碼集合配置源代碼文件的位置、設置源代碼集合的屬性等,源集能夠針對不一樣的業務將源代碼分組管理,如 Java Gradle 插件默認提供的 main 和 test 源代碼目錄,一個用於業務代碼,另外一個用於單元測試,很是方便。

Java Gradle 插件在 Project 下提供一個 sourceSet 屬性以及 sourceSet{} 閉包來訪問和配置源集,sourceSet 是一個 SourceSetContainer, 源集的經常使用屬性以下:

//好比main、test等表示源集的名稱
name(String)
//表示源集編譯後的class文件目錄
output.classDir(File)
//表示編譯後生成的資源文件目錄
output.resourcesDir(File)
//表示編譯後源集所需的classpath
compileClasspath(FileCollection)
//表示該源集的Java源文件
java(SourceDirectorySet)
//表示該源集的Java源文件所在目錄
java.srcDirs(Set)
//表示源集的資源文件
resources(SourceDirectorySet)
//表示該源集的資源文件所在目錄
resources.srcDirs(Set)

下面是設置 main 這個源集的輸出目錄,參考以下:

//設置某個源集的屬性
sourceSets{
    main{
        //源集名稱只讀
        println name
        //其餘屬性設置
        //從4.0開始已經被過期。替代的是dir
        output.classesDir = file("a/b")
//        output.dir("a/b")
        output.resourcesDir = file("a/b")
        //....
    }
}

Java 插件可添加的任務

項目的構建仍是經過一系列 Gradle 插件提供的任務,下面是 Java 項目中經常使用的任務,具體以下:

任務名稱 類型 描述
默認源集通用任務
compileJava JavaCompile 表示使用javac編譯java源文件
processResources Copy 表示把資源文件複製到生成的資源文件目錄中
classes Task 表示組裝產生的類和資源文件目錄
compileTestJava JavaCompile 表示使用javac編譯測試java源文件
processTestResources Copy 表示把資源文件複製到生成的資源文件目錄中
testClasses Task 表示組裝產生的測試類和相關資源文件
jar Jar 表示組裝jar文件
javadoc Javadoc 表示使用javadoc生成Java API文檔
uploadArchives Upload 表示上傳包含Jar的構建,使用archives{}閉包進行配置
clean Delete 表示清理構建生成的目錄文件
cleanTaskName Delete 表示刪除指定任務生成的文件,如cleanJar是刪除jar任務生成的文件
自定義源集任務 (SourceSet是具體的源集名稱)
compileSourceSetJava JavaCompile 表示使用javac編譯指定源集的源代碼
processSouceSetResources Copy 表示把指定源集的資源文件複製到生成文件中的資源目錄中
sourcesSetClasses Task 表示組裝給定源集的類和資源文件目錄

Java插件能夠添加的屬性

Java Gradle 插件中的經常使用屬性都被添加到 Project 中,這些屬性能夠直接使用,具體以下:

屬性名稱 類型 描述
sourceSets SourceSetContauner Java項目的源集,可在閉包內進行相關配置
sourceCompatibility JavaVersion 編譯Java源文件使用的Java版本
targetCompatinility JavaVersion 編譯生成類的Java版本
archivesBaseName String 打包成jar或zip文件的名稱
manifest Manifest 用來訪問和配置manifest清單文件
libsDir File 存放生成的類庫目錄
distsDir File 存放生成的發佈的文件目錄

多項目構建

使用 Gradle 進行多個項目的構建,通常都是一個主項目依賴其餘的子模塊項目,是否構建這些子項目主要在 Setting.gradle 文件中配置,是否使用這些子項目則必需要在主項目中配置項目依賴,上文中接受過依賴的三種方式:庫依賴、項目依賴和文件依賴,這裏使用到的就是項目依賴,多項目配置中常用到 subprojects 和 allprojects ,具體以下:

//子項目統一配置
subprojects{
    //配置子項目都使用Java Gradle插件
    apply plugin: 'java'
    //配置子項目都是用Maven中心庫
    repositories{
        mavenCentral()
    }
    //其餘通用配置
    //...
}
//所有項目統一配置
allprojects{
    //配置全部項目都使用Java Gradle插件
    apply plugin: 'java'
    //配置全部項目都是用Maven中心庫
    repositories{
        mavenCentral()
    }
    //其餘通用配置
    //...
}

發佈構件

Gradle 構建的產物,通常稱之爲構件,一個構建能夠是一個 jar 包、zip 包等,那麼如何發佈構件呢,下面介紹如何發佈一個 jar 構件到項目本地文件夾或 mavenLocal() 中,具體以下:

/**
 * 發佈構件到項目文件夾/或mavenLocal()
 */
apply plugin : 'java'
//生成jar的任務,相似於自定義wrapper
task publishJar(type:Jar)
//構件版本
version '1.0.0'
//構件經過artifacts{}閉包配置
artifacts{
    archives publishJar
}
//構件發佈上傳
uploadArchives{
    repositories{
        flatDir{
            name 'libs'
            dirs "$projectDir/libs"
        }
        //將構建發佈到mavenLocal()
        mavenLocal()
    }
}

執行 uploadArchives 任務就會在相應的位置生成相應的 jar 文件,執行命令以下:

//執行uploadArchives
gradle uploadArchives

執行成功以後,就會在項目的 libs 目錄下看到生成的 jar 文件,以下圖所示:

image.png

執行成功以後,就會在用戶的 .m2/repository 目錄下看到生成的 jar 文件,以下圖所示:

image.png

下面是如何將 jar 發佈到搭建的 maven 私服上,代碼參考以下:

/**
 * 發佈構件到maven私服
 */
apply plugin : 'java'
apply plugin : 'maven'
//生成jar的任務,相似於自定義wrapper
task publishJar(type:Jar)
//構件版本
version '1.0.0'
//構件經過artifacts{}閉包配置
artifacts{
    archives publishJar
}
//構件發佈上傳
uploadArchives{
    repositories{
        mavenDeployer{
            repository(url:'http://xxx'){
                //倉庫用戶名和密碼
                authentication(userName:'username',password:'pass')
            }
            snapshotRepository(url:'http://xxx'){
                authentication(userName:'username',password:'pass')
            }
        }
    }
}

上傳過程也是執行 uploadArchives 任務,有 maven 私服的能夠嘗試一下,關於 Java Gradle 插件的學習就到此爲止,下一篇正式進入 Android Gradle 插件的學習,能夠關注公衆號:躬行之(jzman-blog),一塊兒交流學習。

image

相關文章
相關標籤/搜索