Gradle學習系列----多項目構建

Gradle和Maven有不少相似的地方,好比採用座標Maven中採用groupId,Gradle中採用group來配置和管理依賴,但不得不說Gradle確實比Maven強大,總的來講Gradle採納了Maven和Ant二者的優勢,下面這篇官方教程將帶你入門Gradle。html

Gradle入門(翻譯自Graddle官網)java

這樣子講可能會通熟一點,我儘可能結合Gradle和Maven之間的差別來進行講解,由於不少人基本上都是從Maven轉到Gradle,或者說以前有了解過Maven,小編是以前一直使用Maven,如今使用Gradle。web

1、Gradle中的Project

一、Project是什麼?

首先咱們應該明白一點,Maven和Gradle都是項目管理工具,那麼很明顯項目是它們的基本組件,或者也能夠將項目說成工程,本質上也是同樣的。在Gradle中,一個工程就是一個Project,這樣講可能會很抽象,若是我告訴你Project是Gradle源代碼的一個接口以及咱們能夠經過編程的方式來和Gradle的全部特性,(如依賴管理)打交道,你可能就會明白了。spring

二、咱們怎麼使用Project?

有一個很明顯的問題就是咱們必需要編程才能和Gradle打交道嗎?答案是否認的,若是你已經閱讀了上面那篇入門教程,你應該知道Gradle工程下會有一個叫build.gradle的文件,沒錯,這個文件就是Gradle工程的配置文件,並且是一對一的,一個Gradle工程有且只有一個build.gradle配置文件。編程

這和Maven同樣,每一個工程對應一個pom.xml文件api

三、Gradle是如何根據build.gradle配置文件管理咱們的工程的,即生命週期是什麼?

在構建初始化階段,Gradle根據build.gradle組裝工程的大體流程以下:bash

  • 一、建立一個Settings實例,若是Gradle工程下的settings.gradle文件存在,則該文件將被解析成一個Settings實例
  • 二、根據settings.gradle文件對工程進行配置
  • 三、使用Settings實例建立Project實例的結構
  • 四、最後,經過對項目執行build.gradle文件(若是存在)來評估每一個項目

四、build.gradle文件如何配置

你可能很想知道我該如何對一個build.gradle進行配置,首先你已經知道一個工程對應一個build.gradle文件,也就是說一個build.gradle文件就對應一個Project實例,那麼Project實例具備的屬性你均可以使用。app

build.gradle文件中採用DSL進行配置,下面是你能夠在build.gradle文件中配置的內容:eclipse

  • Taskmaven

    Task是一種任務,任務是Gradle中的基本組件,Task的概念也是收到了Ant的啓發而設計的

  • Dependencies

    依賴管理

  • Plugins

    插件,就像咱們在Maven的pom.xml文件中增長插件同樣,Gradle也能夠添加插件,常見的插件有javaeclipse,咱們可使用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

      在多項目中對全部子項目的通用配置

2、Gradle中的Properties

一、Gradle中的屬性

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實現類聲明的任何屬性settergetter方法。例如,咱們能夠通Project.getRootProject()能夠做爲rootProject屬性值。根據相應的gettersetter方法的存在,此做用域的屬性是可讀或可寫的。

  • 二、projectextra屬性

    每一個項目都維護一個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
}
複製代碼

更多屬性能夠查閱這裏

3、Gradle配置簡單的多項目工程

該工程爲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')
}
複製代碼
相關文章
相關標籤/搜索