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

如何用SBT将Scala本地项目发布到本地仓库(类Maven install)

问题:SBT本地仓库发布依赖解决方法

我正在通过《Learning Akka》学习Akka,使用SBT作为包管理器时遇到了问题。我编写了一个基于SBT的键值型NoSQL内存数据库服务端项目,其build.sbt配置如下:

name := "akkademy-db-scala"

organization := "com.akkademy-db"

version := "0.0.1-SNAPSHOT"

scalaVersion := "2.11.12"

libraryDependencies ++= Seq(
  "com.typesafe.akka" %% "akka-agent" % "2.3.6",
  "com.typesafe.akka" %% "akka-actor" % "2.3.6",
  "com.typesafe.akka" %% "akka-remote" % "2.3.6",
  "com.typesafe.akka" %% "akka-testkit" % "2.3.6" % "test",
  "org.scalatest" %% "scalatest" % "2.1.6" % "test"
)

mappings in (Compile, packageBin) ~= { _.filterNot { case (_, name) =>
  Seq("application.conf").contains(name)
}}

随后我编写了一个依赖该服务端的数据库客户端项目,其build.sbt配置如下:

name := """akkademy-db-client-scala"""

version := "1.0"

scalaVersion := "2.11.12"

// Change this to another test framework if you prefer
libraryDependencies ++= Seq(
  "com.akkademy-db"   %% "akkademy-db-scala" % "0.0.1-SNAPSHOT",
  "org.scalatest" %% "scalatest" % "2.2.4" % "test"
)

但将客户端项目导入IDEA时出现依赖找不到的错误:

[error] stack trace is suppressed; run 'last update' for the full output
[error] stack trace is suppressed; run 'last ssExtractDependencies' for the full output
[error] (update) sbt.librarymanagement.ResolveException: Error downloading com.akkademy-db:akkademy-db-scala_2.11:0.0.1-SNAPSHOT
[error]   Not found
[error]   Not found
[error]   not found: C:\Users\yxmak\.ivy2\localcom.akkademy-db\akkademy-db-scala_2.11\0.0.1-SNAPSHOT\ivys\ivy.xml
[error]   not found: https://repo1.maven.org/maven2/com/akkademy-db/akkademy-db-scala_2.11/0.0.1-SNAPSHOT/akkademy-db-scala_2.11-0.0.1-SNAPSHOT.pom
[error] (ssExtractDependencies) sbt.librarymanagement.ResolveException: Error downloading com.akkademy-db:akkademy-db-scala_2.11:0.0.1-SNAPSHOT
[error]   Not found
[error]   Not found
[error]   not found: C:\Users\yxmak\.ivy2\localcom.akkademy-db\akkademy-db-scala_2.11\0.0.1-SNAPSHOT\ivys\ivy.xml
[error]   not found: https://repo1.maven.org/maven2/com/akkademy-db/akkademy-db-scala_2.11/0.0.1-SNAPSHOT/akkademy-db-scala_2.11-0.0.1-SNAPSHOT.pom

看起来SBT无法在本地仓库中找到被依赖的项目,请问如何用SBT将Scala项目上传到本地仓库?就像Maven中的maven install命令那样,让其他项目可以引用已安装的jar包。


解决方法

1. 发布到本地Ivy仓库(SBT默认)

在服务端项目的根目录下,执行以下命令:

sbt publishLocal

该命令会将项目编译产物(jar包、Ivy描述文件等)发布到本地Ivy仓库,默认路径为~/.ivy2/local/,与你错误信息中查找的路径一致。执行完成后,重新刷新客户端项目的SBT依赖,即可找到该服务端包。

2. 发布到本地Maven仓库(兼容Maven生态)

如果需要以Maven兼容的格式发布到本地Maven仓库(默认路径~/.m2/repository/),需先在服务端项目的project/plugins.sbt中添加Maven发布插件:

addSbtPlugin("com.github.sbt" % "sbt-maven-plugin" % "0.15.0")

然后在服务端项目根目录执行:

sbt publishM2

发布完成后,客户端项目即可从本地Maven仓库拉取依赖。

关键注意点

  • 确保服务端项目的organization、name、version与客户端依赖坐标完全匹配(你的配置中两者是一致的,无需调整)。
  • 发布前建议先执行sbt clean compile,确保项目编译无错误,避免发布无效包。
  • 若使用SNAPSHOT版本,每次修改服务端代码后需重新执行发布命令,客户端才能获取最新版本。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 01:15:07