Gradle和Maven都是非常经典好用的项目构建工具。但是如果你经常使用Maven,可能会发现Maven有一些地方用的让人不太舒服:
- Maven的配置文件是XML格式的,假如你的项目依赖的包比较多,那么XML文件就会变得非常非常长;
- XML文件不太灵活,假如你需要在构建过程中添加一些自定义逻辑,搞起来非常麻烦;
- Maven非常的稳定,但是相对的就是对新版java支持不足,哪怕就是为了编译java11,也需要更新内置的Maven插件。
如果你对Maven
的这些缺点也有所感触,准备尝试其他的构建工具,那么你可以试试gradle
,这是一个全新的java构建工具,解决了Maven的一些痛点。
#安装Gradle
传统的安装方法就是去gradle
官网下载二进制包,解压,然后将路径添加到环境变量中。下载地址https://gradle.org/next-steps/?version=6.5.1&format=bin
安装流程
下载安装包
配置GRADLE_HOME目录
配置path环境变量,保证在任何目录都能执行gradle
名令
检查是否配置成功gradle -v
之前就听说过gradle,然后尝试使用它,结果因为速度太慢,最后放弃了。不过现在使用gradle的话会方便很多。gradle官方在中国开设了,CDN,使用gradle wrapper的时候下载速度非常快。可以说现在是一个学习使用gradle的好时候。
因为gradle
是一个非常迭代更新比较快的项目,每隔几个月就会发布一个新版本,这种方式可能跟不上gradle的更新速度。gradle
提供了一个名为gradle wrapper
的工具,可以在没有安装gradle的情况下使用gradle。其实它就是个脚本文件,当你运行wrapper
脚本的时候,如果脚本发现你电脑里没有gradle
,就会自动替你下载安装一个。现在甚至还出现了Maven wrapper
,也是个脚本文件,可以自动安装Maven。
#使用gradle wrapper安装
IDEA
默认就会使用gradle wrapper
来创建项目,所以无需安装gradle
也可以正常运行。这里我使用的IDEA
来创建和使用gradle
项目。我们直接使用初始化创建一个SpringBoot
项目
这时候项目结构应该类似下图所示,使用Maven
的我们应该比较熟悉,因为这和Maven
的项目结构几乎完全一致。gradle
文件夹和gradlew
那几个文件就是gradle wrapper
的文件,而.gradle
后缀名的文件正是gradle
的配置文件,对应于Maven
的pom.xml
。
gradle wrapper
的优点之一就是可以自定义下载的gradle
的版本,如果是团队协作的话,这个功能就非常方便,简单设置即可统一团队的构建工具版本。这里我就设定成目前最新的gradle 6.4.1
.默认下载安装的是bin版,仅包含二进制。如果你使用IDEA的话,它会推荐下载all版,包含源代码,这样IDEA就可以分析源代码,提供更加精确的gradle
脚本支持。
#依赖管理
gradle
的依赖管理功能也算是我们使用构建工具的主要目的之一了。这点也是gradle
相较maven
的优势之一了。相较于maven
一大串的XML配置,gradle
的依赖项仅需一行。
1 | // 定义依赖:声明项目中需要哪些依赖 |
这里推荐一下Jetbrains
的Package Search | JetBrains网站,是寻找maven
和gradle
依赖包的最佳网站,可以非常轻松的搜索和使用依赖项。以搜索junit为例,选择类型复制
gradle
依赖的粒度控制相较于Maven
也更加精细,maven
只有compile
、provided
、test
、runtime
四种scope,而gradle有以下几种scope:
implementation
,默认的scope。implementation的作用域会让依赖在编译和运行时均包含在内,但是不会暴露在类库使用者的编译时。举例,如果我们的类库包含了gson,那么其他人使用我们的类库时,编译时不会出现gson的依赖。api
,和implementation类似,都是编译和运行时都可见的依赖。但是api允许我们将自己类库的依赖暴露给我们类库的使用者。compileOnly
和runtimeOnly
,这两种顾名思义,一种只在编译时可见,一种只在运行时可见。而runtimeOnly和Maven的provided比较接近。testImplementation
,这种依赖在测试编译时和运行时可见,类似于Maven的test作用域。testCompileOnly
和testRuntimeOnly
,这两种类似于compileOnly和runtimeOnly,但是作用于测试编译时和运行时。
通过简短精悍的依赖配置和多种多样的作用与选择,Gradle
可以为我们提供比Maven
更加优秀的依赖管理功能。
#gradle的任务和插件
gradle
的配置文件是一个groovy
脚本文件,在其中我们可以以编程方式自定义一些构建任务。因为使用了编程方式,所以这带给了我们极大的灵活性和便捷性。打个比方,现在有个需求,要在打包出jar的时候顺便看看jar文件的大小。在gradle中仅需在构建脚本中编写几行代码即可。而在Maven中则需要编写Maven插件,复杂程度完全不在一个水平。
当然,Maven发展到现在,已经存在了大量的插件,提供了各式各样的功能可以使用。但是在灵活性方面还是无法和Gradle相比。而且Gradle也有插件功能,现在发展也十分迅猛,存在了大量非常好用的插件,例如gretty插件。gretty原来是社区插件,后来被官方吸收为官方插件,可以在Tomcat和jetty服务器上运行web项目,比Maven的相关插件功能都强大。
虽然gradle可以非常灵活的编写自定义脚本任务,但是其实一般情况下我们不需要编写构建脚本,利用现有的插件和任务即可完成相关功能。在IDEA里,也可以轻松的查看当前gradle项目中有多少任务,基本任务如build、test等Maven和Gradle都是相通的。
#配置镜像
Maven
官方仓库的下载速度非常慢,所以一般我们要配置国内的镜像源。gradle
在这方面和Maven
完全兼容,因此只需稍微配置一下镜像源,即可使用Maven
的镜像。如果你用gradle
构建过项目,应该就可以在用户目录的.gradle
文件夹下看到gradle
的相关配置和缓存。之前wrapper
下载的gradle
也存放在该文件夹下,位置是wrapper/dists
。而依赖的本地缓存在caches\modules-2\files-2.1
文件夹下。目录结构和Maven
的本地缓存类似,都是包名+版本号的方式,但是gradle
的目录结构最后一层和Maven
不同,这导致它们无法共用本地缓存。
IDEA中可以修改该目录
在gradle
中配置下载镜像需要在你在idea中修改gradle
文件夹目录中(我的是G:/gradle/gradle-6.5/gradleRep
)直接新建一个init.gradle
全局初始化脚本,脚本文件内容如下。这样一来,gradle下载镜像的时候就会使用这里配置的镜像源下载,速度会快很多。再加上gradle wrapper
在中国设置了CDN
,现在使用gradle
的速度应该会很快。
1 | allprojects { |