第六章 Java Gradle插件

我們已經(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文件中配置過的弹澎,依賴一個項目非常簡單,比如

Paste_Image.png

這就是一個項目依賴努咐,依賴后苦蒿,這個項目中的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)威指南

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末讨便,一起剝皮案震驚了整個濱河市充甚,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌霸褒,老刑警劉巖伴找,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異废菱,居然都是意外死亡技矮,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進(jìn)店門殊轴,熙熙樓的掌柜王于貴愁眉苦臉地迎上來衰倦,“玉大人,你說我怎么就攤上這事旁理》悖” “怎么了?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵孽文,是天一觀的道長驻襟。 經(jīng)常有香客問我,道長芋哭,這世上最難降的妖魔是什么沉衣? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮楷掉,結(jié)果婚禮上厢蒜,老公的妹妹穿的比我還像新娘霞势。我一直安慰自己,他們只是感情好斑鸦,可當(dāng)我...
    茶點故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布愕贡。 她就那樣靜靜地躺著,像睡著了一般巷屿。 火紅的嫁衣襯著肌膚如雪固以。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天嘱巾,我揣著相機(jī)與錄音憨琳,去河邊找鬼。 笑死旬昭,一個胖子當(dāng)著我的面吹牛篙螟,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播问拘,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼遍略,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了骤坐?” 一聲冷哼從身側(cè)響起绪杏,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎纽绍,沒想到半個月后蕾久,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡拌夏,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年僧著,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片障簿。...
    茶點故事閱讀 40,096評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡霹抛,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出卷谈,到底是詐尸還是另有隱情杯拐,我是刑警寧澤,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布世蔗,位于F島的核電站端逼,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏污淋。R本人自食惡果不足惜顶滩,卻給世界環(huán)境...
    茶點故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望寸爆。 院中可真熱鬧礁鲁,春花似錦盐欺、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至析二,卻和暖如春粉洼,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背叶摄。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工属韧, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人蛤吓。 一個月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓宵喂,卻偏偏與公主長得像,于是被迫代替她去往敵國和親会傲。 傳聞我的和親對象是個殘疾皇子樊破,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,037評論 2 355

推薦閱讀更多精彩內(nèi)容

  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,822評論 6 342
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)唆铐,斷路器,智...
    卡卡羅2017閱讀 134,659評論 18 139
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,167評論 25 707
  • 互聯(lián)網(wǎng)時代到移動互聯(lián)網(wǎng)時代再到當(dāng)今的AI時代,有什么不一樣朋其?李彥宏在“全國工商聯(lián)全體機(jī)關(guān)干部會議”上給出了自己的答...
    百合熊風(fēng)暴閱讀 300評論 0 0
  • 事件層 該函數(shù)返回一個指向 input_dev 類型的指針,該結(jié)構(gòu)體是一個輸入設(shè)備結(jié)構(gòu)體,包含了輸入設(shè)備的一些相關(guān)...
    季風(fēng)落地窗閱讀 683評論 0 3