Gradle 快速入门

大家应该都经历过为了学习Hibernate、Spring这样的框架,需要引用大量Jar包而忙得焦头烂额的经历吧。在Java中管理Jar包确实是一件麻烦事情。而且有时候就算你电脑上一个项目配置的好好的,换一台电脑马上就不行了。因此就产生了项目构建工具这么一个玩意,它能大大简化我们构建项目所需的成本。Maven就是这么一个项目构建工具,它的配置文件是一个XML文件。这样做的优点就是配置易于理解,因为是XML嘛。但是如果项目很大很复杂,那么Maven的局限性就体现出来了:XML会变得非常非常长,不利于阅读;使用插件、执行某些任务非常困难,因为XML擅长描述静态信息,对动态的行为无能为力。因此催生了一个崭新的项目构建工具Gradle。用了一段时间Gradle的我表示再也回不去Maven了。真的各方面体验都非常好。Gradle的唯一缺点大概就是网络不甚流畅,可能需要梯子等工具。

安装Gradle

我们可以到Gradle官方网站上下载Gradle。Gradle的文档也在上面,虽然是英文的,但是我推荐大家还是有时间尽量看一看。对提高Gradle技能很有帮助。下载版本有两个,完整版(包括可执行文件、文档和源代码)以及二进制版(只有可执行文件)。我推荐下载完整版的,因为有源代码的支持,在Intellij IDEA这样的智能IDE会提供Gradle脚本补全这样的高级功能。下载完成之后将Gradle bin目录添加到环境变量中。新开一个命令提示符执行如下命令,

gradle --version

如果得到类似的输出,那么就说明安装成功了。

------------------------------------------------------------
Gradle 3.3
------------------------------------------------------------

Build time:   2017-01-03 15:31:04 UTC
Revision:     075893a3d0798c0c1f322899b41ceca82e4e134b

Groovy:       2.4.7
Ant:          Apache Ant(TM) version 1.9.6 compiled on June 29 2015
JVM:          1.8.0_112 (Oracle Corporation 25.112-b15)
OS:           Windows 10 10.0 amd64

Gradle默认情况下会使用当前系统的编码来处理文件。也就是说在我们中文Windows操作系统下,会使用GBK编码。如果我们的项目使用UTF-8编码,在使用Gradle的过程中就会出现乱码情况。解决办法可以参考我这篇文章Gradle项目中文乱码的解决办法

基本使用

新建项目

随便新建一个文件夹,打开命令提示符,切进这个文件夹。然后执行

gradle init

这样Gradle就会为我们初始化必要的文件。文件列表如图。.gradle是Gradle的临时文件夹,不用管。gradle文件夹、gradlewgradlew.bat是Gradle Wrapper用到的文件,我们现在也不用管。需要关注的就是build.gradlesettings.gradle两个文件。

Gradle新建项目结构

对于一个完整的Gradle项目来说结构应该和下图一样。除了上图初始化之后的几个文件之外,还应该有以下文件夹。

  • src/main/java,java源代码文件夹
  • src/main/resources,资源文件夹
  • src/main/webapp,网络内容文件夹(如果这是个web项目)
  • src/test/java,测试文件夹
  • src/test/resources,测试资源文件夹
Gradle完整项目结构

配置文件

settings.gradle文件是Gradle项目的配置文件,我们可以在这里配置项目的一些信息,例如项目名称等等。以下是一个简单的settings.gradle内容。

rootProject.name = 'spring-web-mvc-sample'

如果是一个多项目的Gradle项目,那么settings.gradle还会包含一些include行,指定包含了哪些项目。

include 'shared'
include 'api'
include 'services:webservice'

构建文件

下面来说说构建文件build.gradle,这是我们主要配置的地方。下面是一个典型的build.gradle文件。每个部分的作用我都注释出来了。习惯了XML文件的同学一定觉得这种文件很特别。Gradle是基于Groovy语言的,所以这里的文件其实就是Groovy形式的代码文件。如果不会Groovy语言也不要紧,使用Gradle插件就可以满足我们大部分的需求。当然如果懂Groovy语言,那么就可以编写复杂的自定义任务了。

// 项目配置
group 'yitian.learn'
version '1.0-SNAPSHOT'
// 插件配置
apply plugin: 'java'
apply plugin: 'war'
apply from: 'https://raw.github.com/akhikhl/gretty/master/pluginScripts/gretty.plugin'

// 源代码兼容性
sourceCompatibility = 1.8

// 仓库配置
repositories {
    jcenter()
}
// 额外的变量配置
ext {
    springVersion = '4.3.6.RELEASE'
    thymeleafVersion = '3.0.0.RELEASE'
}

//依赖配置
dependencies {
    testCompile group: 'junit', name: 'junit', version: '4.12'
    compile group: 'org.springframework', name: 'spring-webmvc', version: springVersion

}

下面来根据注释分别说说。首先是项目配置,配置该项目的组名(一般是公司或组织名)和版本号,和Maven中的组名、项目名和版本号一一对应(Gradle项目的项目名在settings.gradle中)。源代码兼容性指的是项目中源代码的版本。对于我来说肯定永远是最新版的Java了。剩下几个有点复杂,在后面慢慢讨论。

配置项目

执行任务

首先我们执行一下命令gradle tasks。会发现列出了Gradle当前所有可用的任务,而且我们会发现有个任务就是tasks在Gradle中,任务是最基本的执行单元。而且我们这些Gradle命令行其实就是执行一些Gradle命令。每个任务还应该有一个组名,表明任务的类别,没有组名的任务Gradle默认会将其隐藏。我们使用gradle tasks列出任务的时候Gradle也会将其以组名分类。要执行某个任务,语法如下:gradle 任务名

如果有使用过Maven的同学,可以感受到Gradle执行任务比Maven执行命令方便多了。如果项目还是刚刚那个刚新建好什么都没改的构建文件。那么查看任务的时候应该只能看到初始化和帮助任务。Gradle其他的功能需要插件来提供。

插件

上面那个配置文件给出了插件的配置方法。第一种是使用Gradle提供的一些插件,第二种是引用网络上的插件。配置了插件之后,我们再次查看任务,就会发现多出来很多任务,这就是插件带给我们的功能。

如果我们这是个Java项目,那就添加java插件,如果这是一个Java Web项目,那么还需要添加war插件。如果想要运行该web项目,可以使用Gradle提供的jetty插件。但是这个插件在Gradle3.3中已经过时了,Gradle推荐我们使用功能更加强大的Gretty插件。针对其他语言和平台,Gradle也提供了相应的插件例如android,这些插件的情况参见其相应的文档。

apply plugin: 'java'
apply plugin: 'war'
apply from: 'https://raw.github.com/akhikhl/gretty/master/pluginScripts/gretty.plugin'

java和war插件给我们提供了很多新的任务,方便我们开发。列举一些常用的如下:

任务名 作用
build 打包和测试项目
test 测试项目
assemble 打包项目
war 打包成war文件
jar 打包成jar文件
clean 清理项目
javadoc 生成javadoc

Gretty插件最常用的就是tomcatRun任务了。它会启动一个tomcat实例来运行我们的应用,而且具有自动更新类、资源,必要时重启服务器的功能,非常方便和强大。Gretty插件的详细配置参见其Github

仓库配置

Gradle默认提供了两个公共仓库,mavenCentral和jcenter。我们可以随意使用。当然也可以同时引用多个。这种情况下Gradle会依次按照顺序来搜索软件包,如果都没找到则构建失败。当然我们也可以使用其他镜像仓库。下面的例子使用了阿里的镜像仓库,如果镜像仓库没找到需要的软件就会继续在jcenter中寻找。

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

依赖配置

Gradle的依赖配置和Maven兼容。所以Gradle的依赖项也由三个部分,组名,项目名和版本组成。所以一个依赖项可以写成这样。

compile group: 'org.hibernate', name: 'hibernate-core', version: '3.6.7.Final'

依赖项还可以按照group:name:version形式简写,所以上面的依赖项可以缩成这样。

compile 'org.hibernate:hibernate-core:3.6.7.Final'

和Maven一样,Gradle依赖项也支持作用域,这在依赖项前面的动词上体现出来。常见的几个作用域如下。

名称 作用
compile 在项目编译时需要
runtime 在运行时需要,默认情况下也包括编译时依赖
testCompile 在测试代码编译时需要
testRuntime 在测试代码运行时需要,默认情况下也包括编译时依赖、运行时依赖和测试编译时依赖

查找依赖项的时候推荐到mvnrepository.com上查找,这个网站同时提供了Maven和Gradle等多种形式的依赖项,非常方便。

定义变量

有时候可能需要在某处定义一个变量,然后在其余多处地方使用这个变量。在Gradle中需要在ext块中定义变量,然后就可以在其他地方使用了。

// 额外的变量配置
ext {
    springVersion = '4.3.6.RELEASE'
}

//依赖配置
dependencies {
    testCompile group: 'junit', name: 'junit', version: '4.12'
    compile group: 'org.springframework', name: 'spring-webmvc', version: springVersion

}

进阶使用

Gradle Wrapper

现在可以说一说gradle/wrapper文件夹、gradlewgradlew.bat了。这几个文件是Gradle Wrapper的文件。Gradle Wrapper能够让没有安装Gradle的电脑运行Gradle项目。原理很简单,通过一个脚本文件实现,如果当前没有安装某个版本的Gradle,脚本会自动下载解压。完成之后,当我们通过gradlew命令运行Gradle的时候,脚本会将命令参数传递给实际的gradle命令。Gradle Wrapper的使用方法和Gradle一样,只不过把gradle换成了gradlew

gradle/wrapper文件夹对Gradle Wrapper来说很重要,该文件夹下的两个文件gradle-wrapper.jargradle-wrapper.properties缺一不可,假如要上传到源代码管理这两个文件也同样需要上传。在gradle-wrapper.properties中我们可以配置Gradle Wrapper的一些属性。重点是最后一行,为了使用最新和最完整的Gradle功能,我们一般要修改它为gradle-3.3-all.zip(3.3是当前最新的Gradle版本号)。

distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-3.3-all.zip

IDE集成

如果使用Eclipse或者STS这样基于Eclipse的IDE,点击帮助->软件市场,搜索BuildShip插件,安装然后重启Eclipse,然后就可以在新建项目的时候看到Gradle了。

如果使用Intellij IDEA,由于它自带了Gradle支持。所以直接可以在新建项目的时候选择Gradle项目,然后根据提示操作。对于Gradle项目来说推荐的IDE还是Intellij IDEA,因为对Gradle的支持最好,支持更改依赖项自动配置、列出所有任务、查看依赖情况(点开Source Sets就可以查看每个依赖项有分别依赖了什么)等等。

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

推荐阅读更多精彩内容