SBT发布构件到ivy/远程仓库报Undefined resolver错误如何解决
问题根因
你的配置存在两个核心问题导致发布失败:
- 你在
publishTo中声明的snapshots、releases两个远程仓库,没有加入全局resolvers列表,sbt找不到对应的resolver配置就会抛出Undefined resolver 'snapshots'错误。 - 你的配置仅对顶级项目的
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
相关产品推荐
相关产品推荐

