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')
}
复制代码