如何用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
相关产品推荐
相关产品推荐

