大家应该都经历过为了学习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
文件夹、gradlew
和gradlew.bat
是Gradle Wrapper用到的文件,我们现在也不用管。需要关注的就是build.gradle
和settings.gradle
两个文件。
对于一个完整的Gradle项目来说结构应该和下图一样。除了上图初始化之后的几个文件之外,还应该有以下文件夹。
-
src/main/java
,java源代码文件夹 -
src/main/resources
,资源文件夹 -
src/main/webapp
,网络内容文件夹(如果这是个web项目) -
src/test/java
,测试文件夹 -
src/test/resources
,测试资源文件夹
配置文件
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
文件夹、gradlew
和gradlew.bat
了。这几个文件是Gradle Wrapper的文件。Gradle Wrapper能够让没有安装Gradle的电脑运行Gradle项目。原理很简单,通过一个脚本文件实现,如果当前没有安装某个版本的Gradle,脚本会自动下载解压。完成之后,当我们通过gradlew
命令运行Gradle的时候,脚本会将命令参数传递给实际的gradle
命令。Gradle Wrapper的使用方法和Gradle一样,只不过把gradle
换成了gradlew
。
gradle/wrapper
文件夹对Gradle Wrapper来说很重要,该文件夹下的两个文件gradle-wrapper.jar
和gradle-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就可以查看每个依赖项有分别依赖了什么)等等。