1. 本地安装 Gradle
1.1. 下载软件
官网地址:gradle.org/
这里下载二进制版本:
这里选择当前最新版本:
下载好后直接解压到目标地址即可:
注意:Gradle 是基于 Java 的,因此首先要安装 Java JDK。
1.2. 系统配置
这里主要配置下系统环境变量:
在 Path 中添加%GRADLE_HOME%\bin即可完成环境变量配置。
由于 Gradle 需要下载相关依赖包,默认是在 C 盘里面,后续可能会占用较多磁盘,因此可以增加一个环境变量的配置,修改下载下来的依赖的存储位置,可以理解成 Maven 的 localRepository 标签配置,具体如下图:
这里说明下:GRADLE_USER_HOME 变量是在项目使用包装器gradle构建项目时使用的,所以还是配置下。
配完使用gradle -v命令查看下:
2. IDEA 配置 Gradle
2.1. 默认配置
2.2. 自定义配置
新建项目后,该界面显示如下:
2.3. 配置全局脚本
可以在 gradle 的 init.d 目录下,创建以.gradle结尾的文件(比如init.gradle),init.gradle文件可以实现在 build 开始之前执行。因此可以在这个文件中配置预先加载的操作。当然你也可以直接配置到具体的项目里面,使用方式和 maven 类似,具体文件里面的内容如下【可以根据实际情况进行调整】:
allprojects {
repositories {
mavenLocal()
maven { name "Alibaba" ; url "https://maven.aliyun.com/repository/public" }
maven { name "Bstek" ; url "https://nexus.bsdn.org/content/groups/public/" }
mavenCentral()
}
buildscript {
repositories {
maven { name "Alibaba" ; url 'https://maven.aliyun.com/repository/public' }
maven { name "Bstek" ; url 'https://nexus.bsdn.org/content/groups/public/' }
maven { name "M2" ; url 'https://plugins.gradle.org/m2/' }
}
}
}
- allprojects:这部分表示我们正在配置所有项目的仓库设置。这确保了对整个构建进行全局设置。
- repositories:这一部分指定了项目的依赖仓库。在这里,我们使用了几种不同的仓库来源:
- mavenLocal():这行代码告诉 Gradle 使用本地 Maven 仓库作为第一个依赖源。
- maven { name "Alibaba" ; url "maven.aliyun.com/repository/…" }:这表示我们向 Gradle 声明了一个名为 "Alibaba" 的远程 Maven 仓库,指定了阿里云镜像的地址。
- maven { name "Bstek" ; url "nexus.bsdn.org/content/gro…" }:这一行声明了一个名为 "Bstek" 的远程 Maven 仓库,指定了 Nexus 私有仓库的地址,可以根据自己实际情况修改配置。
- mavenCentral():最后,我们指定了 Maven 中央仓库,作为备用的依赖源,直接声明即可,无需额外配置。
- buildscript:这部分指定了构建脚本的仓库配置。
- repositories:在这里,我们又一次定义了构建脚本的仓库配置,包括了多个 Maven 仓库:
- maven { name "Alibaba" ; url 'maven.aliyun.com/repository/…' }:这里再次声明了名为 "Alibaba" 的 Maven 仓库,以确保构建脚本能够从阿里云镜像获取依赖。
- maven { name "Bstek" ; url 'nexus.bsdn.org/content/gro…' }:同样地,我们也声明了名为 "Bstek" 的 Maven 仓库,以供构建脚本使用。
- maven { name "M2" ; url 'plugins.gradle.org/m2/' }:最后,我们指定了来自 plugins.gradle.org 的额外 Maven 仓库,用于获取 Gradle 插件。
通过这样的配置,Gradle 将会优先使用本地 Maven 仓库,如果找不到所需的依赖,它会依次尝试使用阿里云镜像、Nexus 私有仓库和 Maven 中央仓库,同时还会从额外的插件仓库中获取 Gradle 插件。
注意:
配置中有 mavenLocal() 就是说明首先使用 maven 的本地仓库获取依赖。因此需要配置 M2_HOME 环境变量,但是本地实际上有没有都是没有影响的,解释如下:
添加 mavenLocal() 依赖仓库并不要求你在电脑上安装 Maven。这是因为 mavenLocal() 实际上指向的是本地 Maven 仓库目录,而不是 Maven 工具本身。
当你在 Gradle 项目中使用 mavenLocal() 时,Gradle 将尝试从默认的本地 Maven 仓库目录(通常在用户目录下的 .m2 文件夹)中解析依赖。如果你的电脑上没有安装 Maven,那么该目录可能为空或者不存在。
在这种情况下,如果你尝试从 mavenLocal() 中解析依赖,Gradle 可能会失败,因为它无法在本地 Maven 仓库中找到相应的依赖。但这并不会影响你的系统或其他项目的正常运行。
因此,如果你没有安装 Maven,且没有在本地 Maven 仓库中手动安装依赖,添加 mavenLocal() 依赖仓库对你的项目实际上没有积极的影响。一般情况下,只有在你确切知道本地 Maven 仓库中存在所需的依赖时才会使用 mavenLocal()。
3. Gradle 和 Maven 的区别
Gradle 没有自己的中央仓库,用的就是 Maven 的中央仓库。
3.1. 常用命令
| 命令 | Gradle | Maven |
|---|---|---|
| 构建项目 | ./gradlew build | mvn clean install |
| 清理项目 | ./gradlew clean | mvn clean |
| 运行测试 | ./gradlew test | mvn test |
| 生成项目文档 | ./gradlew javadoc | mvn javadoc:javadoc |
| 发布到远程仓库 | ./gradlew publish | mvn deploy |
| 列出项目依赖 | ./gradlew dependencies | mvn dependency:tree |
| 扫描项目依赖漏洞 | ./gradlew dependencyCheckAnalyze | mvn org.owasp:dependency-check-maven:check |
| 创建新项目 | 使用初始化插件,如 Spring Initializr | mvn archetype:generate |
3.2. 常用功能
Gradle 提供了许多常用功能,包括但不限于以下内容:
增加依赖:通过在构建脚本中添加依赖声明来引入外部库。例如使用 implementation 关键字添加编译时依赖,或者使用 testImplementation 添加测试时依赖。
dependencies {
implementation 'com.example:library:1.0.0'
testImplementation 'junit:junit:4.12'
}
剔除依赖:有时候你可能需要排除特定的传递性依赖。你可以使用 exclude 方法来剔除依赖项。
dependencies {
implementation('com.example:library:1.0.0') {
exclude group: 'org.unwanted', module: 'unwanted-module'
}
}
全局依赖版本管理:使用 dependencyManagement 插件进行全局依赖版本管理。这样一来,你就可以在单独的位置定义和管理依赖库的版本,而不需要在每个模块中都重复声明。
dependencyManagement {
imports {
mavenBom 'group:artifact:version'
}
}
增加插件:通过 plugins 块或者 apply plugin 语句来增加插件。Gradle 提供了很多内置的插件,同时也可以使用第三方插件。
plugins {
id 'java'
id 'application'
}
自定义任务:你可以创建自定义任务来执行项目特定的操作,比如清理临时文件、运行定制化的构建过程等等。
这些只是 Gradle 提供的众多功能之一。Gradle 还提供了许多其他强大的功能,比如多项目构建、增量构建、构建缓存、定制化构建逻辑等等。Gradle 的灵活性使得它成为一个广泛使用的构建工具,能够满足各种不同规模和类型的项目需求,具体的请自行探索。
3.4. 依赖版本冲突问题
3.4.1. 依赖传递性和版本冲突
1、依赖传递性
假设你的项目依赖于一个库,而这个库又依赖于其他库。你不必自己去找出所有这些依赖,你只需要加上你直接依赖的库,Gradle会隐式的把这些库间接依赖的库也加入到你的项目中。
2、传递性依赖中版本冲突:
由于传递性依赖的特点,两个不同版本的jar包会被依赖进来,这样就存在版本冲突的问题。
3.4.2. Maven 中解决冲突的办法-自动解决方案:
【1】第一原则:最短路径优先原则
“最短路径优先” 意味着项目依赖关系树中路径最短的版本会被使用。
例如,假设A、B、C之间的依赖关系是:A->B->C->D(2.0) 和A->E->(D1.0),那么D(1.0)会被使用,因为A通过E到D的路径更短。
【2】第二原则:最先声明原则
依赖路径长度是一样的的时候,第一原则不能解决所有问题,比如这样的依赖关系:A–>B–>Y(1.0),A–>C–>Y(2.0),Y(1.0)和Y(2.0)的依赖路径长度是一样的,都为2。
那么到底谁会被解析使用呢?
在maven2.0.8及之前的版本中,这是不确定的,但是maven2.0.9开始,为了尽可能避免构建的不确定性,maven定义了依赖调解的第二原则:第一声明者优先。
在依赖路径长度相等的前提下,在POM中依赖声明的顺序决定了谁会被解析使用。顺序最靠前的那个依赖优胜。
3.4.3. Gradle 中解决冲突的办法-自动解决方案:
Gradle 的默认自动解决版本冲突的方案是选用版本最高的。
案例:加入两个依赖:
implementation group: 'org.springframework', name: 'spring-jdbc', version: '5.1.3.RELEASE'
implementation group: 'org.springframework', name: 'spring-webmvc', version: '5.1.13.RELEASE'
3.4.4. Gradle 中解决冲突的办法-手动修改依赖:
手动排除依赖:
dependencies {
implementation(group: 'org.springframework', name: 'spring-jdbc', version: '5.1.3.RELEASE'){
exclude group:'org.springframework',module:'spring-beans'
}
}
后续可以自己手动配置你想要的版本的依赖。
修改默认配置策略,对所有jar不做冲突自动解决:
configurations.configureEach {//.all
resolutionStrategy{
failOnVersionConflict()
}
}
就会在构建时候抛出异常:
手动指定某个jar 的版本:
force:强制覆盖某个版本:
configurations.configureEach {
resolutionStrategy{
force 'org.springframework:spring-beans:5.3.12'
}
}
4. 新老版本 Gradle 区别
比如公共模块 common 中的依赖需要传递给其他模块,则需要使用 api: