目录

  • 一 搭建环境
  • 下载
  • 解压缩
  • 设置环境变量
  • 构建工具
  • 二 groovy实践
  • 创建项目
  • gradle目录结构
  • 打开groovy控制台
  • 语法
  • 和java比较
  • 高级特性
  • 定义集合、map
  • 闭包
  • 三 gradle实践
  • 基本配置
  • 使用本地maven仓库
  • 打jar包
  • 编写类
  • 执行命令
  • 测试
  • 四 高级应用
  • 构建块
  • 项目
  • 任务
  • 添加自定义任务
  • 生命周期
  • 钩子方法
  • 版本冲突
  • 五 深入实战
  • 项目模块化
  • 项目结构
  • 公共配置
  • 属性扩展
  • 六 idea中简单使用gradlew
  • 创建gradlew
  • 使用gradlew
  • 七 配置文件中的用法
  • 参考


一 搭建环境

Gradle 需要运行在一个 Java 环境里

  • 安装一个 Java JDK 或者 JRE. 而且 Java 版本必须至少是 6 以上.
  • Gradle 自带 Groovy 库, 所以没必要安装 Groovy. 任何已经安装的 Groovy 会被 Gradle 忽略.

下载

你可以从 Gradle网站 下载任意一个已经发布的版本。我是下载了一个complete版本。

解压缩

Gradle 发布的版本为ZIP 格式. 所有文件包含:

  • Gradle 的二进制文件.
  • 用户指南 (HTML 和 PDF).
  • DSL参考指南.
  • API文档 (Javadoc和 Groovydoc).
  • 扩展的例子,包括用户指南中引用的实例,以及一些更复杂的实例来帮助用户构建自己的build.
  • 二进制源码.此代码仅供参考.

设置环境变量

然后我们需要设置环境变量

  1. 添加一个 GRADLE_HOME环境变量来指明 Gradle 的安装路径
  2. 添加 %GRADLE_HOME%\bin 到您的 PATH 环境变量中. 通常, 这样已经足够运行Gradle了.
  3. 检查是否成功,gradle -v

构建工具

  1. 依赖管理
  2. 测试、打包、发布
  3. 机器能干的活,绝不自己动手

二 groovy实践

创建项目

在idea中创建一个gradle项目
注意点

  1. 设置里面勾选使用本地的gradle
  2. 开启auto-import

gradle目录结构

和maven的目录结构是一样的

src/main/java application library sources - java源代码文件
src/main/resources application library resources - 资源库,会自动复制到classes文件夹下
src/main/filters resources filter files - 资源过滤文件
src/main/assembly assembly descriptor - 组件的描述配置,如何打包
src/main/config configuration files - 配置文件
src/main/webapp web application sources - web应用的目录,WEB-INF,js,css等
src/main/bin 脚本库
src/test/java 单元测试java源代码文件
src/test/resources 测试需要的资源库
src/test/filters 测试资源过滤库
src/site 一些文档
target/ 存放项目构建后的文件和目录,jar包,war包,编译的class文件等;Maven构建时生成的
pom.xml 工程描述文件
LICENSE.txt license
README.txt read me

打开groovy控制台

gradle调用java代码 gradle java_java

语法

和java比较

  1. 完全兼容java的语法
  2. 分号是可选的
println("zyc");
//groovy可以省略最末尾的分号
//groovy可以省略括号
println"zyc"
  1. 类、方法默认都是public
  2. 编译器给属性自动添加getter/setter方法
  3. 属性可以直接用点号获取
  4. 最后一个表达式的值会作为返回值
  5. ==等同于equals,不会抛NullPointexception

示例

class Person{
    int age;
    String name//分号省略

    public Person(String name,int age){
        this.name = name;
        this.age = age;
    }
}
//兼容java

Person me = new Person('zyc',18);

Person you = null

println me == you
println me.getAge()
println me.name

高级特性

  • asset语句
def age =12
assert  age = 14
  • 可选类型定义(弱类型语言)
  • 可选的括号
  • 字符串,三种表现形式:单引号、双引号、三个单引号
//字符串
def nationality = 'chiness'

def s1 = 'china'//只是字符串
def s2 = "i am ${nationality}"//可以有变量
def s3 ='''my name
is
lihua
'''//可以换行

println s1
println s2
  • 集合API
  • 闭包

定义集合、map

//通过def来定义,groovy是弱类型的
def i =18
println i

//定义一个集合
def array = ['a','b']

//添加元素
array << 'zyc'

//取出元素
println array.get(2)


//定义map
def map = ['name':'zyc','age':23]

//添加键值对
map.address = 'anji'
map.age = 22


//取出元素
println map.get('age')
println map['age']
println map.get("address")//单双引号都可以

闭包

//什么是闭包?
//闭包就是一段代码块,我们把这段代码当参数来使用

//定义一个闭包
def say = {
    println 'hello zhuyc'
}


//再定义个函数
def method1(Closure closure){
    closure()
}

//执行
method1(say)

//定义一个闭包,带有参数
def eat = {
    v ->
        println "eat ${v}"
}


//再定义个函数
def method2(Closure closure){
    closure("kfc")
}

//执行
method2(eat)

三 gradle实践

基本配置

//构建脚本中默认都有个Project实例
plugins {
    id 'java'
}
//apply plugin:'java'  //本质是一个方法,省略了括号

group 'com.zyc'
version '1.0-SNAPSHOT'

sourceCompatibility = 1.8

/**
 * 指定使用的仓库
 */
repositories {//本质是一个方法,接收了闭包
    mavenCentral()//表示中央仓库
}

/*
*testCompile:表示jar包的作用域是测试时期。
* 我们再添加jar包坐标时,必须添加作用域
*
*/
dependencies { //本质:dependencies(Closure var1)
    testCompile group: 'junit', name: 'junit', version: '4.12'
}

使用本地maven仓库

  1. 配置环境变量GRADLE_USER_HOME,值为maven仓库
  2. 检查service directory path是否变成了我们设置的GRADLE_USER_HOME环境的变量的位置。我试了没变,就自己设置了
  3. 配置仓库mavenLocal()
repositories {
    mavenLocal()
    mavenCentral()//表示中央仓库
}

打jar包

编写类

编写一个带有main方法的类

package com.zyc.todo;

/**
 * @author zhuyc
 * @create 2019-06-29 15:11
 */
public class Todo {

    public static void main(String[] args) {
        System.out.println("todo jar running");
    }

}

执行命令

gradle调用java代码 gradle java_Gradle_02


其实此时点击build的效果和点击jar一样。因为build.gradle中指定了项目的打包类型是jar


打包成功

gradle调用java代码 gradle java_jar包_03

测试

E:\workspace\idea\grovvy\build\libs>java -classpath grovvy-1.0-SNAPSHOT.jar com.zyc.todo.Todo
>todo jar running

四 高级应用

构建块

Gradle构建中的两个基本概念是项目(project)和任务(task),每个构建至少需要一个项目,项目中包含一个或多个任务。在多项目构建中,一个项目可以依赖于其他项目;类似的,任务可以形成一个依赖关系图来确保它们的执行顺序

项目

一个项目代表一个正在构建的组件(比如一个jar文件),当构建启动后,gradle会基于build.gradle实例化一个org.gradle.api.Project类,并且能够通过project变量使其隐式可用

gradle调用java代码 gradle java_Gradle_04

任务

任务对应org.gradle.api.Task。主要包括任务动作和任务依赖。任务动作定义了一个最小的工作单元。可以定义依赖于其他任务、动作序列和执行条件。

添加自定义任务

//先定义一个闭包
def createDir = {
    path ->
        File dir = new File(path)
        if(!dir.exists()){
            dir.mkdirs()
        }

}

task makeJavaDir(){
    def paths = ['src/main/java','src/main/resources','src/test/java','src/test/resources']
    doFirst {
        paths.forEach(createDir)

    }
}

//这里就是gradle(1)文章中的用法
task makeWebDir(){
    dependsOn('makeJavaDir')
    def paths = ['src/main/webapp','src/test/webapp']
    doFirst {
        paths.forEach(createDir)

    }
}

生命周期

分为配置代码和执行代码(通过doLast,doFirst添加的),

gradle调用java代码 gradle java_jar包_05


gradle调用java代码 gradle java_gradle调用java代码_06

钩子方法

gradle调用java代码 gradle java_Gradle_07

版本冲突

gradle调用java代码 gradle java_java_08

解决冲突

  1. 查看依赖报告
  2. 排除传递性依赖
compile (group: 'org.hibernate', name: 'hibernate-core', version: '3.6.3.Final'){
        exclude group: 'org.slf4j', module: 'slf4j-api'
    }
  1. 强制一个版本
configurations.all{
    resolutionStrategy{
        // 修改gradle不处理版本冲突
        failOnVersionConflict()
        force 'org.slf4j:slf4j-api:1.7.24'
    }
}

注意
Transitive用于自动处理子依赖项。默认为true,gradle自动添加子依赖项,形成一个多层树形结构;设置为false,则需要手动添加每个依赖项,不推荐transitive=false

compile('org.hibernate:hibernate-core:3.6.3.Final'){
  transitive=false
}

gradle默认的解决方式是依赖最高版本的jar包 这点可以通过gradle的help-dependencies命令查看

gradle调用java代码 gradle java_gradle调用java代码_09

修改默认冲突解决策略,便于发现冲突

configurations.all{
    resolutionStrategy{
        // 修改gradle不处理版本冲突
        failOnVersionConflict()
    }
}

五 深入实战

项目模块化

gradle调用java代码 gradle java_gradle调用java代码_10

依赖关系

gradle调用java代码 gradle java_jar包_11

配置要求

gradle调用java代码 gradle java_java_12

项目结构

gradle调用java代码 gradle java_jar包_13

子模块间依赖

compile project(":dao")//依赖具有传递性

公共配置

// 所有模块/项目的通用配置
allprojects {
    apply plugin: 'java'//必须放最上面
    sourceCompatibility = 1.8
    group 'com.zyc'
    version '1.0-SNAPSHOT'
    
}

// 子模块/项目的统一配置
subprojects {
    dependencies {
        compile("javax.servlet:javax.servlet-api:4.0.1")
    }
}

属性扩展

参考:

六 idea中简单使用gradlew

前面说了好多次gradlew了,总结下就是:我们在开发某个项目时,生成gradlew(这里面包含了当前项目依赖的gradle版本),之后项目拿到其他机器上时。直接使用gradlew(本质也是调用了gradle,只是多了一层处理,保证了gradle的版本)来构建项目。

创建gradlew

  1. 在build.gradle中指定版本
task createWrapper(type: Wrapper) {
    gradleVersion = '3.3'
}
  1. 运行任务
gradle createWrapper
  1. 查看是否创建成功

使用gradlew

之后用到gradle的地方换成gradlew即可,如

gradlew build
七 配置文件中的用法

参考
  1. http://wiki.jikexueyuan.com/project/GradleUserGuide-Wiki/installing_gradle/prerequisites.html
  2. https://www.imooc.com/video/14787
  3. IDEA下Gradle多模块(项目)的构建