目录
1. 项目构建工具
1.1.ant
2000年推出,基于ivy, tomcat使用ant构建项目
1.2.maven
2004年推出,基于repository
1.3. gradle
2012年发布,ant和maven都是基于xml文件的,gradle不再依赖于xml,更加的灵活,基于groovy语言。兼容ivy或maven仓库
2. 安装配置
2.1 官网下载安装包:https://gradle.org/
2.2 解压
2.3 配置环境变量
2.4 cmd中执行gradle -v看是否安装配置成功
3. 构建脚本
gradle用于构建项目或者任务,一个项目由不同的任务组成,一个任务只是构建项目中的一块内容,任务可能是编译一些类,创建一个jar...
3.1 练习
task firstgvy {
doLast {
println "this is the first gradle"; //this is the first gradle
}
}
(1) 文件命名为build.gradle
(2)task是关键字
(3)在当前目录下执行:gradle -q firstgvy,就可以执行doLast中编写的方法,没有指定文件时,gradle默认会找当前目录下的build.gradle文件,然后执行对应名称的task
task uppergvy {
doLast {
String name = "zhangsan";
println name; //zhangsan
println name.toUpperCase(); //ZHANGSAN
}
}
task printgvy { //0 1 2 3
doLast {
4.times {
print "$it "
}
println ""
}
}
3.2 build过程
gradle构建过程包含三个阶段:initialization, configuration, execution。
(1)initialization:gradle支持单个或者多个工程的构建。在initialization阶段,gradle决定哪些工程将参与到当前的构建过程,并为每一个这样的工程创建一个Product实例。一般情况下,参与构建的工程信息将在settings.gradle中定义。
(2)configuration:在这一阶段,配置Project的实例,所有工程的构建脚本将在这里被执行。Task,configuration和许多其他的对象将创建的配置。
(3)execution:在之前的configuration阶段,task的一个子集被创建并配置。这些子集来自于作为 参数传入gradle命令的task名字,在execution阶段,这一子集将被依次执行。
task secondgvy {
doLast {
println "this is the second gradle";
}
}
task firstgvy {
println "this is the first gradle";
}
1. 执行gradle -q firstgvy,打印this is the first gradle
2. 执行gradle -q secondgvy,打印如下:
this is the first gradle
this is the second gradle
(1)doLast内的task在第三阶段exection执行,该部分脚本只有在执行task名称的情况下才会执行
(2)doLast外的task在第二阶段configuration执行,该部分的脚本,以及没有放在task内的脚本,可以在不指定task的情况下执行
4. gradle任务
4.1 任务依赖
4.1.1. 在声明时指定依赖关系
task parentgvy {
doLast {
println "hello parent";
}
}
task dependentgvy (dependsOn:parentgvy){
doLast {
println "i am dependent";
}
}
执行gradle -q dependentgvy,显示如下:
hello parent
i am dependent
4.1.2. 在声明时不指定,声明完之后单独声明依赖关系
task parentgvy {
doLast {
println "hello parent";
}
}
task dependentgvy {
doLast {
println "i am dependent";
}
}
dependentgvy.dependsOn parentgvy
4.1.3. 闭包实现依赖
task taskX {
doLast {
println 'taskX';
}
}
taskX.dependsOn {
tasks.findAll {
task -> task.name.contains('lib');
}
}
task lib1 {
doLast {
println 'lib1';
}
}
task lib2 {
doLast {
println 'lib2';
}
}
task notALib {
doLast {
println "notALib";
}
}
执行: gradle -q taskX,打印如下:
lib1
lib2
taskX
任务依赖不能出现循环依赖!
4.2 定位任务
每个任务都可以作为项目的属性,使用任务名称作为属性名称。也可以使用tasks集合来使用对应的属性
task test
println test.name
println project.test.name
println tasks['test'].name
4.3 任务描述
task copy(type : Copy) {
description "copy resource to target"
from "resource"
into "target"
include("**.*.txt", "**/*.xml")
println "description applied"
}
只会执行最后一句打印脚本,其他内容只是方便阅读使用。
4.4 任务跳过
task compile {
doLast {
println "do compile"
}
}
compile.doFirst {
if(true) throw new StopExecutionException()
}
task myTask(dependsOn : compile){
doLast {
println "myTask"
}
}
执行后只打印了myTask
5. 依赖管理
6. 插件
6.1 插件类型
脚本插件和二进制插件
脚本插件是一个额外的构建脚本,它提供了一种声明性方法来操作构建,通常在构建中使用;
二进制插件是实现插件接口并采用编程方法来操作构建,可以驻留在插件jar中的一个构建脚本和项目层次结构或者外部。
6.2 插件使用
Project.apply()方法用于特定的插件,可以多次使用相同插件
6.3 脚本插件
脚本插件可以从本地文件系统进行使用,文件系统位置相对于项目目录,而远程脚本位置指定HTTP URL
1. 构建other.gradle插件
ext {
verson = '1.0'
url = 'http://maven.cn'
}
2. 在build.gradle脚本中使用other.gradle插件
apply from: 'other.gradle'
task test {
doLast {
println "version: $verson"
println "url: $url"
}
}
3. 执行脚本:gradle -q test
version: 1.0
url: http://maven.cn
6.4 ***二进制插件(对象插件)
每个插件由插件标识,一些核心插件是使用短名称来应用它,一些社区插件是使用插件ID的完全限定名称,有时它允许指定一个插件类,二进制插件就是 实现了org.gradle.api.Plugin接口的插件,它们可以 用PluginId。
通常分成两类:内部插件和第三方插件
6.4.1 内部插件
gradle内部 自己实现的插件。
有以下方式使用插件:
(1)使用短名称
apply plugin:JavaPlugin
(2)使用plugin dsl
plugins {
id 'java'
}
如果是社区插件,还需要指定版本号
plugins {
id "com.test.bintary" version "1.0.0"
}
6.4.2 第三方插件
第三方的对象插件通常是jar包,要想让构建脚本知道第三方插件的存在,需要 使用buildscript来设置。
buildscript {
repositories {
maven {
url "https://plugins.gradle.org/m2/"
}
}
dependencies {
classpath "com.jfrog.bintray.gradle-bintray-plugin:1.8.4"
}
}
apply plugin: "com.jfrog.bintary"
6.5 编写自定义插件
apply plugin: HelloPlugin
class HelloPlugin implements Plugin<Project> {
void apply(Project project){
project.task('hello') {
doLast {
println "hello from the HelloPlugin."
}
}
}
}
执行命令:gradle -q hello
打印:hello from the HelloPlugin.
6.6 自定义插件扩展
class HelloPlugin implements Plugin<Project> {
void apply(Project project){
project.extensions.create("greeting", HelloPluginExtension)
project.task('hello') {
doLast {
println project.greeting.message
}
}
}
}
class HelloPluginExtension{
String message
}
apply plugin: HelloPlugin
greeting.message=" hello"
6.7 标准gradle插件