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')
}
复制代码
相关文章
相关标签/搜索