Gradle構(gòu)建初探

1. 什么是gradle?

很高興能向大家介紹Gradle,這是一個(gè)基于JVM的富有突破性構(gòu)建工具。

它為您提供了:

一個(gè)像ant一樣,通用的靈活的構(gòu)建工具

一種可切換的,像maven一樣的基于約定約定優(yōu)于配置的構(gòu)建框架

強(qiáng)大的多工程構(gòu)建支持

強(qiáng)大的依賴(lài)管理(基于ApacheIvy)

對(duì)已有的maven和ivy倉(cāng)庫(kù)的全面支持

支持傳遞性依賴(lài)管理,而不需要遠(yuǎn)程倉(cāng)庫(kù)或者pom.xml或者ivy配置文件

ant式的任務(wù)和構(gòu)建是gradle的第一公民

基于groovy,其build腳本使用groovy dsl編寫(xiě)

具有廣泛的領(lǐng)域模型支持你的構(gòu)建

2. Gradle特性

基于聲明的構(gòu)建和基于約定的構(gòu)建

Gradle的核心在于基于Groovy的豐富而可擴(kuò)展的域描述語(yǔ)言(DSL)提澎。 Groovy通過(guò)聲明性的語(yǔ)言元素將基于聲明的構(gòu)建推向下層,你可以按你想要的方式進(jìn)行組合念链。 這些元素同樣也為支持Java, Groovy, OSGi, Web和Scala項(xiàng)目提供了基于約定的構(gòu)建盼忌。 并且,這種聲明性的語(yǔ)言是可以擴(kuò)展的钓账。你可以添加新的或增強(qiáng)現(xiàn)有的語(yǔ)言元素碴犬。 因此,它提供了簡(jiǎn)明梆暮、可維護(hù)和易理解的構(gòu)建服协。

為以依賴(lài)為基礎(chǔ)的編程方式提供語(yǔ)言支持

聲明性語(yǔ)言?xún)?yōu)點(diǎn)在于通用任務(wù)圖,你可以將其充分利用在構(gòu)建中. 它提供了最大限度的靈活性啦粹,以讓Gradle適應(yīng)你的特殊需求偿荷。

構(gòu)建結(jié)構(gòu)化

Gradle的靈活和豐富性最終能夠支持在你的構(gòu)建中應(yīng)用通用的設(shè)計(jì)模式。 例如唠椭,它可以很容易地將你的構(gòu)建拆分為多個(gè)可重用的模塊跳纳,最后再進(jìn)行組裝,但不要強(qiáng)制地進(jìn)行模塊的拆分贪嫂。 不要把原本在一起的東西強(qiáng)行分開(kāi)(比如在你的項(xiàng)目結(jié)構(gòu)里)寺庄,從而避免讓你的構(gòu)建變成一場(chǎng)噩夢(mèng)。 最后力崇,你可以創(chuàng)建一個(gè)結(jié)構(gòu)良好斗塘,易于維護(hù),易于理解的構(gòu)建亮靴。

多項(xiàng)目構(gòu)建

Gradle對(duì)多項(xiàng)目構(gòu)建的支持非常出色馍盟。項(xiàng)目依賴(lài)是首先需要考慮的問(wèn)題。 我們?cè)试S你在多項(xiàng)目構(gòu)建當(dāng)中對(duì)項(xiàng)目依賴(lài)關(guān)系進(jìn)行建模茧吊,因?yàn)樗鼈儾攀悄阏嬲膯?wèn)題域贞岭。 Gradle遵守你的布局。

Gradle提供了局部構(gòu)建的功能搓侄。 如果你在構(gòu)建一個(gè)單獨(dú)的子項(xiàng)目瞄桨,Gradle也會(huì)幫你構(gòu)建它所依賴(lài)的所有子項(xiàng)目。 你也可以選擇重新構(gòu)建依賴(lài)于特定子項(xiàng)目的子項(xiàng)目讶踪。 這種增量構(gòu)建將使得在大型構(gòu)建任務(wù)中省下大量時(shí)間讲婚。

多種方式管理依賴(lài)

不同的團(tuán)隊(duì)喜歡用不同的方式來(lái)管理他們的外部依賴(lài)。 從Maven和Ivy的遠(yuǎn)程倉(cāng)庫(kù)的傳遞依賴(lài)管理俊柔,到本地文件系統(tǒng)的jar包或目錄,Gradle對(duì)所有的管理策略都提供了方便的支持筹麸。

Groovy

Gradle的構(gòu)建腳本是采用Groovy寫(xiě)的,而不是用XML雏婶。 但與其他方法不同物赶,它并不只是展示了由一種動(dòng)態(tài)語(yǔ)言編寫(xiě)的原始腳本的強(qiáng)大。 那樣將導(dǎo)致維護(hù)構(gòu)建變得很困難留晚。 Gradle的整體設(shè)計(jì)是面向被作為一門(mén)語(yǔ)言酵紫,而不是一個(gè)僵化的框架。 并且Groovy是我們?cè)试S你通過(guò)抽象的Gradle描述你個(gè)人的story的黏合劑错维。 Gradle提供了一些標(biāo)準(zhǔn)通用的story奖地。這是我們相比其他聲明性構(gòu)建系統(tǒng)的主要特點(diǎn)。 我們的Groovy支持也不是簡(jiǎn)單的糖衣層赋焕,整個(gè)Gradle的API都是完全groovy化的参歹。只有通過(guò)Groovy才能去運(yùn)用它并對(duì)它提高效率。

自由和開(kāi)源

Gradle是一個(gè)開(kāi)源項(xiàng)目隆判,并遵循ASL許可犬庇。

3.Groovy介紹及為什么使用Groovy?

Groovy是用于Java虛擬機(jī)的一種敏捷的動(dòng)態(tài)語(yǔ)言,它是一種成熟的面向?qū)ο缶幊陶Z(yǔ)言侨嘀,既可以用于面向?qū)ο缶幊坛敉欤挚梢杂米骷兇獾哪_本語(yǔ)言。使用該種語(yǔ)言不必編寫(xiě)過(guò)多的代碼咬腕,同時(shí)又具有閉包和動(dòng)態(tài)語(yǔ)言中的其他特性欢峰。Groovy是JVM的一個(gè)替代語(yǔ)言(替代是指可以用 Groovy 在Java平臺(tái)上進(jìn)行 Java 編程),使用方式基本與使用 Java代碼的方式相同涨共,該語(yǔ)言特別適合與Spring的動(dòng)態(tài)語(yǔ)言支持一起使用纽帖,設(shè)計(jì)時(shí)充分考慮了Java集成,這使 Groovy 與 Java 代碼的互操作很容易煞赢。(注意:不是指Groovy替代java抛计,而是指Groovy和java很好的結(jié)合編程。)

我們認(rèn)為內(nèi)部DSL(基于一種動(dòng)態(tài)語(yǔ)言)相比XML在構(gòu)建腳本方面優(yōu)勢(shì)非常大照筑。它們是一對(duì)動(dòng)態(tài)語(yǔ)言吹截。 為什么使用Groovy?答案在于 Gradle 內(nèi)部的運(yùn)行環(huán)境凝危。 雖然 Gradle 核心目的是作為通用構(gòu)建工具波俄,但它還是主要面向 Java 項(xiàng)目。 這些項(xiàng)目的團(tuán)隊(duì)成員顯然熟悉 Java蛾默。我們認(rèn)為一個(gè)構(gòu)建工具應(yīng)該盡可能地對(duì)所有團(tuán)隊(duì)成員透明懦铺。你可能會(huì)想說(shuō),為什么不能使用 Java來(lái)作為構(gòu)建腳本的語(yǔ)言支鸡。 我認(rèn)為這是一個(gè)很有意義的問(wèn)題冬念。對(duì)你們的團(tuán)隊(duì)來(lái)講趁窃,它確實(shí)會(huì)有最高的透明度和最低的學(xué)習(xí)曲線。 但由于 Java 本身的局限性急前,這種構(gòu)建語(yǔ)言可能就不會(huì)那樣友善醒陆、 富有表現(xiàn)力和強(qiáng)大。這也是為什么像 Python裆针,Groovy 或者 Ruby 這樣的語(yǔ)言在這方面表現(xiàn)得更好的原因刨摩。 我們選擇了 Groovy,因?yàn)樗騄ava人員提供了目前為止最大的透明度世吨。 其基本的語(yǔ)法澡刹,類(lèi)型,包結(jié)構(gòu)和其他方面都與 Java一樣耘婚,Groovy 在這之上又增加了許多東西罢浇。但是和Java也有著共同點(diǎn)。

4.Gradle安裝

去官網(wǎng)下載https://gradle.org/目前最新版本

windows安裝:

設(shè)置環(huán)境變量

GRADLE_HOME = D:\Program Files\gradle-X.X

Path = %GRADLE_HOME%\bin

Linux安裝:

$ mkdir /opt/gradle

$ unzip -d /opt/gradle gradle-3.3-bin.zip

$ ls /opt/gradle/gradle-3.3

LICENSE ?NOTICE ?bin ?getting-started.html ?init.d ?lib ?media

$ export PATH=$PATH:/opt/gradle/gradle-3.3/bin

$ gradle -v

安裝好后默認(rèn)gradle的本地倉(cāng)庫(kù)在用戶(hù)家目錄下的.gradle里面边篮,如果想改變倉(cāng)庫(kù)位置己莺, 那 ? 么就要配置環(huán)境變量:

GRADLE_USER_HOME = 自定義目錄/.gradle

5. 構(gòu)建

本篇將講述如何用idea去構(gòu)建一個(gè)gradle多模塊關(guān)聯(lián)的項(xiàng)目,附上項(xiàng)目下載地址(https://github.com/zhangsongyang/milestone)

5.1 File->New->Project-> 選擇Gradle

5.2 next填寫(xiě)Groupld和Artifactld然后Next

這里建議勾選上Use auto-import和Create directories for empty content roots automatically戈轿,意思是說(shuō)開(kāi)啟自動(dòng)下載包和創(chuàng)建項(xiàng)目目錄結(jié)構(gòu)凌受,如果不勾選就要手動(dòng)創(chuàng)建了。

選擇上Use local gradle distribution用本地自己配置的gradle思杯,然后next胜蛉,finish。

5.3 build.gradle文件用于編寫(xiě)項(xiàng)目構(gòu)建信息色乾,settings.gradle在多模塊構(gòu)建中用于定義多個(gè)模塊名

build.gradle概要:

group'cn.zsy'

version'1.0-SNAPSHOT'

applyplugin:'java'

sourceCompatibility =1.8

//// 聲明gradle腳本自身需要使用的資源誊册,包括依賴(lài)項(xiàng)、

//第三方插件暖璧、maven倉(cāng)庫(kù)地址等

buildscript {

repositories {

mavenLocal()

mavenCentral()

jcenter()

maven {

name'Custom Maven Repository'

url'http://maven.aliyun.com/nexus/content/

repositories/central/'

}

}

dependencies {

classpath'org.gradle.api.plugins:gradle-nexus-plugin:0.4'

classpath'org.hibernate.build.gradle:

gradle-maven-publish-auth:2.0.1+'

}

}

allprojects {

group'cn.zsy'

version'1.0-SNAPSHOT'

// JVM 版本號(hào)要求

sourceCompatibility =1.8

targetCompatibility =1.8

// java編譯的時(shí)候缺省狀態(tài)下會(huì)因?yàn)橹形淖址?/p>

[compileJava,compileTestJava,javadoc]*.options*.

encoding ='UTF-8'

applyplugin:'java'

applyplugin:'idea'

applyplugin:'maven-publish'

applyplugin:'maven-publish-auth'

applyplugin:'findbugs'

applyplugin:'project-report'

repositories {

mavenLocal()

maven {

name'Custom Maven Repository'

url'http://maven.aliyun.com/nexus/content/repositories/central/'

}

mavenCentral()

jcenter()

}

publishing {

publications{

mavenJava(MavenPublication) {

fromcomponents.java

}

}

repositories {

maven {

name='thinkjoy'

url"http:/xxxx/content/repositories/

${project.version.endsWith('-SNAPSHOT') ?'snapshots':'releases'}"

}

}

}

ext{

jedisVersion ='2.9.0'

commonslang3Version ='3.5'

nettyVersion ='4.1.8.Final'

}

dependencies {

compile"redis.clients:jedis:${jedisVersion}"

compile"org.apache.commons:commons-lang3:${commonslang3Version}"

compilegroup:'org.aspectj',name:'aspectjweaver',version:'1.8.10'

compilegroup:'org.slf4j',name:'slf4j-api',version:'1.7.23'

compilegroup:'org.slf4j',name:'slf4j-log4j12',version:'1.7.23'

compilegroup:'log4j',name:'log4j',version:'1.2.17'

compilegroup:'com.alibaba',name:'fastjson',version:'1.2.24'

compilegroup:'org.springframework',name:'spring-context',version:'4.3.6.RELEASE'

compilegroup:'org.springframework',name:'spring-context-support',version:'4.3.6.RELEASE'

compilegroup:'org.springframework',name:'spring-jdbc',version:'4.3.6.RELEASE'

compilegroup:'org.springframework',name:'spring-orm',version:'4.3.6.RELEASE'

compilegroup:'org.springframework',name:'spring-aspects',version:'4.3.6.RELEASE'

compilegroup:'org.springframework',name:'spring-oxm',version:'4.3.6.RELEASE'

compilegroup:'org.springframework',name:'spring-test',version:'4.3.6.RELEASE'

testCompilegroup:'junit',name:'junit',version:'4.12'

}

findbugs {

ignoreFailures =true

// ? ?findbugsTest.enabled=false

}

tasks.withType(FindBugs) {

reports{

xml.enabled =false

html.enabled =true

}

}

}

buildscript是用來(lái)聲明gradle腳本自身需要的資源案怯,包括依賴(lài)項(xiàng)、第三方插件澎办、maven倉(cāng)庫(kù)地址等嘲碱。

allprojects用于聲明所用模塊的共有信息。

apply plugin:'java'

定義一個(gè)Java項(xiàng)目只需如此而已.這將會(huì)為你添加Java插件及其一些內(nèi)置任務(wù).

apply plugin:'findbugs'

該插件向你的項(xiàng)目添加了大量的執(zhí)行質(zhì)量檢查的任務(wù)局蚀。

applyplugin:'maven-publish'

applyplugin:'maven-publish-auth'

用于發(fā)布到本地倉(cāng)庫(kù)或遠(yuǎn)程倉(cāng)庫(kù)上的插件麦锯。

repositories {

mavenLocal()

maven {

name'Custom Maven Repository'

url'http://maven.aliyun.com/nexus/content/repositories/central/'

}

mavenCentral()

jcenter()

}

用于配置倉(cāng)庫(kù)

mavenLocal()是本地倉(cāng)庫(kù)

maven {

name 'Custom Maven Repository'

url 'http://maven.aliyun.com/nexus/content/repositories/central/'

}

自定義自己的遠(yuǎn)程倉(cāng)庫(kù)

mavenCentral() ? jcenter()中央倉(cāng)庫(kù)

publishing {

publications{

mavenJava(MavenPublication) {

fromcomponents.java

}

}

repositories {

maven {

name='thinkjoy'

url"http://repo.qtonecloud.cn/content/repositories/${project.version.endsWith('-SNAPSHOT') ?'snapshots':'releases'}"

}

}

}

配置publish到那個(gè)遠(yuǎn)程倉(cāng)庫(kù),配置成功在idea上可以看到遠(yuǎn)程倉(cāng)庫(kù)的名字

ext{

jedisVersion ='2.9.0'

commonslang3Version ='3.5'

nettyVersion ='4.1.8.Final'

}

ext用于定義一些配置的版本信息琅绅,如jar的版本號(hào)扶欣。

dependencies

下面定義依賴(lài)的jar

compile"org.apache.commons:commons-lang3:${commonslang3Version}"

compilegroup:'org.aspectj',name:'aspectjweaver',version:'1.8.10'

compile project(':milestone-service')

providedCompile"javax.servlet:javax.servlet-api:3.1.0"

testCompilegroup:'junit',name:'junit',version:'4.12'

http://mvnrepository.com/可以查找jar的gradle的坐標(biāo)

applyplugin:'war'

添加用于組裝 web 應(yīng)用程序的 WAR 文件的支持。

上圖紅框中一般是比較常用的幾個(gè)task,

用gradle打好war包后可以用gradle的tomcat插件或idea里面配置tomcat來(lái)發(fā)布web程序料祠。

實(shí)例代碼參見(jiàn):https://github.com/zhangsongyang/milestone

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末骆捧,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子术陶,更是在濱河造成了極大的恐慌凑懂,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,839評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件梧宫,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡摆碉,警方通過(guò)查閱死者的電腦和手機(jī)塘匣,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)巷帝,“玉大人忌卤,你說(shuō)我怎么就攤上這事±闫茫” “怎么了驰徊?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,116評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)堕阔。 經(jīng)常有香客問(wèn)我棍厂,道長(zhǎng),這世上最難降的妖魔是什么超陆? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,371評(píng)論 1 279
  • 正文 為了忘掉前任牺弹,我火速辦了婚禮,結(jié)果婚禮上时呀,老公的妹妹穿的比我還像新娘张漂。我一直安慰自己,他們只是感情好谨娜,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布航攒。 她就那樣靜靜地躺著,像睡著了一般趴梢。 火紅的嫁衣襯著肌膚如雪漠畜。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,111評(píng)論 1 285
  • 那天垢油,我揣著相機(jī)與錄音盆驹,去河邊找鬼。 笑死滩愁,一個(gè)胖子當(dāng)著我的面吹牛躯喇,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 38,416評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼廉丽,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼倦微!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起正压,我...
    開(kāi)封第一講書(shū)人閱讀 37,053評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤欣福,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后焦履,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體拓劝,經(jīng)...
    沈念sama閱讀 43,558評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評(píng)論 2 325
  • 正文 我和宋清朗相戀三年嘉裤,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了郑临。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,117評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡屑宠,死狀恐怖厢洞,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情典奉,我是刑警寧澤躺翻,帶...
    沈念sama閱讀 33,756評(píng)論 4 324
  • 正文 年R本政府宣布,位于F島的核電站卫玖,受9級(jí)特大地震影響公你,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜骇笔,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評(píng)論 3 307
  • 文/蒙蒙 一省店、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧笨触,春花似錦懦傍、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,315評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至虚吟,卻和暖如春寸认,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背串慰。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,539評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工偏塞, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人邦鲫。 一個(gè)月前我還...
    沈念sama閱讀 45,578評(píng)論 2 355
  • 正文 我出身青樓灸叼,卻偏偏與公主長(zhǎng)得像神汹,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子古今,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評(píng)論 2 345

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

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理屁魏,服務(wù)發(fā)現(xiàn),斷路器捉腥,智...
    卡卡羅2017閱讀 134,600評(píng)論 18 139
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,748評(píng)論 6 342
  • 導(dǎo)語(yǔ): 隨著技術(shù)的發(fā)展氓拼,不管是前端開(kāi)發(fā)、服務(wù)端開(kāi)發(fā)或者是移動(dòng)端開(kāi)發(fā)(移動(dòng)也是前端的一個(gè)分支)中都會(huì)用到自動(dòng)化構(gòu)建工...
    伊始雨深閱讀 3,020評(píng)論 0 4
  • spring官方文檔:http://docs.spring.io/spring/docs/current/spri...
    牛馬風(fēng)情閱讀 1,648評(píng)論 0 3
  • 目前為止抵碟,我們已經(jīng)學(xué)習(xí)了如何修改Gradle構(gòu)建屬性桃漾,以及如何運(yùn)行任務(wù)。本章拟逮,我們會(huì)深入了解這些屬性呈队,并且創(chuàng)建我們...
    sollian閱讀 2,600評(píng)論 0 8