gradle简明教程

gradle简明教程

前言

本文没有 gradle 与 maven 对比,也没有深入 gradle 实现。只有 gradle 从 0 开始使用的说明。

  • 简介
  • 安装
  • 新建一个 gradle 项目
  • 引入一个 gradle 项目
  • 常见问题
  • 交流

简介

gradle 是一个构建工具。负责管理项目依赖,组织项目结构,完成项目构建的工作。

安装

从 官网 下载,解压即可,并将 bin/gradle 命令加入到 path 中。

新建一个 gradle 项目

  1. 新建一个文件夹作为项目文件夹

    mkdir project-example
    cd project-example
    
  2. 使用 gradle 初始化

    gradle init
    

    然后目录下会生成这些文件

    build.gradle       // 构建脚本文件,主要的构建配置都在这里写
    gradle               // 存放gradle wrapper 执行配置和工具的文件夹,
    gradlew             // gradle wrapper 执行脚本文件,用来在没有安装 gradle 的情况下执行 gradle 命令。当然,第一次执行时会下载 gradle。
    gradlew.bat       // gradle wrapper 执行脚本文件的 windows 版
    settings.gradle  // 项目配置,指明根项目名字和引入的 module
    
  3. 修改 build.gradle 文件,结果像下面这样

    /*
    声明插件,声明插件的方式有两种,下面这种是 2.* 版本之后的新的定义方式。可以声明两种插件:
    1. 官方内置插件,如 java,idea。
    2. 在 gradle 插件中心注册过的插件,如第三个就是,这种要还要声明版本。
    声明插件的目的是因为插件会提供很多 task,而每一个 task 就是一段构建脚本,可以执行不同的任务。比如 compileJava,test 等。
    */
    plugins {
        id 'java'
        id 'idea'
        id "com.yangxiaochen.scaffold" version "1.0.2"
    }
    
    /*
    声明 group 和 版本,而 project 的名字在 settings.gradle 文件中,而子 module ,或者又称为 sub projects 的名字通常和文件夹名字一样。
    */
    group 'com.yangxiaochen.gradle'
    version '1.0.0-SNAPSHOT'
    
    /*
    声明依赖仓库,这里使用的是 jcenter,也可以使用其他的如 mavenCentral 等。也可以声明多个,会按顺序查找。
    */
    repositories {
        jcenter()
    }
    
    /*
    声明依赖
    */
    dependencies {
        compile 'org.slf4j:slf4j-api:1.7.21'
        testCompile 'junit:junit:4.12'
    }
    

    编辑 settings.gradle 文件如下,声明了project name

    rootProject.name = 'project-example'
    // include 'sub-project'
    
  4. 引入到 Idea IDE 中

    gradle idea
    

    目录下新生成了三个文件

    project-example.iml
    project-example.ipr
    project-example.iws
    

    接下来只要用 Idea IDE 来 open project-example.ipr 文件,就可以引入 project 了, 之后每当

    1. 依赖更改

    2. 目录结构更改

    只要执行 gradle cleanIdea idea 就可以刷新这三个文件,Idea IDE 就会重新加载识别项目了。

    我的经验是不要使用 Idea IDE 来直接用 build.gradle 来打开文件,因为 Idea IDE 在解析 build.gradle 文件时有其他操作,而且 Idea IDE 与 gradle 版本有时会不太兼容,导致项目解析错误;而使用 gradle 来生成 Idea IDE 工程文件的方式就不会有问题,而且速度更快,更容易debug。

  5. 引入之后,还需要生成 src 文件夹和 sub project

    gradle createSrc
    gradle idea
    
    // 或者直接连起来些,像这样
    gradle createSrc idea
    gradle createModule --name foo idea
    

    createSrccreateModule都是插件 com.yangxiaochen.scaffold里的 task,而 ideacleanIdea 是插件 idea提供的 task

引入一个 gradle 项目

跟上一节创建一个 gradle 项目类似,引入idea插件,然后生成 Idea IDE 的工程文件,再 open 即可

常见问题

插件选择

内置插件都在官方文档中有说明,除了内置插件外, 可以 Search Gradle plugins,gradle 插件的官方仓库。

build速度慢

速度慢一般来说是依赖更新慢,因为众所周知的原因,国内使用国外的仓库速度并不乐观,所以可以替换repositories, 使用阿里云的仓库

repositories {
  maven {
    url "http://maven.aliyun.com/nexus/content/groups/public"
  }
}

再者, 有的同学使用私服, 可能是公司搭建的. 这个有时候会有不稳定, 且有时需要认证的情况. 看稍后的章节.

如何debug

gradle 运行中的提示并不算很友好, 尤其在链接仓库和下载jar包时, 在连接有问题的时候, 经常没有提示(新版本的可能好一些.)

经常使用

gradle idea -i
gradle idea -id

还可以加入 --no-daemon 参数来避免daemon启动产生的日志干扰
gradle idea -id --no-daemon
一般来说就能定位到构建问题.

来获取更多的信息. 比较常见的卡住是因为仓库链接不上, jar包下载链接不上, 又不返回 response (私有仓库偶尔有问题), 资源下载缓慢, 仓库需要认证登陆

  • 仓库连接不上: 检查仓库地址, 检查网络.
  • 资源无法连接又没有response: 这种通常会在上面打出的日志中体现, 请求一个 url 便没有响应.
  • 下载缓慢: 更换仓库, 或者忍耐下第一次, 以后会好很多

在 IDEA 刷新有问题时, 可以执行这个命令debug, 一般这个命令能成功, 那么 IDEA 刷新通常也能成功. (请注意版本问题, 命令行里执行的 gradle 版本需要跟 IDEA 里配置的 gradle 版本一致)

私服使用和包管理混乱引起的问题

私服使用中会有以下问题:

  1. 不稳定, 偶尔服务无响应.

  2. 配置出错, 无法 proxy maven 主仓库. 或者出现私服中存在第三方包但是却不完整到时无法下载.

    一般来说会尝试把第三方仓库配置到私服之前:

    maven {
      url "http://maven.aliyun.com/nexus/content/groups/public"
    }
    
    maven {
      url "http://你家私服地址/"
      credentials {
        username "xxx"
        password "xxx"
      }
      authentication {
         basic(BasicAuthentication)
      }
    }
    

    这样先去第三方查找, 再到私服查找.

  3. 私服有认证. 可以参照第二条私服的认证方式. 其中

      authentication {
         basic(BasicAuthentication)
      }
    

    是可选填的, 不填的话会自动识别认证方式.

  4. 打包方式不完整. 有的同学上传包的时候虽然包含了编译后的jar包, pom文件, 但是有时却没有把source包上传, gradle 默认是会下载source的, 如果没有, 私服返回404还好, 最怕会卡主(遇到过私服虽然没有这个文件却迟迟不返回response的情况.), 所以, 如果遇到这种问题, 可以:

    idea {
     module {
         downloadJavadoc = false
         downloadSources = false
     }
    }
    

    不让 IDEA 刷新的时候下载源码和文档, 万不得已还是不要用.

常用命令或参数

--refresh-dependencies 刷新依赖,刷新那些SNAPSHOT的依赖,类似于 maven 的 -U 参数

gradle tasks 列出所有可执行的task

gradle tasks --all 列出所有可执行的task, 并附加上 mudole

gradle help --task taskName 查看一个task的帮助, 不过并不是所有task都有, 因为task都是可以自己来实现的.

gradle idea -id 用来debug IDEA进行刷新时遇到的问题, 一般这个任务能成功, 刷新就能成功. 注意使用的 gradle 版本要一致.

--no-daemon 不是使用daemon进行构建. daemon的作用是不用每次 build 都再启动一个进程, 节省时间. 但却会在我们 debug 问题的时候不停的生产日志, 产生干扰.

依赖冲突处理

可以通过命令来查看一个项目的依赖

gradle webapp:dependencies --configuration=compile

不同于maven的最近原则,gradle 依赖使用的是最新原则.

依赖排除, 通常可以使用

compile("org.springframework.boot:spring-boot-starter-web") {
    exclude module: "spring-boot-starter-logging"
}

这样的语法, 还有更为粗暴直接的:

configurations {
    all*.exclude group: 'ch.qos.logback', module: 'logback-classic'
    all*.exclude group: 'ch.qos.logback', module: 'logback-core'
}

参考资料

官方文档相当的详细,且附有很多example,配合 gradle 安装包里的 example 源文件阅读

交流

欢迎加入群 661035226,gradle,spring,activiti 交流

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,585评论 18 139
  • Spring Boot 参考指南 介绍 转载自:https://www.gitbook.com/book/qbgb...
    毛宇鹏阅读 46,724评论 6 342
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,398评论 25 707
  • 这个学期笑宝爷爷奶奶送上学的次数多很多,难得今天麻麻送,昨儿晚上就跟笑宝把今日早上安排妥当。结果我提早睡,一觉醒来...
    藤花旧馆阅读 285评论 0 1
  • 性是什么?在我看来,性既是生命的传承,又是生命的大和谐。 在中国,谈性色变是一件很普遍的现象,无论是在工作单位、学...
    埃姆先生阅读 3,112评论 7 6