maven 之痛点:
相信使用Java的同学都用过Maven,这是一个非常经典好用的项目构建工具。但是如果你经常使用Maven,可能会发现Maven有一些地方用的让人不太舒服:
- 一来Maven的配置文件是XML格式的,假如你的项目依赖的包比较多,那么XML文件就会变得非常非常长;
- 二来XML文件不太灵活,假如你需要在构建过程中添加一些自定义逻辑,搞起来非常麻烦;
- 第三就是Maven非常的稳定,但是相对的就是对新版java支持不足,哪怕就是为了编译java11,也需要更新内置的Maven插件。
如果你对Maven的这些缺点也有所感触,准备尝试其他的构建工具,那么你可以试试gradle,这是一个全新的java构建工具,解决了Maven的一些痛点。
gradle作为一个新兴的工具已经有了广泛的应用,相比maven,它有以下优点:
- 第一点也就是最重要的一点就是速度。gradle使用构建缓存、守护进程等方式提高编译速度。结果就是gradle的编译速度要远超maven,平均编译速度比Maven快好几倍,而且项目越大,这个差距就越明显。
- 第二点就是灵活性,gradle要比Maven灵活太多,虽然有时候灵活并不是一件好事情。但是大部分情况下,灵活一点可以极大的方便我们。Maven死板的XML文件方式做起事情来非常麻烦。很多Maven项目都通过执行外部脚本的方式来完成一些需要灵活性的工作。而在gradle中配置文件就是构建脚本,构建脚本就是编程语言(groovy编程语言),完全可以自给自足,无需外部脚本。
- 第三点就是gradle DSL带来的简洁性。完成同样的功能,gradle脚本的长度要远远短于maven配置文件的长度。虽然很多人都说XML维护起来不麻烦,但是我觉得,维护一个光是依赖就有几百行的XML文件,不见得就比gradle脚本简单。
安装gradle
最传统的安装方法就是去gradle官网下载二进制包,解压,然后将路径添加到环境变量中。如果你没什么其他需求,可以使用这种安装方式。但是,gradle是一个非常新潮的项目,每隔几个月就会发布一个新版本,这种方式可能跟不上gradle的更新速度。
所以我更加推荐使用包管理器来安装gradle。如果你使用linux系统,那么不必多说。如果你使用Windows系统,我推荐使用scoop包管理器来安装gradle。它安装方便,而且使用SHIM目录来管理环境变量,在各种工具中配置gradle也很方便。
如果你不喜欢安装这么多乱七八糟的东西,gradle提供了一个名为gradle wrapper的工具,其实它就是个脚本文件,当你运行wrapper脚本的时候,如果脚本发现你电脑里没有gradle,就会自动替你下载安装一个。现在甚至还出现了Maven wrapper,也是个脚本文件,可以自动安装Maven。
之前很多朋友尝试使用gradle,结果因为速度太慢,最后放弃了。不过现在使用gradle的话会方便很多。gradle官方在中国开设了,CDN,使用gradle wrapper的时候下载速度非常快。可以说现在是一个学习使用gradle的好时候。
使用 gradle wrapper
当我们使用IDEA来创建gradle项目的时候,IDEA会默认使用 gradle wrapper 来创建新项目,因此无需提前安装好 gradle 。
IDEA 推荐下载 all 版本,而非仅包含 bin 的二进制版本。因为all 版包含源代码,这样IDEA可以分析源代码,提供更加精确的gradle脚本支持。在 gradle 项目下的 gradle-wrapper.properties 文件中,设置distributionUrl=https\://services.gradle.org/distributions/gradle-7.4-all.zip
,注意最后是 -all.zip,而不是 -bin.zip。
gradle 项目的目录结构和 maven项目的几乎完全一致。
项目中的 gradle 文件夹和 gradlew.bat 文件,是gradle wrapper 的相关文件。
扩展名为 .gradle 的两个文件:build.gradle 和 settings.gradle 文件,是gradle的配置文件。对应于 maven 的 pom.xml。
.gradle 文件夹下会保存之前使用过的下载的各个版本的gradle,在wrapper/dists中。还会保存之前构建项目时的配置和依赖项的本地缓存,在cahces/modules-2/files-2.1 文件夹中。
gradle wrapper 的优点:
- 可以自定义下载的 gradle 的版本,团队协作时,简单配置就可以统一团队的构建工具版本,非常方便。方式是在 gradle.properties 中,设置统一的distributionUrl 的值即可。
- 依赖项配置仅需一行,格式为 scope ‘groupId:targetId:versionId’,可以去 jetbrains 的package search 网站 搜索 依赖项
- 配置文件是 groovy脚本文件,可以编程方式自定义构建任务,灵活便捷。
- 大量插件,比如官方插件之一 gretty插件
gradle 依赖项的scope 相较于 maven 更加精细
- implementation,默认的scope。意为在编译和运行时都需要使用的依赖项。但是不暴露给这个类库的使用者、即不允许这类库的使用者使用它。
- api,和 implementation 类似,也是编译和运行时都需要使用,并且类库的使用者也使用这个依赖项。
- compileOnly 和 runtimeOnly,前者意为只允许在项目编译时使用这个依赖项 ,后者意为只允许项目在运行时使用这个依赖项。
- testImplementation、testCompileOnly 、testRuntimeOnly,类似以上,但只允许在测试时使用
配置镜像和代理
可以直接使用maven 的仓库,因此也可以使用maven的镜像。
在C:\Users< your-user-name >.gradle 文件夹下创建一个 init.gradle 初始化脚本:
allprojects {
repositories {
maven {
url "https://maven.aliyun.com/repository/public"
}
maven {
url "https://maven.aliyun.com/repository/jcenter"
}
maven {
url "https://maven.aliyun.com/repository/spring"
}
maven {
url "https://maven.aliyun.com/repository/spring-plugin"
}
maven {
url "https://maven.aliyun.com/repository/gradle-plugin"
}
maven {
url "https://maven.aliyun.com/repository/google"
}
maven {
url "https://maven.aliyun.com/repository/grails-core"
}
maven {
url "https://maven.aliyun.com/repository/apache-snapshots"
}
}
}
更好的方式是配置全局代理:在C:\Users< your-user-name >.gradle 文件夹下,新建 gradle.properties 文件,做以下配置:
systemProp.http.proxyHost=127.0.0.1
systemProp.http.proxyPort=10800
systemProp.https.proxyHost=127.0.0.1
systemProp.https.proxyPort=10800
systemProp.file.encoding=UTF-8