Gradle和Maven有不少相似的地方,好比採用座標Maven中採用groupId,Gradle中採用group
來配置和管理依賴,但不得不說Gradle確實比Maven強大,總的來講Gradle採納了Maven和Ant二者的優勢,下面這篇官方教程將帶你入門Gradle。html
這樣子講可能會通熟一點,我儘可能結合Gradle和Maven之間的差別來進行講解,由於不少人基本上都是從Maven轉到Gradle,或者說以前有了解過Maven,小編是以前一直使用Maven,如今使用Gradle。web
Project
Project
是什麼?首先咱們應該明白一點,Maven和Gradle都是項目管理工具,那麼很明顯項目
是它們的基本組件,或者也能夠將項目
說成工程
,本質上也是同樣的。在Gradle中,一個工程就是一個Project
,這樣講可能會很抽象,若是我告訴你Project
是Gradle源代碼的一個接口以及咱們能夠經過編程的方式來和Gradle的全部特性,(如依賴管理)打交道,你可能就會明白了。spring
Project
?有一個很明顯的問題就是咱們必需要編程才能和Gradle打交道嗎?答案是否認的,若是你已經閱讀了上面那篇入門教程,你應該知道Gradle工程下會有一個叫build.gradle
的文件,沒錯,這個文件就是Gradle工程的配置文件,並且是一對一的,一個Gradle工程有且只有一個build.gradle
配置文件。編程
這和Maven同樣,每一個工程對應一個pom.xml
文件api
build.gradle
配置文件管理咱們的工程的,即生命週期是什麼?在構建初始化階段,Gradle根據build.gradle
組裝工程的大體流程以下:bash
Settings
實例,若是Gradle工程下的settings.gradle
文件存在,則該文件將被解析成一個Settings
實例settings.gradle
文件對工程進行配置Settings
實例建立Project
實例的結構build.gradle
文件如何配置你可能很想知道我該如何對一個build.gradle
進行配置,首先你已經知道一個工程對應一個build.gradle
文件,也就是說一個build.gradle
文件就對應一個Project
實例,那麼Project
實例具備的屬性你均可以使用。app
在build.gradle
文件中採用DSL
進行配置,下面是你能夠在build.gradle
文件中配置的內容:eclipse
Task
maven
Task
是一種任務,任務是Gradle中的基本組件,Task
的概念也是收到了Ant
的啓發而設計的
Dependencies
依賴管理
Plugins
插件,就像咱們在Maven的pom.xml
文件中增長插件同樣,Gradle也能夠添加插件,常見的插件有java
,eclipse
,咱們可使用apply plugin: 'java'
加載插件
Properties
屬性配置
Methods
配置一個方法,納尼,配置文件能夠配置一個方法,你特麼在逗我!沒錯,這就是DSL
的魅力,DSL
內置支Groovy
這種腳本語言,所以,咱們能夠在build.gradle
文件中編寫相關符合groovy
語法的代碼,所以,換句話說,build.gradle
文件已經超出了配置文件的範疇,看起來更像是一個腳本文件,比配置文件更增強大。
Script Blocks
腳本塊是個很強大的特性,也是Gradle特有的。上面說到其實build.gradle
文件至關於一個腳本文件,所以腳本塊的出現也就不足爲奇了。經常使用的腳本塊有如下幾種:
allprojects
在多項目工程中對全部項目(包括子項目)的通用配置
ant
對ant提供支持
artifacts
對生成構件的支持,如生產一個jar包
buildscript
執行gradle build
命令的相關配置,主要配置構建的輸出目錄,引用的倉庫等信息
configurations
提供對依賴管理的支持
dependencies
依賴的聲明和配置
repositories
倉庫配置
subprojects
在多項目中對全部子項目的通用配置
Properties
Gradle根據Project
實例執行項目的構建文件以配置項目。你的腳本使用的任何屬性或方法都被委託給關聯的Project
對象。什麼意思呢?也就是說你能夠直接在腳本中使用Project
接口上的任何方法和屬性。
舉個例子:
defaultTasks('some-task') // Delegates to Project.defaultTasks()
reportsDir = file('reports') // Delegates to Project.file() and the Java Plugin
複製代碼
上面在腳本中配置了一個方法和一個屬性,這兩個配置都將會被應用到Project
實例上去。
固然,你也可使用project
屬性來表示Project
,即便用project
直接對Project
實例的相關屬性方法進行調用,這能夠在某些狀況下使腳本更清晰。例如,你可使用project.name
而不是name
來訪問項目名稱。
一個project
將從5個做用域來查找相關屬性,你能夠在構建文件中按名稱訪問或經過調用項目的Project.property(java.lang.String)
方法這些屬性,5個做用域分別以下:
一、Project
自己。
此做用域包括由Project
實現類聲明的任何屬性setter
和getter
方法。例如,咱們能夠通Project.getRootProject()
能夠做爲rootProject
屬性值。根據相應的getter
或setter
方法的存在,此做用域的屬性是可讀或可寫的。
二、project
的extra
屬性
每一個項目都維護一個extra
屬性的映射,其中能夠包含任意名稱->值對。一旦定義,這個做用域的屬性也是可讀寫的。
三、插件添加到項目的擴展屬性
每一個擴展名均可用做只讀屬性,其名稱與擴展名相同。
四、由插件添加到項目中的約定屬性
插件能夠經過項目的Convention
對象將屬性和方法添加到項目中。該範圍的屬性多是可讀或可寫的,具體取決於約定對象。
五、task
當成一個屬性
經過使用其名稱做爲屬性名稱能夠訪問任務。這個範圍的屬性是隻讀的。 例如,一個名爲compile
的任務能夠做爲compile
屬性訪問。
extra
屬性和約定屬性從項目的父項繼承,遞歸到根項目。 此做用域的屬性是隻讀的。
讀取屬性時,項目按順序搜索上述範圍,並從找到該屬性的第一個範圍返回值。若是沒有找到屬性,Gradle就會報錯。
在設置屬性時,項目按順序搜索上述範圍,並將屬性設置在第一個找到該屬性的範圍中。
Extra
屬性全部Extra
屬性必須經過ext
命名空間來定義。 一旦定義了一個Extra
屬性,它就直接在擁有的對象上(在下面的例子中分別是項目,任務和子項目)可用,而且能夠被讀取和更新。 Extra
屬性只有經過命名空間ext
進行聲明和初始化後才能使用。
好比下面列出了3個不一樣做用域下的Extra
屬性:
// Project自己
project.ext.prop1 = "foo"
// 任務
task doStuff {
ext.prop2 = "bar"
}
// 子項目下
subprojects { ext.${prop3} = false }
複製代碼
讀取Extra
屬性是經過ext
或經過擁有的對象完成的。
ext.isSnapshot = version.endsWith("-SNAPSHOT")
if (isSnapshot) {
// do snapshot stuff
}
複製代碼
更多屬性能夠查閱這裏
該工程爲Spring boot
工程,你們能夠經過http://start.spring.io/
配置下載,主工程包含三個子工程,分別是myapp-controller
,myapp-service
,myapp-dao
項目結構圖以下:
根目錄下的settings.gradle
rootProject.name = 'myapp'
include 'myapp-controller'
include 'myapp-service'
include 'myapp-dao'
複製代碼
build.gradle
// 構建腳本
buildscript {
ext {
springBootVersion = '2.0.2.RELEASE'
}
repositories {
mavenCentral()
maven { url 'http://maven.aliyun.com/nexus/content/groups/public/' }
}
dependencies {
classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
}
}
// 全部項目共有的配置
allprojects {
apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'org.springframework.boot'
apply plugin: 'io.spring.dependency-management'
group = 'com.example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = 1.8
repositories {
mavenCentral()
maven { url 'http://maven.aliyun.com/nexus/content/groups/public/' }
}
dependencies {
compile('org.springframework.boot:spring-boot-starter-web')
testCompile('org.springframework.boot:spring-boot-starter-test')
}
}
複製代碼
每一個子工程下的buide.gradle
description = 'myapp-controller'
dependencies {
// 該子工程包含另一個子工程
compile project(':myapp-dao')
}
複製代碼