settings.gradle中pluginManagement.repositories仅用于下载插件,不参与业务依赖解析;dependencyResolutionManagement.repositories才负责implementation等依赖下载,二者职责严格分离。

settings.gradle里声明的插件仓库,只管插件本身下载
你在 settings.gradle 里写的 pluginManagement { repositories { ... } },作用非常明确:只用来下载和解析 plugins { id 'xxx' } 声明的那些插件。它不碰项目代码里的 implementation、api 或任何业务依赖。
常见错误现象:
- 加了
mavenCentral()到dependencyResolutionManagement却没加到pluginManagement,结果报错Plugin [id: 'com.android.application'] was not found in any of the following sources - 误把
google()写进pluginManagement.repositories,但 Android Gradle 插件官方已不再通过google()分发(自 AGP 8.0+ 起),必须用mavenCentral()或gradlePluginPortal()
实操建议:
-
pluginManagement中优先写gradlePluginPortal()(Gradle 官方插件主源)和mavenCentral()(覆盖绝大多数第三方插件) - 除非你明确知道某个插件托管在私有 Nexus/Artifactory,否则不要往里塞
google()或自定义 URL - Android 项目若使用 AGP ≥ 8.0,请确认
pluginManagement.repositories中没有仅留google()—— 这是同步失败最隐蔽的原因之一
build.gradle里声明的插件,只影响当前Project对象的行为
build.gradle(无论是根项目还是子模块)中通过 plugins { id 'xxx' } 或 apply plugin: 'xxx' 引入的插件,作用域仅限于该 Project 实例。它会往这个 Project 里注册 Task、扩展 DSL(比如 android {})、修改依赖配置等,但不会影响其他模块,也不会反向决定插件从哪下载。
容易踩的坑:
- 在子模块
build.gradle里写plugins { id 'org.jetbrains.kotlin.jvm' version '1.9.20' },却没在settings.gradle的pluginManagement里声明对应仓库 → 报错找不到插件 - 用
buildscript { dependencies { classpath 'xxx' } }方式引入插件(旧写法),但没同步更新pluginManagement→ 构建可能成功,但 IDE 同步失败或版本不一致 - 在根
build.gradle里 apply 一个插件,期望它自动生效到所有子模块 —— 不会。每个模块需显式声明,或通过subprojects/allprojects统一 apply(但注意执行时机)
Settings插件不是“插件”,而是Settings对象的配置入口
没有所谓“Settings插件”这种东西。你看到的 settings.gradle 文件,本质是 Gradle 初始化阶段执行的一段脚本,最终生成一个 org.gradle.api.initialization.Settings 对象。里面能调用的方法(比如 include、rootProject.name、pluginManagement)都是这个 Settings 类的 API,不是插件提供的功能。
为什么有人会混淆?因为:
-
pluginManagement块看起来像插件,但它只是 Settings 对象的一个配置闭包 - 某些第三方工具(如 Gradle Version Catalog)会提供
enableFeaturePreview('typesafe-project-accessors')这类调用,也发生在 settings 文件里,进一步模糊了边界 - IDE 有时把
settings.gradle语法高亮成“Groovy script”,让人误以为它和build.gradle是同一类东西
关键区别在于生命周期:Settings 对象在构建最开始就创建并配置完毕;Project 对象要等所有 include 模块确定后才逐个实例化。顺序不能颠倒,所以你永远不能在 build.gradle 里去改 include 列表,也不能在 settings.gradle 里调用 project.afterEvaluate。
多模块下插件版本不一致,问题往往出在settings层
当你的项目有 app、feature、common 等多个模块,且各模块 build.gradle 中声明了不同版本的 Kotlin 插件(比如 1.8.20 和 1.9.20),Gradle 默认不会报错,但实际生效的是第一个被解析的版本 —— 这取决于模块加载顺序,不可控。
解决方式必须落在 settings.gradle:
- 用
pluginManagement { plugins { id 'org.jetbrains.kotlin.jvm' version '1.9.20' }统一锁定版本 - 配合
resolutionStrategy { preferProjectModules() }(Gradle 8.4+)可强制本地插件优先 - 如果用了 Version Catalog(
libs.versions.toml),确保pluginManagement块里引用的是 catalog 中定义的插件 ID,而不是硬编码字符串
这一步漏掉,后续所有模块的插件行为都可能漂移 —— 尤其在 CI 环境下,模块加载顺序更不可预测。


















