You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Gradle中depends与dependencies关键字的区别解析

在Gradle中depends与dependencies的区别

嘿,这个问题问得很到位!咱们结合你给出的代码场景,把两者的核心差异拆解清楚:

1. dependencies:Gradle原生的核心依赖配置块

这是Gradle官方提供的标准语法,所有Gradle项目默认都支持,是你声明项目依赖的唯一官方入口。

它的作用是定义项目在不同构建阶段(编译、测试运行、打包等)需要的依赖项,不管是内部子项目依赖(比如你代码里的compile project(':asm-test')),还是外部第三方库依赖(比如testImplementation 'org.junit.jupiter:junit-jupiter-api:5.1.0'),都必须放在这个块里才能被Gradle识别并处理。

比如你第二个场景的代码:

dependencies {
    requires.each { projectName -> compile project(projectName) }
    depends.each { artifactName -> compile artifactName }
    testImplementation 'org.junit.jupiter:junit-jupiter-api:5.1.0', 'org.junit.jupiter:junit-jupiter-params:5.1.0'
    testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.1.0'
    testCompile project(':asm-test')
}

这里的dependencies块就是用来把各种依赖(包括遍历自定义属性拿到的依赖)真正注册到Gradle的依赖管理系统中。

2. depends:项目自定义的属性,非Gradle原生关键字

这个词不是Gradle的内置语法,它是你当前项目团队自定义的一个属性,本质上就是用来存储依赖坐标的一个容器。

看你第一个场景的代码:

project(':tools:bnd-module-plugin') {
    description = "bnd plugin to build moduleinfo with ${rootProject.description}"
    sourceSets.main.java.srcDirs += project(':asm').sourceSets.main.java.srcDirs
    depends = ['biz.aQute.bnd:biz.aQute.bnd:3.4.0']
}

这里是给tools:bnd-module-plugin这个子项目设置了一个名为depends的列表属性,把外部库坐标存进去而已。它本身不会让依赖生效,必须在dependencies块里通过逻辑(比如你代码里的depends.each { artifactName -> compile artifactName })把这些坐标转化为Gradle能识别的依赖配置,才会真正起作用。

总结

  • dependencies:Gradle官方规定的依赖声明核心块,是依赖生效的必要环节,属于Gradle原生语法。
  • depends:项目自定义的辅助属性,仅用来存储依赖信息,本身不具备依赖管理的能力,必须配合dependencies块的逻辑才能让依赖生效。

内容的提问来源于stack exchange,提问作者saga

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 06:52:36