在java中使用gradle

2019-06-29  本文已影响0人  guideEmotion

一 搭建环境

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

下载

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

解压缩

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

设置环境变量

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

  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控制台

image.png

语法

和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

高级特性

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

定义集合、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环境的变量的位置。我试了没变,就自己设置了
    image.png
  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");
    }

}

执行命令


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

打包成功


image.png

测试

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变量使其隐式可用

image.png

任务

任务对应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)

    }
}

task makeWebDir(){
    dependsOn('makeJavaDir')
    def paths = ['src/main/webapp','src/test/webapp']
    doFirst {//这里相当于定义了一个匿名闭包
        paths.forEach(createDir)

    }
}

生命周期

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

image.png
image.png

钩子方法

image.png

版本冲突

image.png

解决冲突

  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命令查看

image.png

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

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

五 深入实战

项目模块化

image.png

依赖关系

image.png

配置要求

image.png

项目结构

image.png

子模块间依赖

  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")
    }
}

属性扩展

参考:https://blog.csdn.net/jhl122/article/details/74171966

参考

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

猜你喜欢

热点阅读