我們已經(jīng)知道模叙,Gradle是一個非常靈活的構(gòu)建框架严里,他提供了構(gòu)建的基礎(chǔ)核心新啼,為了對具體的業(yè)務(wù)進(jìn)行構(gòu)建,Gradle在此基礎(chǔ)上提供了插件的概念刹碾,這樣就能基于Gradle進(jìn)行很好的擴(kuò)展燥撞,而不改變其核心基礎(chǔ),又能滿足不同業(yè)務(wù)的需要迷帜,這也是我們在架構(gòu)中參考的物舒。
我們做過Java開發(fā)都了解,它的大體流程都差不多瞬矩,無非就是依賴第三方庫茶鉴,編譯源文件,進(jìn)行單元測試景用,打包發(fā)布等等涵叮,每個Java工程都差不多,Gradle為了不讓我們在每個Java工程里都做這些重復(fù)的勞動工作伞插,為了我們提供了非常核心割粮、常用的Java,我們只要應(yīng)用它,就可以非常輕松的構(gòu)建出一個項目了媚污。
6.1 如何應(yīng)用
基于我們之前講的應(yīng)用插件章節(jié)舀瓢,很容易的應(yīng)用Java插件,我們常用的方式就是使用簡稱應(yīng)用:
apply plugin: 'java'
通過以上腳本應(yīng)用之后耗美,Java插件會為你的工程添加很多有用的默認(rèn)設(shè)置和約定京髓,比如源代碼的位置,單元測試代碼的位置商架,資源文件的位置等等堰怨,一般情況下我們最好都遵循它的默認(rèn)設(shè)置,這樣做的好處一來是我們不用寫太多的腳本來自定義蛇摸,二來便于團(tuán)隊協(xié)作备图,因為這是約定俗成的,大家都容易理解赶袄。
6.2 Java插件約定的項目結(jié)構(gòu)
我們前面的章節(jié)講了Gradle的插件會為我們做一些默認(rèn)設(shè)置和約定揽涮,這些約定很泛很雜,現(xiàn)在我們講講Java插件中為我們約定的Java的項目結(jié)構(gòu)是怎樣的饿肺,只有我們遵循了這些約定蒋困,Java插件才能找到我們的Java類,找到我們的資源進(jìn)行編譯唬格,找到我們的單元測試類進(jìn)行單元測試等等家破。
默認(rèn)情況下颜说,Java插件約定src/main/java下為我們的項目源代碼存放目錄;src/main/resources為要打包的文件存放目錄汰聋,比如一些Properties配置文件和圖片等门粪;src/test/java為我們的單元測試用例存放目錄,我們執(zhí)行單元測試的時候烹困,Gradle會在這個目錄下搜索我們的單元測試用例執(zhí)行玄妈;src/test/resources里存放的是我們單元測試中使用的文件。
main和test是Java插件為我們內(nèi)置的兩個源代碼集合髓梅,那么我們可以不可以自己添加一些呢拟蜻,比如我有一個vip版本,是不是可以添加一個vip的目錄來存放vip相關(guān)的java源碼和文件呢枯饿,這個是完全可以的酝锅,如果要實現(xiàn)這個目的,我們在build腳本里這么配置
添加一個vip的源代碼集合(源集)奢方,然后我們在src下新建vip/java搔扁、vip/resources目錄就可以分別存放vip相關(guān)的源代碼和資源文件了。仿照例子我們可以添加很多的源集蟋字,他們默認(rèn)的目錄結(jié)構(gòu)是:
src/sourceSet/java
src/sourceSet/resources
看到這里稿蹲,讀者有沒有發(fā)現(xiàn)這個和我們Android多渠道打包發(fā)布很像(Android插件詳細(xì)介紹)。關(guān)于源集的改變我們后面是詳細(xì)講鹊奖,這里大家知道先這樣使用苛聘。
以上是Java默認(rèn)定義的文件目錄,特殊情況下我們可以改變他們忠聚,所以不建議這么做设哗,下面我們說說改變的方法,只需要在build腳本配置對應(yīng)目錄即可两蟀。
一般從Eclipse工程遷移過來的時候熬拒,我們的目錄結(jié)構(gòu)還是src這樣的,一時不好去改變目錄垫竞,所以可以采用這種配置,更改Java插件默認(rèn)的目錄即可蛀序。
6.3 如何配置第三方依賴
作為一個Java項目欢瞪,不可避免的會依賴很多第三方Jar,這也是值得提倡的徐裸,因為有很多優(yōu)秀的開源工具和框架讓我們更高效的研發(fā)遣鼓,而不是重復(fù)發(fā)明輪子。
要想使用這些第三方依賴重贺,你要告訴Gradle如何找到這些依賴骑祟,也就是我們要講的依賴配置回懦。一般情況下我們都是從倉庫中查找我們需要的Jar包,在Gradle中要配置一個倉庫的Jar依賴次企,首先我們得告訴Gradle我們要使用什么類型的倉庫怯晕,這些倉庫的位置在哪里,這里Gradle從知道從哪里去搜尋我們依賴的Jar缸棵。
以上腳本我們配置了一個Maven中心庫舟茶,告訴Gradle可以在Maven中心庫中搜尋我們依賴的Jar,初次之外堵第,我們也可以從jcenter庫吧凉、ivy庫、本地Maven庫mavenLocal踏志、自己搭建的Maven私服庫等等中搜尋阀捅,甚至我們本地配置的文件夾也可以作為一個倉庫,由此可見针余,Gradle支持的倉庫非常豐富饲鄙,也可以多個庫一起使用,比如一些公共的開源框架可以從mavenCentral上下載涵紊,一些我們公司自己的私有Jar可以在我們公司自己搭建的Maven私服上下載:
好了傍妒,有了倉庫,就需要通過配置來告訴Gradle我們需要依賴什么:
上面例子中我們配置了一個okhttp的依賴摸柄,其中compile是依賴名稱颤练,它的意思表示我們在編譯Java源文件時需要依賴okhttp;group驱负、name嗦玖、以及version,看他們的名字和順序跃脊,我們熟悉Maven的非常熟悉宇挫,他們就是Maven中的GAV(groupid、artifactid酪术、version)器瘪,這是Maven非常重要的組成文件,他們?nèi)齻€合起來標(biāo)記一個唯一的構(gòu)件绘雁。
是不是覺得每次寫group橡疼、name、version非常麻煩庐舟,是的欣除,我也是,Gradle這么好用的工具不會想不到挪略,所以為我們提供了簡寫的方式:
前面我們剛剛提了compile這個依賴历帚,他是一個編譯時依賴滔岳,那么有沒有專門針對單元測試代碼編譯的依賴呢,比如junit4挽牢,我正常的代碼編譯時根本用不上谱煤,如果強(qiáng)制使用compile也可以,但是會junit4就會被打包到發(fā)布的產(chǎn)品中卓研,這不能增加了產(chǎn)品的大小趴俘,也為維護(hù)帶來了不變,所以Gradle為我們提供了testCompile依賴奏赘,它只會在編譯單元測試用例是使用寥闪,不會打包到發(fā)布的產(chǎn)品中,職責(zé)分明∧ヌ剩現(xiàn)在我們看看還為我們提供了哪些依賴疲憋。
除此之外,Java插件可以為不同的源集在編譯時和運(yùn)行時指定不同的依賴梁只,比如main源集指定一個編譯時的依賴缚柳,vip源集可以指定另外一個不同的依賴。
我們剛剛講的基于庫的這種依賴是外部模塊的依賴搪锣,一般都會配置一個倉庫秋忙,不管是Maven,還是Ivy等构舟。除了外部依賴之外灰追,常用的還有項目依賴以及文件依賴。
項目依賴依賴的是一個Gradle項目狗超,是在Settings Build文件中配置過的弹澎,依賴一個項目非常簡單,比如
這就是一個項目依賴努咐,依賴后苦蒿,這個項目中的java類等就會為你所用,就像使用自己項目中的類一樣渗稍。
其次還有文件依賴佩迟,這種一般是依賴一個Jar包,由于各種原因竿屹,我們不能把這個jar發(fā)布到Maven中心庫中音五,也沒有自己搭建Maven私服,所以只能放在項目中羔沙,加入就放在libs文件夾下吧,現(xiàn)在我們就需要依賴它厨钻,然后才能使用它提供的功能:
這樣我們就配置了依賴扼雏,成功的引入了這兩個jar包坚嗜。但是有時候我們libs文件夾里的類太多,不能一個個這么寫啊诗充,太多了苍蔬,這種情況Gradle也為我們考慮到了
這樣配置后,libs文件加下的擴(kuò)展名為jar的都會被依賴蝴蜓,非常方便碟绑,這里用到的是Project的fileTree方法,而不是上面用的files方法茎匠。
6.4 如何構(gòu)建一個Java項目
在Gradle中格仲,執(zhí)行任何操作都是任務(wù)驅(qū)動的,構(gòu)建Java項目也不例外诵冒。Java插件為我們提供了很多任務(wù)凯肋,通過運(yùn)行他們來達(dá)到我們構(gòu)建Java項目的目的。最常用任務(wù)是build任務(wù)汽馋,運(yùn)行它會構(gòu)建你的整個項目侮东,我們可以通過./gradlew build執(zhí)行,然后gradle就會編譯你的源碼文件豹芯,處理你的資源文件悄雅,打成jar包,然后編譯測試用例代碼铁蹈,處理測試資源宽闲,最后運(yùn)行單元測試。下面我們運(yùn)行下看看效果:
看下任務(wù)運(yùn)行的順序木缝,就能看出我們在構(gòu)建整個Java項目的時候便锨,Java插件都做了哪些事情。最后在build/libs生成jar包我碟。
除了build任務(wù)放案,還有一些其他常用的任務(wù),比如clean矫俺,這個是刪除build目錄以及其他構(gòu)建生成的文件吱殉,如果編譯中有問題,可以先執(zhí)行clean厘托,然后再重新build友雳。
還有assemble任務(wù),該任務(wù)不會執(zhí)行單元測試铅匹,只會編譯和打包押赊,這個任務(wù)在Android里也有,執(zhí)行它可以打apk包包斑,所以它不止會打jar包流礁,其實它算是一個引導(dǎo)類的任務(wù)涕俗,根據(jù)不同的項目類型打出不同的包。
還有check任務(wù)神帅,它只會執(zhí)行單元測試再姑,有時候還會做一些質(zhì)量檢查,不會打jar包找御,也是個引導(dǎo)任務(wù)元镀。
javadoc任務(wù),可以為我們生成java格式的doc api文檔霎桅。
通過運(yùn)行不同的任務(wù)栖疑,進(jìn)行不同的構(gòu)建,達(dá)到不同的目的哆档。
6.5 源碼集合(SourceSet)概念
SourceSet-源代碼集合-源集蔽挠,是Java插件用來描述和管理源代碼及其資源的一個抽象概念,是一個Java源代碼文件和資源文件的集合瓜浸。通過源集澳淑,我們可以非常方便的訪問源代碼目錄,設(shè)置源集的屬性插佛,更改源集的java目錄或者資源目錄等等杠巡。
有了源集,我們就能針對不同的業(yè)務(wù)和應(yīng)用對我們源代碼進(jìn)行分組雇寇,比如用于主要業(yè)務(wù)產(chǎn)品的main以及用于單元測試的test氢拥,職責(zé)分明清晰。他們兩個也是Java插件默認(rèn)內(nèi)置的兩個標(biāo)準(zhǔn)源集锨侯。
Java插件在Project下為我們提供了一個sourceSets屬性以及一個sourceSets {}閉包來訪問和配置源集嫩海。sourceSets是是一個SourceSetContainer,我們可以參見它的API囚痴,看它有哪些方法和屬性供我們使用叁怪。sourceSets{}閉包配置的都是SourceSet對象,下面我們會講它有哪些配置深滚。
源集有很多有用的屬性奕谭,通過這些屬性我們可以很方便的訪問或者對源集進(jìn)行配置。下面列出一些常用的
6.6 Java插件添加的任務(wù)
Java插件為我們添加了很多有用的任務(wù)痴荐,我們已經(jīng)介紹了一些血柳,這一小結(jié)再詳細(xì)介紹一些。
以上這些是對所有Java項目都適用的任務(wù)生兆,對于內(nèi)置的main和test源集甚至我們自己的新增的源集也新增了一些任務(wù)
運(yùn)行任務(wù)的時候难捌,列表中的任務(wù)名稱中的sourceSet要換成你的源集的名稱,比如main源集的就是compileMainJava。
此外還有一些用于描述整個構(gòu)建生命周期的任務(wù)根吁,比如assemble昆汹,build,check等等婴栽,這里就不一一介紹了,想具體了解的可以參考相關(guān)文檔辈末。
6.7 Java插件添加的屬性
Java插件添加了很多常用的屬性愚争,這些屬性都被添加到Project中,我們可以直接使用他們挤聘,比如我們前面已經(jīng)用到的sourceSets轰枝。
以上這些都是我們常用的屬性,注意看它的類型组去,然后對比Gradle API文檔看他沒有有哪些可以使用的方法或者屬性鞍陨。
6.8 多項目構(gòu)建
多項目構(gòu)建,其實就是多個Gradle項目一起構(gòu)建从隆,比如我們本書的例子已經(jīng)是一個多項目了诚撵,他們一起通過Settings.gradle配置管理,每個項目里都有一個Build文件對該項目進(jìn)行配置键闺,然后采用項目依賴寿烟,就可以實現(xiàn)多個項目協(xié)作,這對于我們大項目的辛燥,模塊化非常有用筛武。
下面我們以一個多項目構(gòu)建的例子,來說明多個項目之間如果依賴構(gòu)建挎塌。
以上是目錄結(jié)構(gòu)徘六,app是我們的主項目,base是我們的基礎(chǔ)依賴項目榴都。下面我們在Settings.gradle里配置他們待锈。
現(xiàn)在這兩個項目已經(jīng)被我們加入到Gradle項目中了,做為Gradle項目缭贡。他們分別有自己的build文件炉擅,都是應(yīng)用了Java插件,表明他們都是Java項目阳惹。
其中我們在base項目中定義了Person類以供app項目的HelloWorld使用谍失,要使用其他項目中的類,我們需要在項目中的build文件中配置項目依賴莹汤。
app/build.gradle
配置依賴后快鱼,我們就可以在app項目中隨意使用base項目中的類了,就像我們在引用一個jar包一樣。
這樣我們就完成了一個多項目中的構(gòu)建抹竹,項目之間相互協(xié)作在Gradle中變得如此容易线罕,別驚訝還有更炫的功能,有沒有注意到我們的項目都是Java項目窃判,應(yīng)用的都是Java插件钞楼,對于這類公用的配置,Gradle為我們提供了基于根項目對其所有的子項目通用配置的方法袄琳。Gradle的根項目可以理解為一個所有子項目的容器询件,我們可以在根項目中遍歷所有的子項目,在遍歷的過程中為其配置通用配置唆樊。
以上配置就是讓其所有子項目應(yīng)用了Java插件宛琅,所以所有的子項目都是Java項目啦,這比我們一個個的對每個子項目配置要方便的多逗旁,除了應(yīng)用插件我們可以配置其他公用配置嘿辟,比如倉庫.
還比如配置我們的Java項目都使用junit進(jìn)行單元測試
subprojects可以對其所有的子項目進(jìn)行配置,如果想對包括根項目在內(nèi)的所有項目進(jìn)行統(tǒng)一配置片效,我們可以使用allprojects红伦,用法和subprojects一樣,就不舉例子了堤舒,大家可以自己嘗試一下色建。
6.9 如何發(fā)布構(gòu)件
有時候我們的項目是一個庫工程,要發(fā)布Jar給其他工程使用舌缤,Gradle為我們提供了非常方便箕戳、功能搶到的發(fā)布功能,通過配置国撵,我們可以把我們的jar包發(fā)布到本地目錄陵吸、Maven庫,Ivy庫等等中介牙。
6.10 生成Idea和Eclipse配置
Gradle為我們提供了idea和eclipse插件來幫助我們生成不同IDE下的配置文件壮虫,這樣我們就能直接使用不同的IDE導(dǎo)入項目即可,滿足我們不同IDE下的快速配置開發(fā)环础。
我們執(zhí)行./gradlew :example610:idea就可以生成idea相關(guān)的工程配置文件囚似,讓我們使用IDEA可以直接把它作為IDEA工程導(dǎo)入;相似的執(zhí)行./gradlew :example610:eclipse就能生成供Eclipse直接導(dǎo)入的Eclipse工程配置文件线得。
6.11 小結(jié)
說不寫小結(jié)饶唤,又忍不住了,呵呵贯钩。寫小結(jié)因為這一章太重要募狂,最大的目的還是希望大家仔細(xì)看办素,看明白,不明白的可以給我留言祸穷,我也會一一解答性穿。
Java工程是我們最熟悉最常用的工程,Java插件對此支持非常好雷滚,我們花了10個小節(jié)介紹Java需曾,但是由于篇幅所限,還是有非常多的功能不能一一介紹祈远,比如單元測試報告胯舷,Jar包的Manifest清單配置等等,如果大家有興趣绊含,可以想看相關(guān)文檔,加深對Java插件的理解炊汹,理解了Java插件后躬充,對于我們理解下章Android插件就容易多了。
本文屬自學(xué)歷程, 僅供參考
詳情請支持原書 Android Gradle權(quán)威指南