Gradle学习[6]——依赖

Gradle学习[6]——依赖

Gradle中的依赖与Maven类似,它可以从坐标引入Jar依赖、引入当前项目依赖、引入本地Jar依赖,它的引入方式、写法比maven更灵活。

1
2
3
4
5
6
7
8
9
10
dependencies {
//依赖当前项目下的某个模块[子工程]
implementation project(':subject01')
//直接依赖本地的某个jar文件
implementation files('libs/foo.jar', 'libs/bar.jar')
//配置某文件夹作为依赖项
implementation fileTree(dir: 'libs', include: ['*.jar'])
//直接依赖
implementation 'org.apache.logging.log4j:log4j:2.17.2'
}

在执行build命令时Gradle会根据配置去引入声明的依赖。

依赖类型

与Maven的依赖下的scope标签类似,但Gradle还需要特定的插件。

参数描述
compileOnly由java插件提供,曾短暂的叫provided,后续版本已经改成了compileOnly,适用于编译期需要而不需要打包的情况
runtimeOnly由 java 插件提供,只在运行期有效,编译时不需要,比如mysql 驱动包。,取代老版本中被移除的 runtime
implementation由 java 插件提供,针对源码[src/main 目录] ,在编译、运行时都有效,取代老版本中被移除的 compile
testCompileOnly由 java 插件提供,用于编译测试的依赖项,运行时不需要
testRuntimeOnly由 java 插件提供,只在测试运行时需要,而不是在测试编译时需要,取代老版本中被移除的testRuntime
testImplementation由 java 插件提供,针对测试代码[src/test 目录] 取代老版本中被移除的testCompile
providedCompilewar 插件提供支持,编译、测试阶段代码需要依赖此类jar 包,而运行阶段容器已经提供了相应的支持,所以无需将这些文件打入到war 包中了;例如servlet-api.jar、jsp-api.jar
compile编译范围依赖在所有的 classpath 中可用,同时它们也会被打包。在gradle 7.0 已经移除
runtimeruntime 依赖在运行和测试系统的时候需要,在编译的时候不需要,比如mysql 驱动包。在 gradle 7.0 已经移除
apijava-library 插件提供支持,这些依赖项可以传递性地导出给使用者,用于编译时和运行时。取代老版本中被移除的 compile
compileOnlyApijava-library 插件提供支持,在声明模块和使用者在编译时需要的依赖项,但在运行时不需要。

依赖传递

与Maven不同,Gradle可以在项目中设置依赖是否会被传递到主动引入的模块。

Gradle中引入依赖有implementation与api,api允许依赖传递,implementation不允许。

下面列举一些情况说明:

A implementation B, B implementation C,则A是不能使用C。

A implementation B,B api C,则A是可以使用C。

A implementation B,B implementation C,C api D,则A不可以使用D,但B可以使用D。

A implementation B,B api C,C api D,则A可以使用D。

依赖冲突

如果发生了依赖冲突,Gradle会采取策略是最高版本优先,与Maven不同,Maven的策略是使用最短路径优先。

依赖排除

当然除此之外,也跟Maven一样,提供了排除的做法,也是同样的关键字。

1
2
3
4
5
6
7
8
9
10
11
12
dependencies {
testImplementation 'org.junit.jupiter:junit-jupiter-api:5.8.1'
testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.8.1'
implementation('org.hibernate:hibernate-core:3.6.3.Final'){
//排除某一个库(slf4j)依赖:如下三种写法都行
exclude group: 'org.slf4j'
exclude module: 'slf4j-api'
exclude group: 'org.slf4j',module: 'slf4j-api'
}
//排除之后,使用手动的引入即可。
implementation 'org.slf4j:slf4j-api:1.4.0'
}

传递允许

Gradle还提供了依赖中的依赖是否允许被传递

1
2
3
4
5
6
dependencies {
implementation('org.hibernate:hibernate-core:3.6.3.Final'){
//不允许依赖传递,一般不用
transitive(false)
}
}

强制版本

Gradle也提供了强制使用某个版本的依赖,与Maven的dependencyManagement标签类似

1
2
3
4
dependencies {
// 只需要在版本号后面加上两个感叹号就是强制使用该版本
implementation('org.hibernate:hibernate-core:3.6.3.Final!!')
}

检查冲突

Gradle还可以设置当出现依赖冲突时。立即构建失败。

1
2
3
4
5
configurations.all() {
Configuration configuration ->
//当遇到版本冲突时直接构建失败
configuration.resolutionStrategy.failOnVersionConflict()
}

Gradle学习[6]——依赖
https://blog.gugu.dev/2024-02-21/Gradle学习-6-——依赖/
作者
MinMin
发布于
2024年2月21日
许可协议