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

SBT发布构件到ivy/远程仓库报Undefined resolver错误如何解决

问题根因

你的配置存在两个核心问题导致发布失败:

  1. 你在publishTo中声明的snapshots、releases两个远程仓库,没有加入全局resolvers列表,sbt找不到对应的resolver配置就会抛出Undefined resolver 'snapshots'错误。
  2. 你的配置仅对顶级项目的publishLocal做了自定义,没有覆盖多模块下各子模块的默认发布逻辑,执行publishLocal时会触发子模块默认的publish任务,调用未注册的resolver导致报错。

修复方案

1. 把发布用仓库加入resolvers列表

修改你的resolvers配置,将publishTo中定义的仓库加入到可识别的resolver列表中,同时给配置添加ThisBuild作用域让所有子模块继承配置:

ThisBuild / resolvers := Seq(
  // Google Mirror of Maven Central, placed first so that it's used instead of flaky Maven Central.
  "gcs-maven-central-mirror" at "https://maven-central.storage-download.googleapis.com/maven2/",
  DefaultMavenRepository,
  Resolver.mavenLocal,
  Resolver.file("ivyLocal", file(Path.userHome.absolutePath + "/.ivy2/local"))(Resolver.ivyStylePatterns)
) ++ publishTo.value.toSeq,
ThisBuild / externalResolvers := resolvers.value,
ThisBuild / otherResolvers := SbtPomKeys.mvnLocalRepository(dotM2 => Seq(Resolver.file("dotM2", dotM2))).value,

2. 统一配置子模块的发布任务

如果你仅需要publishLocal推送到本地ivy和maven仓库,不需要触发远程发布,直接全局禁用默认的publish任务:

ThisBuild / publish / skip := true

如果你需要保留publish推送到远程仓库的能力,补充publish任务的配置即可:

ThisBuild / publishConfiguration := PublishConfiguration()
    .withResolverName(if (isSnapshot.value) "snapshots" else "releases")
    .withArtifacts(packagedArtifacts.value.toVector)
    .withLogging(ivyLoggingLevel.value),
ThisBuild / publish := publishTask(publishConfiguration).value,

3. 其他配置补充

原有publishLocal相关的配置也加上ThisBuild作用域,保证所有子模块都使用你自定义的本地发布逻辑:

ThisBuild / publishLocalConfiguration in MavenCompile := PublishConfiguration()
    .withResolverName("dotM2")
    .withArtifacts(packagedArtifacts.value.toVector)
    .withLogging(ivyLoggingLevel.value),
ThisBuild / publishLocalConfiguration in SbtCompile := PublishConfiguration()
    .withResolverName("ivyLocal")
    .withArtifacts(packagedArtifacts.value.toVector)
    .withLogging(ivyLoggingLevel.value),
ThisBuild / publishMavenStyle in MavenCompile := true,
ThisBuild / publishMavenStyle in SbtCompile := false,
ThisBuild / publishLocal in MavenCompile := publishTask(publishLocalConfiguration in MavenCompile).value,
ThisBuild / publishLocal in SbtCompile := publishTask(publishLocalConfiguration in SbtCompile).value,
ThisBuild / publishLocal := Seq(publishLocal in MavenCompile, publishLocal in SbtCompile).dependOn.value,
ThisBuild / publishTo := {
  val nexus = "http://maven.baidu-int.com/nexus/content/repositories/"
  if (isSnapshot.value)
    Some("snapshots" at nexus + "Baidu_Local_Snapshots")
  else
    Some("releases"  at nexus + "Baidu_Local")
},

修改完成后重新执行publishLocal或publish任务即可正常运行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 02:45:03