美文网首页
在java中使用gradle

在java中使用gradle

作者: guideEmotion | 来源:发表于2019-06-29 22:41 被阅读0次

    一 搭建环境

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

    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
    

    高级特性

    • 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环境的变量的位置。我试了没变,就自己设置了
      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多模块(项目)的构建

    相关文章

      网友评论

          本文标题:在java中使用gradle

          本文链接:https://www.haomeiwen.com/subject/fmnlcctx.html