如何强制Gradle完全通过内部JFrog Artifactory解析所有依赖,禁止访问外部仓库?
我遇到过完全一样的问题——Gradle经常会“偷偷”绕过自定义仓库去拉取插件或依赖,尤其是和IDE集成、Gradle插件管理相关的部分。下面是我亲测有效的完整解决方案,能彻底把所有依赖请求锁在内部Artifactory中:
1. 用Settings脚本彻底接管依赖与插件解析,禁用所有默认仓库
Gradle默认会隐式启用gradlePluginPortal、mavenCentral等外部仓库,哪怕你没在配置里写。要完全禁用它们,并且强制所有解析都走内部仓库,修改settings.gradle.kts如下:
pluginManagement { repositories { // 仅保留内部Artifactory仓库 maven { url = uri("https://artifactory.example.hu/artifactory/maven/") } // 关键:禁用所有默认外部仓库 gradlePluginPortal { enabled = false } mavenCentral { enabled = false } google { enabled = false } // 若使用Android/Google依赖,也需禁用 } } dependencyResolutionManagement { // 强制所有项目必须使用settings中定义的仓库,禁止在build.gradle中自行配置仓库 repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) repositories { maven { url = uri("https://artifactory.example.hu/artifactory/maven/") } // 同样禁用默认仓库 gradlePluginPortal { enabled = false } mavenCentral { enabled = false } google { enabled = false } } }
这里的RepositoriesMode.FAIL_ON_PROJECT_REPOS非常重要:它会直接阻止项目级build.gradle.kts中配置任何仓库,避免不小心引入外部源的风险。
2. 强制Gradle插件解析器使用内部仓库
针对你遇到的kotlin-gradle-plugin-idea这类插件依赖,Gradle有时会优先走默认插件门户。可以通过gradle.properties全局指定插件仓库地址:
# 强制Gradle使用内部仓库解析所有插件 gradle.pluginRepository.url=https://artifactory.example.hu/artifactory/maven/
这个配置会覆盖Gradle默认的插件门户地址,确保所有插件类依赖都从Artifactory拉取。
3. 检查并禁用IDE的外部仓库请求
有时候外部请求并非来自Gradle本身,而是IDE(Android Studio/IntelliJ)在后台拉取插件或索引。需要做以下配置:
- 打开IDE设置:
Settings -> Build, Execution, Deployment -> Build Tools -> Gradle- 选择
Use Gradle from: Wrapper (recommended),确保使用项目自带的Gradle版本,避免IDE自带版本的默认配置干扰 - 禁用
Offline work(若Artifactory已同步所有依赖,后续可开启离线模式)
- 选择
- 进入
Settings -> Plugins -> Marketplace,点击Manage Plugin Repositories,仅保留内部Artifactory的插件仓库(若你的Artifactory代理了JetBrains插件仓库),否则直接禁用所有外部插件仓库。
4. 用全局Init脚本做最后一道防线
如果以上配置仍有漏网之鱼,可以在Gradle全局目录下添加init.gradle.kts脚本,在所有项目加载前强制禁用所有外部仓库:
Linux/macOS:~/.gradle/init.gradle.kts
Windows:C:\Users\<你的用户名>\.gradle\init.gradle.kts
脚本内容:
// 对所有项目禁用已有仓库,仅保留内部Artifactory allprojects { repositories { all { repo -> (repo as? MavenArtifactRepository)?.apply { enabled = false } } maven { url = uri("https://artifactory.example.hu/artifactory/maven/") } } } // 对插件管理环节同样禁用外部仓库 settingsEvaluated { pluginManagement { repositories { all { repo -> (repo as? MavenArtifactRepository)?.apply { enabled = false } } maven { url = uri("https://artifactory.example.hu/artifactory/maven/") } } } }
这个脚本会在任何项目构建前执行,彻底锁死所有仓库配置。
5. 验证是否还有外部请求
可以通过Gradle的 debug 日志来确认所有依赖都从内部仓库拉取:
# 执行依赖解析并过滤下载相关日志 ./gradlew dependencies --debug | grep -E "Downloading from|Resolved from"
也可以用抓包工具(如Charles、Wireshark)监控网络请求,确认没有向plugins.gradle.org、repo1.maven.org等外部域名发起请求。
额外注意事项
确保你的内部Artifactory已经正确代理了所有必要的上游仓库(如gradlePluginPortal、mavenCentral、google()),并且所有需要的插件/依赖都已同步到Artifactory中。你已经验证过目标 artifact 存在,这一步应该没问题,但可以检查Artifactory的远程仓库同步状态,避免有遗漏的包。
内容来源于stack exchange

