Flutter 本地 Maven 引入 AAR,为什么 settings.gradle.kts 里配置了却不生效?
在 Flutter Android 项目里接入本地 AAR 时,我一开始把本地 Maven 仓库配置写在了 settings.gradle.kts:
scss
dependencyResolutionManagement {
repositories {
google()
mavenCentral()
maven { url = uri("local-maven") }
}
}
依赖写在 android/app/build.gradle.kts:
scss
dependencies {
implementation("com.example.sdk:example-sdk:1.0.0")
}
本地 Maven 目录结构也是正确的:
bash
android/local-maven/com/example/sdk/example-sdk/1.0.0/example-sdk-1.0.0.aar
但 Gradle 仍然提示找不到:
makefile
com.example.sdk:example-sdk:1.0.0
原因
问题不在 AAR,也不在 Maven 目录结构,而是 Flutter Android 项目里 project 级 repositories 覆盖/影响了 settings 里的 repositories。
Gradle 里有两个常见仓库配置位置:
bash
settings.gradle.kts
android/build.gradle.kts
settings.gradle.kts 里的:
markdown
dependencyResolutionManagement {
repositories { ... }
}
理论上可以统一管理依赖仓库。
但在 Flutter 项目里,android/build.gradle.kts 通常还会有:
scss
allprojects {
repositories {
google()
mavenCentral()
}
}
同时 Flutter Gradle Plugin 自己也可能给 project 动态添加仓库。
在这种情况下,project 级 repositories 会参与依赖解析。默认模式下,如果 project 自己声明了 repositories,settings.gradle.kts 里的仓库配置就不一定是最终使用的那一套。
所以你只在 settings.gradle.kts 里加本地 Maven,有时不会生效。
正确做法
把本地 Maven 仓库加到 android/build.gradle.kts 的 allprojects.repositories 里:
scss
allprojects {
repositories {
maven {
url = rootProject.layout.projectDirectory
.dir("local-maven")
.asFile
.toURI()
}
google()
mavenCentral()
}
}
这样 :app 模块和其他 Android 子模块都能看到这个本地 Maven 仓库。
为什么不要直接写相对路径?
不要这样写:
ini
maven { url = uri("local-maven") }
因为在多模块项目里,相对路径可能会按当前模块目录解析。
例如在 :app 模块中,它可能会去找:
bash
android/app/local-maven
但真实目录是:
bash
android/local-maven
所以更稳的是用:
bash
rootProject.layout.projectDirectory.dir("local-maven")
它永远从 Android 根工程目录开始找。
总结
settings.gradle.kts 里配置本地 Maven 不生效,主要是因为 Flutter Android 项目里 project 级 repositories 也参与了依赖解析,最终没有使用到 settings 里的仓库配置。
所以更稳的方式是在 android/build.gradle.kts 里配置:
scss
allprojects {
repositories {
maven {
url = rootProject.layout.projectDirectory
.dir("local-maven")
.asFile
.toURI()
}
google()
mavenCentral()
}
}
一句话总结:
bash
Flutter 项目里,本地 Maven 仓库最好配置到 android/build.gradle.kts 的 allprojects.repositories,并且用 rootProject 固定路径。