• <tr id="yyy80"></tr>
  • <sup id="yyy80"></sup>
  • <tfoot id="yyy80"><noscript id="yyy80"></noscript></tfoot>
  • 99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看 ?

    大型Java項(xiàng)目中Gradle的應(yīng)用

    2014-04-29 00:44:03王毅敏
    中國(guó)電子商情 2014年5期
    關(guān)鍵詞:子項(xiàng)目腳本代碼

    王毅敏

    引言:Gradle是基于Groovy語(yǔ)言的構(gòu)建工具。本文闡述了如何利用Gradle構(gòu)建易描述的、可維護(hù)的、簡(jiǎn)潔的、高性能項(xiàng)目。

    Gradle作為新的構(gòu)建工具,它是基于Groovy語(yǔ)言的構(gòu)建工具,既保持了Maven的優(yōu)點(diǎn),又通過使用Groovy定義的DSL[1],克服了Maven中使用XML繁冗以及不靈活等缺點(diǎn)。在最近這段時(shí)間里,我在使用Gradle作為構(gòu)建腳本的大型Java項(xiàng)目上工作,更深切體會(huì)到Gradle在項(xiàng)目構(gòu)建過程中是如此的簡(jiǎn)單、易用。

    一、多Module的項(xiàng)目

    Maven的一個(gè)缺點(diǎn)就是:Maven不支持多module的構(gòu)建。在Micro-Service架構(gòu)風(fēng)格流行的今天,在一個(gè)項(xiàng)目里面包含多個(gè)Module已成為一種趨勢(shì)。Gradle天然支持多module,并且提供了很多手段來簡(jiǎn)化構(gòu)建腳本。在Gradle中,一個(gè)模塊就是它的一個(gè)子項(xiàng)目(subproject),所以,我使用父項(xiàng)目來描述頂級(jí)項(xiàng)目,使用子項(xiàng)目來描述頂級(jí)項(xiàng)目下面的模塊。

    (一)配置子項(xiàng)目

    在多模塊的項(xiàng)目中,Gradle遵循慣例優(yōu)于配置(Convention Over Configuration)原則。

    在父項(xiàng)目的根目錄下尋找settings.gradle文件,在該文件中設(shè)置想要包括到項(xiàng)目構(gòu)建中的子項(xiàng)目。在構(gòu)建的初始化階段(Initialization),Gradle會(huì)根據(jù)settings.gradle文件來判斷有哪些子項(xiàng)目被include到了構(gòu)建中,并為每一個(gè)子項(xiàng)目初始化一個(gè)Project對(duì)象,在構(gòu)建腳本中通過project(‘:sub-project-name)來引用子項(xiàng)目對(duì)應(yīng)的Project對(duì)象。通常,多模塊項(xiàng)目的目錄結(jié)構(gòu)要求將子模塊放在父項(xiàng)目的根目錄下,但是如果有特殊的目錄結(jié)構(gòu),可以在settings.gradle文件中配置。

    (二)共享配置

    在大型Java項(xiàng)目中,子項(xiàng)目之間必然具有相同的配置項(xiàng)。我們?cè)诰帉懘a時(shí),要追求代碼重用和代碼整潔;而在編寫Gradle腳本時(shí),同樣需要保持代碼重用和代碼整潔。Gradle提供了不同的方式使不同的項(xiàng)目能夠共享配置。

    (三)獨(dú)享配置

    在項(xiàng)目中,除了設(shè)置共同配置之外,每個(gè)子項(xiàng)目還會(huì)有其獨(dú)有的配置。比如每個(gè)子項(xiàng)目具有不同的依賴以及每個(gè)子項(xiàng)目特殊的task等。Gradle提供了兩種方式來分別為每個(gè)子項(xiàng)目設(shè)置獨(dú)有的配置(1)在父項(xiàng)目的build.gradle文件中通過project(‘:sub-project-name)來設(shè)置對(duì)應(yīng)的子項(xiàng)目的配置。(2)我們還可以在每個(gè)子項(xiàng)目的目錄里建立自己的構(gòu)建腳本。對(duì)于子項(xiàng)目少,配置簡(jiǎn)單的小型項(xiàng)目,推薦使用第一種方式配置,這樣就可以把所有的配置信息放在同一個(gè)build.gradle文件里。但是,若是對(duì)于子項(xiàng)目多,并且配置復(fù)雜的大型項(xiàng)目,使用第二種方式對(duì)項(xiàng)目進(jìn)行配置會(huì)更好。因?yàn)?,第二種配置方式將各個(gè)項(xiàng)目的配置分別放到單獨(dú)的build.gradle文件中去,可以方便設(shè)置和管理每個(gè)子項(xiàng)目的配置信息。

    (四)其他共享

    在Gradle中,除了上面提到的配置信息共享,還可以共享方法以及Task??梢栽诟夸浀腷uild.gradle文件中添加所有子項(xiàng)目都需要的方法,在子項(xiàng)目的build.gradle文件中調(diào)用在父項(xiàng)目build.gradle腳本里定義的方法。

    二、環(huán)境的配置

    為了方便地將應(yīng)用部署到開發(fā)、測(cè)試以及產(chǎn)品等不同環(huán)境上,Gradle提供了幾種不同的方式為不同的環(huán)境打包,使得不同的環(huán)境可以使用不同的配置文件。此外,它還提供了簡(jiǎn)單的方法,使得我們能夠便捷地初始化數(shù)據(jù)庫(kù)。

    (一)Properties配置

    要為不同的環(huán)境提供不一樣的配置信息,Maven選擇使用profile,而Gradle則提供了兩種方法為構(gòu)建腳本提供Properties配置:第一種方式是使用傳統(tǒng)的properties文件, 然后在使用Gradle時(shí),通過傳入不同的參數(shù)加載不同的properties文件。例如,我們可以在項(xiàng)目中提供development.properties、test.properties和production.properties。在項(xiàng)目運(yùn)行時(shí),使用-Pprofile=development來指定加載開發(fā)環(huán)境的配置。另外一種方式就是使用Groovy的語(yǔ)法,定義可讀性更高的配置文件。

    (二)替換

    通過不同的方式加載不同環(huán)境的配置后,就需要把它們替換到有占位符的配置文件中去。在配置文件中使用@key@來標(biāo)注要被替換的位置。

    (三)初始化數(shù)據(jù)庫(kù)

    在項(xiàng)目開發(fā)過程中,為了方便為不同環(huán)境構(gòu)建相同的數(shù)據(jù)庫(kù)及數(shù)據(jù),我們通常需創(chuàng)建數(shù)據(jù)庫(kù)的表以及插入一些初始化數(shù)據(jù)。Gradle目前沒有提供相關(guān)的Task或者Plugin,但是我們可以自己創(chuàng)建Task去運(yùn)行SQL來初始化各個(gè)環(huán)境上的數(shù)據(jù)庫(kù)。前面也提到Gradle是Groovy定義的DSL,所以我們可以在Gradle中使用Groovy的代碼來執(zhí)行SQL腳本文件。在Gradle腳本中,使用Groovy加載數(shù)據(jù)庫(kù)的Driver之后,就可以使用Groovy提供的Sql類去執(zhí)行SQL來初始化數(shù)據(jù)庫(kù)了。

    三、代碼質(zhì)量

    代碼質(zhì)量是軟件開發(fā)質(zhì)量的一部分,除了人工代碼評(píng)審之外,在把代碼提交到代碼庫(kù)之前,還應(yīng)該使用自動(dòng)檢查工具來自動(dòng)檢查代碼,來保證項(xiàng)目的代碼質(zhì)量。下面介紹一下Gradle提供的支持代碼檢查的插件。

    (一)CheckStyle

    CheckStyle是SourceForge下的一個(gè)項(xiàng)目,提供了一個(gè)幫助JAVA開發(fā)人員遵守某些編碼規(guī)范的工具。它能夠自動(dòng)化代碼規(guī)范檢查過程,從而使得開發(fā)人員從這項(xiàng)重要卻枯燥的任務(wù)中解脫出來。

    (二)FindBugs

    FindBugs是一個(gè)靜態(tài)分析工具,它檢查類或者JAR文件,將字節(jié)碼與一組缺陷模式進(jìn)行對(duì)比以發(fā)現(xiàn)可能的問題。同樣也可以在FindBugs的配置階段(Configuration)設(shè)置其相關(guān)的屬性,比如Report的輸出目錄、檢查哪些sourceSet等。

    (三)JDepend

    在開發(fā)Java項(xiàng)目時(shí)經(jīng)常會(huì)遇到關(guān)于包混亂的問題,JDepend工具可以幫助你在開發(fā)過程中隨時(shí)跟蹤每個(gè)包的依賴性(引用/被引用),從而設(shè)計(jì)高維護(hù)性的架構(gòu),不論是在打包發(fā)布還是版本升級(jí)都會(huì)更加輕松。在構(gòu)建腳本中加入如下代碼即可:apply plugin: 'jdepend'

    (四)PMD

    PMD是一種開源分析Java代碼錯(cuò)誤的工具。與其他分析工具不同的是,PMD通過靜態(tài)分析獲知代碼錯(cuò)誤,即在不運(yùn)行Java程序的情況下報(bào)告錯(cuò)誤。PMD附帶了許多可以直接使用的規(guī)則,利用這些規(guī)則可以找出Java源程序的許多問題。

    四、依賴

    幾乎每個(gè)Java項(xiàng)目都會(huì)用到開源框架。同時(shí),對(duì)于具有多個(gè)子模塊的項(xiàng)目來說,項(xiàng)目之間也會(huì)有所依賴。所以,管理項(xiàng)目中對(duì)開源框架和其他模塊的依賴是每個(gè)項(xiàng)目必須面對(duì)的問題。同時(shí),Gradle也使用Repository來管理依賴。

    (一)Jar包依賴管理

    Gradle沿用Maven的依賴管理方法,通過groupId、name和version到配置的Repository里尋找指定的Jar包。同樣,它也提供了和Maven一樣的構(gòu)建生命周期,compile、runtime、testCompile和testRuntime分別對(duì)應(yīng)項(xiàng)目不同階段的依賴。

    (二)子項(xiàng)目之間的依賴

    對(duì)于多模塊的項(xiàng)目,項(xiàng)目中的某些模塊需要依賴于其他模塊,前面提到在初始化階段,Gradle為每個(gè)模塊都創(chuàng)建了一個(gè)Project對(duì)象,并且可以通過模塊的名字引用到該對(duì)象。在配置模塊之間的依賴時(shí),使用這種方式可以告訴Gradle當(dāng)前模塊依賴了哪些子模塊。

    (三)構(gòu)建腳本的依賴

    除了項(xiàng)目需要依賴之外,構(gòu)建腳本本身也可以有自己的依賴。當(dāng)使用一個(gè)非Gradle官方提供的插件時(shí),就需要在構(gòu)建腳本里指定其依賴,當(dāng)然還需要指定該插件的Repository。在Gradle中,使用buildscript塊為構(gòu)建腳本配置依賴。

    五、其他

    (一)apply其他Gradle文件

    當(dāng)一個(gè)項(xiàng)目很復(fù)雜的時(shí)候,Gradle腳本也會(huì)很復(fù)雜,除了將子項(xiàng)目的配置移到對(duì)應(yīng)項(xiàng)目的構(gòu)建腳本之外,還可以按照不同的功能將復(fù)雜的構(gòu)建腳本拆分成小的構(gòu)建腳本,然后在build.gradle里使用apply from,將這些小的構(gòu)建腳本引入到整體的構(gòu)建腳本中去。

    (二)project的目錄

    在腳本文件中,需要訪問項(xiàng)目中的各級(jí)目錄結(jié)構(gòu)。Gradle為Project對(duì)象定義了一些屬性指向項(xiàng)目的根目錄,方便在腳本中引用:rootDir:在子項(xiàng)目的腳本文件中可以通過該屬性訪問到根項(xiàng)目路徑。rootProject:在子項(xiàng)目中,可以通過該屬性獲取父項(xiàng)目的Project對(duì)象。

    (三)使用Wrapper指定Gradle的版本

    為了統(tǒng)一項(xiàng)目中Gradle的版本,可以在構(gòu)建腳本中通過定義一個(gè)wrapper的Task,并在該Task中指定Gradle的版本以及存放Gradle的位置。

    (四)使用gradle.properties文件

    Gradle構(gòu)建腳本會(huì)自動(dòng)找同級(jí)目錄下的gradle.properties文件,在這個(gè)文件中可以定義一些property,以供構(gòu)建腳本使用。

    結(jié)束語(yǔ)

    由于篇幅有限,本文只是我在一個(gè)大型Java項(xiàng)目上使用Gradle的部分經(jīng)驗(yàn),并未涵蓋所有Gradle相關(guān)的知識(shí)。另外,Gradle是基于Groovy的構(gòu)建工具,在使用Gradle的時(shí)候也需要了解和使用Groovy。所以,在學(xué)習(xí)Gradle插件的過程中,也能學(xué)會(huì)Groovy相關(guān)的用法,可謂一舉兩得。

    參考文獻(xiàn)

    [1]Wikipedia.Domain-specific language. http://en.wikipedia.org/wiki/Domain-specific_language.2013-11-8.

    (作者單位:南京工業(yè)職業(yè)技術(shù)學(xué)院 國(guó)際教育學(xué)院)

    猜你喜歡
    子項(xiàng)目腳本代碼
    酒駕
    服務(wù)進(jìn)程中消費(fèi)者對(duì)子項(xiàng)目順序的遵從性研究
    活性炭為中心綜合項(xiàng)目總體布局
    山西化工(2021年4期)2021-01-25 14:15:18
    安奇奇與小cool 龍(第二回)
    創(chuàng)世代碼
    創(chuàng)世代碼
    創(chuàng)世代碼
    創(chuàng)世代碼
    數(shù)據(jù)庫(kù)系統(tǒng)shell腳本應(yīng)用
    快樂假期
    名山县| 马龙县| 北辰区| 重庆市| 镇巴县| 房产| 云林县| 民丰县| 普兰店市| 武义县| 宁阳县| 申扎县| 贵定县| 汉源县| 如东县| 通河县| 商都县| 阿拉善盟| 杭锦旗| 南宫市| 甘谷县| 上杭县| 平定县| 岳普湖县| 普定县| 罗山县| 星子县| 和顺县| 正安县| 海兴县| 保山市| 西峡县| 哈尔滨市| 阳城县| 晋宁县| 万全县| 乌鲁木齐市| 台山市| 南昌市| 射洪县| 景宁|