国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

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

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

王毅敏

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

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

一、多Module的項目

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

(一)配置子項目

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

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

(二)共享配置

在大型Java項目中,子項目之間必然具有相同的配置項。我們在編寫代碼時,要追求代碼重用和代碼整潔;而在編寫Gradle腳本時,同樣需要保持代碼重用和代碼整潔。Gradle提供了不同的方式使不同的項目能夠共享配置。

(三)獨享配置

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

(四)其他共享

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

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

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

(一)Properties配置

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

(二)替換

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

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

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

三、代碼質(zhì)量

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

(一)CheckStyle

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

(二)FindBugs

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

(三)JDepend

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

(四)PMD

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

四、依賴

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

(一)Jar包依賴管理

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

(二)子項目之間的依賴

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

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

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

五、其他

(一)apply其他Gradle文件

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

(二)project的目錄

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

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

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

(四)使用gradle.properties文件

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

結(jié)束語

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

參考文獻

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

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

猜你喜歡
子項目腳本代碼
酒駕
服務(wù)進程中消費者對子項目順序的遵從性研究
活性炭為中心綜合項目總體布局
安奇奇與小cool 龍(第二回)
創(chuàng)世代碼
創(chuàng)世代碼
創(chuàng)世代碼
創(chuàng)世代碼
數(shù)據(jù)庫系統(tǒng)shell腳本應(yīng)用
快樂假期