Gradle 本身提供了一些基本的概念和整體核心的框架,其他用於描述真實使用場景的都可以通過插件擴展的方式來實現。這樣就可以通過抽象的方式提供一個核心的框架,其他具體的功能和業務都通過插件擴展的方式來實現。
Gradle 內置了很多常用的插件,基本滿足大部分工作,但是也有一些插件是沒有內置的,這時候就需要我們擴展現有插件或者自定義插件來達到我們的目的。比如 Android Gradle 插件就是基於內置的Java插件實現的。
一、插件的作用
插件會擴展項目的功能,幫助我們在項目的構建的過程中做很多事情:
- 可以添加任務到項目中,幫助完成諸如 測試、編譯、打包等事情。
- 可以添加依賴配置到項目中,通過它們來配置我們在構建過程中的依賴。
- 可以向項目中現有的對象類型添加新的擴展屬性、方法等,可以使用它們來配置優化構建。例如:android{}這個配置塊就是Android Gradle插件為Project對象添加的一個擴展。
- 可以對項目進行一些約定,比如應用Java插件后,可以約定src/main/java目錄下是我們的源代碼的存放地址,在編譯的時候也是編譯這個目錄下的Java源代碼文件。
這就是插件,我們只需要按照它約定的方式,使用它提供的任務、方法或者擴展,就可以對我們的項目進行構建。
二、如何應用插件
插件的應用都是通過Project.apply()方法完成的。apply有好幾種用法,並且插件也分為二進制插件和腳本插件。下面我們分別介紹一下:
1. 應用二進制插件
二進制插件就是實現了org.gradle.api.Plugin接口的插件,它們可以有plugin id。
舉例:下面我們看一下如何應用一個Java插件:
apply plugin:'java'
使用上面的語句就可以把java插件應用到我們的項目中了,其中‘java’就是Java插件的plugin id,它是唯一的。
2. 應用腳本插件
腳本插件的使用方式如下例所示:
build.gradle:
apply from:'version.gradle'
task outVersion {
println("APP版本是:${versionName},版本號是:${versionCode}")
}
version.gradle:
ext {
versionName = '1.3.0'
versionCode = 1
}
允許結果如下:
renhui$ gradle outVersion
> Configure project :
APP版本是:1.3.0,版本號是:1
BUILD SUCCESSFUL in 0s
應用腳本插件,其實就是把腳本加載進來,和二進制插件不同的是它使用的是from關鍵字,后面緊跟着一個腳本文件(可以是本地文件,也可以是網絡文件)。
腳本插件能幫助我們把較大較復雜的腳本文件進行分塊、分段整理,它是腳本文件模塊化的基礎。
3. 應用第三方發布的插件
第三方發布的作為jar的二進制插件,我們在應用的時候,必須要在buildscript{}里面配置其classpath才能使用,這個不像Gradle為我們內置的插件。
比如我們的Android Gradle插件就屬於Android發布的第三方插件,如果我們要使用它就要先配置,示例如下:
buildscript {
repositories {
google()
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.4.0'
}
}
buildscript{}塊是一個在構建項目之前,為項目進行前期准備和初始化相關配置依賴的地方,配置好所需的依賴,就可以應用其提供的插件了。
下面是在app層應用android gradle插件的方式:
apply plugin: 'com.android.application'
如果沒有提前在buildscript里配置依賴的classpath,則會報錯,提示找不到這個插件。
三、Java Gradle 插件
使用Java Gradle插件我們能夠很輕松的構建出一個項目,我們常用的方式就是使用簡稱應用Java Gradle插件:
apply plugin: 'java'
通過以上的配置,Java插件會為工程添加很多有用的默認設置和約定,比如源代碼的位置,單元測試代碼的位置、資源文件的位置等。
作為Java項目,我們不可避免的會依賴很多第三方的Jar,這也是值得提倡的,因為有很多開源的工具和框架能夠幫助我們更加高效的開發。下面我們就講一下如何配置第三方依賴。
1. 配置第三方依賴
想要使用這些第三方依賴,就需要告訴Gradle如何找到這些依賴,也就是我們要講的依賴配置。
一般情況下我們都是從倉庫中查找我們需要的Jar包,在Gradle中要配置一個倉庫的Jar依賴,首先我們得告訴Gradle我們要是有什么類型的倉庫,這些倉庫的位置在哪里,這樣Gradle就知道從哪里去搜尋我們依賴的Jar,例如:
respositories {
mavenCentral()
}
以上代碼,我們配置了一個Maven中心庫,告訴Gradle可以在Maven中心庫中搜尋我們依賴的Jar,除此之外,我們也可以從jcenter庫、ivy庫、本地Maven庫mavenLocal等中搜尋。由此可見,Gradle支持的倉庫非常豐富,也可以多個倉庫一起使用。比如一些公共的開源框架可以從mavenCenteral上下載,一些我們公司私有的Jar可以在自己搭建的Maven私服上下載:
respositories {
mavenCentral()
maven {
url 'http://www.mavenurl.com'
}
}
有了倉庫,我們就可以通過配置告訴Gradle,我們需要依賴什么,例如:
dependencies {
compile group: 'com.squareup.okhttp3', name: 'okhttp', version: '3.0.1'
}
在上面的例子中,我們配置了一個okhttp的依賴,其中compile是依賴名稱,它的意思表示我們在編譯Java源文件時需要依賴okttp,並提供了GAV信息。
但是相對來說,上面的寫法還是稍顯麻煩的,Gradle為我們提供了簡寫的方式:
dependencies {
compile 'com.squareup.okhttp3:okhttp:3.0.1'
}
2. 配置項目&文件依賴
除了我們在上面提到的倉庫的三方依賴,我們還可以進行項目的依賴以及文件的依賴。
項目依賴示例:
dependencies {
compile project(':example')
}
依賴后,此項目中的Java等類就可以進行使用了,就像使用自己項目中的類一樣。
文件依賴,一般是依賴一個jar包(出於某些原因,不能將jar發布到Maven中心庫中,只能放在項目中),例如:
dependencies {
compile files('libs/example')
}
通過上面的配置,我們就能成功引入這兩個Jar包了。
但有時候,libs文件里的類太多了,不能一個個寫,這時候我們就可以通過以下的方式配置:
dependencies {
compile fileTree(dir: 'libs', include: '*.jar')
}
這樣配置后,libs下的文件夾的擴展名為jar的都會被依賴,非常方便。