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