如何配置sbt让内部Artifactory依赖从内部仓库拉取而非外部源
解决内网环境下sbt依赖指向内部Artifactory的问题
咱们一步步来排查和配置,确保sbt完全走内部仓库,不再尝试访问外部源:
1. 确认~/.sbt/repositories配置的正确性
首先检查你的repositories文件格式是否规范,要明确指向内部Artifactory的仓库,同时避免引入外部默认仓库。示例配置如下:
[repositories] local # 内部Ivy仓库(适配sbt类库) my-internal-ivy: https://your-artifactory-domain/artifactory/ivy-local/, [organization]/[module]/(scala_[scalaVersion]/)(sbt_[sbtVersion]/)[revision]/[type]s/[artifact](-[classifier]).[ext] # 内部Maven仓库(适配普通Java/Scala类库) my-internal-maven: https://your-artifactory-domain/artifactory/maven-local/
⚠️ 注意:如果你的内网完全无法访问外网,必须确保get-coursier的所有间接依赖都已经被同事上传到内部Artifactory,否则sbt会因找不到依赖报错。
2. 全局禁用sbt默认外部仓库
光配置repositories可能不够,sbt有时会默认加载Maven Central等外部仓库。你可以在~/.sbt/1.0/global.sbt(对应sbt 1.x版本)中添加全局配置,强制所有项目使用内部仓库:
// 定义内部仓库列表 ThisBuild / resolvers := Seq( "Internal Ivy Repository" at "https://your-artifactory-domain/artifactory/ivy-local/", "Internal Maven Repository" at "https://your-artifactory-domain/artifactory/maven-local/" ) // 移除默认远程仓库,禁用Maven Central ThisBuild / resolvers -= Resolver.defaultLocal ThisBuild / externalResolvers := Resolver.withDefaultResolvers(resolvers.value, mavenCentral = false)
如果只想针对单个项目生效,把这段代码复制到项目根目录的build.sbt即可。
3. 配置coursier的仓库(sbt默认依赖解析工具)
现在sbt默认用coursier做依赖解析,所以需要同步配置coursier的仓库规则。在~/.coursier/config.json中添加:
{ "repositories": [ { "name": "internal-maven", "url": "https://your-artifactory-domain/artifactory/maven-local/" }, { "name": "internal-ivy", "url": "https://your-artifactory-domain/artifactory/ivy-local/", "type": "ivy" } ], "disable": ["MavenCentral", "SonatypeReleases", "SonatypeSnapshots"] }
这样coursier就只会从你指定的内部仓库拉取依赖了。
4. 验证配置是否生效
运行sbt时添加调试参数,查看依赖解析的具体路径:
sbt -Dcoursier.debug=true compile
在输出日志里,你应该能看到所有依赖请求都指向内部Artifactory地址。如果仍有外部源请求,就检查对应的依赖是否未上传到内部仓库,或者配置中是否遗漏了仓库规则。
另外,也可以用sbt dependencyTree命令查看依赖的来源,确认所有依赖都来自内部Artifactory。
额外注意点
- 如果Artifactory需要认证,在
~/.sbt/repositories中添加认证信息:[repositories] local my-internal-maven: https://your-artifactory-domain/artifactory/maven-local/, [authentication] [authentication] my-internal-maven: credentials { username = "你的用户名" password = "你的密码" } - 检查是否有环境变量覆盖配置:比如
SBT_OPTS中是否设置了-Dsbt.repository.config指向其他文件?如果有,改成指向你的~/.sbt/repositories。
内容的提问来源于stack exchange,提问作者vandekerkoff
相关产品推荐
相关产品推荐

