闲谈gradle

相信使用java开发的人大都用过Maven,这是一个非常经典好用的项目构建工具。但是如果经常使用Maven,可能会发现Maven有一些不太方便的地方。

  1. Maven的配置文件是XML格式的,假如你的项目依赖的包比较多,那么XML文件就会变得非常非常长。
  2. XML文件不太灵活,假如你需要在构建过程中添加一些自定义逻辑,搞起来非常麻烦。
  3. Maven非常的稳定,但是相对的就是对新版java支持不足,哪怕就是为了编译java11,也需要更新内置的Maven插件。

针对这些问题,可以尝试下使用下其他的构建工具,而gradle这一个java构建工具是一个非常好的选择。

使用gradle wrapper

gradle最传统的安装方法就是去gradle官网下载二进制包,解压,然后将路径添加到环境变量中。

但是gradle每隔几个月就会发布一个新版本,这种方式可能跟不上gradle的更新速度。gradle提供了一个名为gradle wrapper的工具,可以在没有安装gradle的情况下使用gradle。gradle wrapper是个脚本文件,当你运行wrapper脚本的时候,如果脚本发现你电脑里没有gradle,就会自动替你下载安装一个。

创建项目

IDEA默认就会使用gradle wrapper来创建项目,所以无需安装gradle也可以正常运行。

闲谈gradle

gradle和Maven的项目结构几乎完全一致,gradle文件夹和gradlew那几个文件就是gradle wrapper的文件,而.gradle后缀名的文件正是gradle的配置文件,对应于Maven的pom.xml。

闲谈gradle

gradle依赖管理

这点是gradle相较maven的优势之一,相较于maven一大串的XML配置,gradle的依赖项仅需一行。

dependencies { testImplementation 'junit:junit:4.13' implementation 'com.google.code.gson:gson:2.8.6'}

gradle依赖的粒度控制

gradle依赖的粒度控制相较于Maven也更加精细,gradle有以下几种scope:

  • implementation:默认的scope。implementation的作用域会让依赖在编译和运行时均包含在内,但是不会暴露在类库使用者的编译时。举例,如果我们的类库包含了gson,那么其他人使用我们的类库时,编译时不会出现gson的依赖。
  • api:和implementation类似,都是编译和运行时都可见的依赖。但是api允许我们将自己类库的依赖暴露给我们类库的使用者。
  • compileOnly:只在编译时可见。
  • runtimeOnly:只在运行时可见。runtimeOnly和Maven的provided比较接近。
  • testImplementation:这种依赖在测试编译时和运行时可见,类似于Maven的test作用域。
  • testCompileOnly:类似于compileOnly,但是作用于测试编译时。
  • testRuntimeOnly:类似于runtimeOnly,但是作用于测试运行时。

gradle的任务和插件

gradle的配置文件是一个groovy脚本文件,在其中我们可以以编程方式自定义一些构建任务。因为使用了编程方式,所以这带给了我们极大的灵活性和便捷性。打个比方,现在有个需求,要在打包出jar的时候顺便看看jar文件的大小。在gradle中仅需在构建脚本中编写几行代码即可。而在Maven中则需要编写Maven插件,复杂程度完全不在一个水平。

Maven发展到现在,已经存在了大量的插件,提供了各式各样的功能可以使用。但是在灵活性方面还是无法和Gradle相比。而且Gradle也有插件功能,现在发展也十分迅猛,存在了大量非常好用的插件,例如gretty插件。gretty原来是社区插件,后来被官方吸收为官方插件,可以在Tomcat和jetty服务器上运行web项目,比Maven的相关插件功能都强大。

虽然gradle可以非常灵活的编写自定义脚本任务,但是其实一般情况下我们不需要编写构建脚本,利用现有的插件和任务即可完成相关功能。在IDEA里,也可以轻松的查看当前gradle项目中有多少任务,基本任务如build、test等Maven和Gradle都是相通的。gretty插件的任务

配置镜像

Maven官方仓库的下载速度非常慢,所以一般我们要配置国内的镜像源。gradle在这方面和Maven完全兼容,因此只需稍微配置一下镜像源,即可使用Maven的镜像。如果你用gradle构建过项目,应该就可以在用户目录的.gradle文件夹下看到gradle的相关配置和缓存。

gradle的优势

  1. 编译速度,gradle使用构建缓存、守护进程等方式提高编译速度。结果就是gradle的编译速度要远超maven,平均编译速度比Maven快好几倍,而且项目越大,这个差距就越明显。
  2. 灵活性,gradle要比Maven灵活太多。很多Maven项目都通过执行外部脚本的方式来完成一些需要灵活性的工作,而在gradle中配置文件就是构建脚本,构建脚本就是编程语言(groovy编程语言),完全可以自给自足,无需外部脚本。
  3. gradle DSL,完成同样的功能,gradle脚本的长度要远远短于maven配置文件的长度。虽然很多人都说XML维护起来不麻烦,但是我觉得,维护一个光是依赖就有几百行的XML文件,不见得就比gradle脚本简单。