IntelliJ IDEA 中 Gradle 的配置和使用

1,434 阅读4分钟

1. 本地安装 Gradle

1.1. 下载软件

官网地址:gradle.org/

image.png

这里下载二进制版本:

image.png

这里选择当前最新版本:

image.png

下载好后直接解压到目标地址即可:

image.png

注意:Gradle 是基于 Java 的,因此首先要安装 Java JDK。

1.2. 系统配置

这里主要配置下系统环境变量:

image.png

在 Path 中添加%GRADLE_HOME%\bin即可完成环境变量配置。

image.png

由于 Gradle 需要下载相关依赖包,默认是在 C 盘里面,后续可能会占用较多磁盘,因此可以增加一个环境变量的配置,修改下载下来的依赖的存储位置,可以理解成 Maven 的 localRepository 标签配置,具体如下图:

image.png

配完使用gradle -v命令查看下:

image.png

2. IDEA 配置 Gradle

2.1. 默认配置

image.png

2.2. 自定义配置

image.png

新建项目后,该界面显示如下:

image.png

3. Gradle 和 Maven 的区别

Gradle 没有自己的中央仓库,用的就是 Maven 的中央仓库。

3.1. 常用命令对比

命令GradleMaven
构建项目./gradlew buildmvn clean install
清理项目./gradlew cleanmvn clean
运行测试./gradlew testmvn test
生成项目文档./gradlew javadocmvn javadoc:javadoc
发布到远程仓库./gradlew publishmvn deploy
列出项目依赖./gradlew dependenciesmvn dependency:tree
扫描项目依赖漏洞./gradlew dependencyCheckAnalyzemvn org.owasp:dependency-check-maven:check
创建新项目使用初始化插件,如 Spring Initializrmvn 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会隐式的把这些库间接依赖的库也加入到你的项目中。

765de4ceb8a411b6395f916a14869568_fa02b47e05b84860a1c627fa21f7e527.png

2、传递性依赖中版本冲突:

由于传递性依赖的特点,两个不同版本的jar包会被依赖进来,这样就存在版本冲突的问题。

24917b5af5cb7d0061474884421561c2_97c0ceaf5383482191b6df3b33064eb6.png

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'

c917582b7d95b652a78df5a97763ef42_ee39ba44408b433794a0100a9bb5b4b7.png

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()
    }
}

就会在构建时候抛出异常:

572a2f9dc6b0d4a946a5a1d34b6ffdda_8bd2300d7bda4fda924d98916316a063.png

手动指定某个jar 的版本:

force:强制覆盖某个版本:

configurations.configureEach {
    resolutionStrategy{
        force 'org.springframework:spring-beans:5.3.12'
    }
}

caff498ca1ef4b3cb0e2cc07611d15b7_0e950177f5d34e4b802bf1b97896fc76.png

4. 新老版本 Gradle 区别

97ae0d8dd249b60affe7d74dd0de758.png

比如公共模块 common 中的依赖需要传递给其他模块,则需要使用 api:

36aa2d7bcfb3a61604a11db7bf38678.png