Scala Play! REST API项目集成Protocol Buffer失败求助
问题
在Scala Play! REST API项目中配置Protocol Buffer后编译失败,当前配置如下:
build.sbt 代码
scalaVersion := "2.13.10" dependencyOverrides += "org.scala-lang.modules" %% "scala-java8-compat" % "1.0.0" libraryDependencies ++= Seq( guice, "org.scalatestplus.play" %% "scalatestplus-play" % "5.0.0" % Test, "mysql" % "mysql-connector-java" % "8.0.26", "io.getquill" %% "quill-jasync-mysql" % "4.6.0", "com.thesamet.scalapb" %% "scalapb-runtime" % "0.11.11" )
project/scalapb.sbt 代码
addSbtPlugin("com.thesamet" % "sbt-protoc" % "1.0.3")
编译错误信息
[error] stack trace is suppressed; run last protocExecutable for the full output [error] (protocExecutable) lmcoursier.internal.shaded.coursier.error.FetchError$DownloadingArtifacts: Error fetching artifacts: [error] https://repo1.maven.org/maven2/com/google/protobuf/protoc/3.15.6/protoc-3.15.6-osx-aarch_64.exe: not found: https://repo1.maven.org/maven2/com/google/protobuf/protoc/3.15.6/protoc-3.15.6-osx-aarch_64.exe [error] Total time: 0 s, completed 4 Apr 2023, 14:26:17
已尝试清理、更新、重载项目及重启,问题仍未解决。
解决方法
这个错误的核心原因是:sbt-protoc默认拉取的protoc 3.15.6版本没有适配Apple Silicon(osx-aarch_64)的二进制包,还错误地尝试下载Windows平台的.exe格式文件。修复步骤如下:
- 指定兼容的protoc版本
在build.sbt中添加配置,选用支持Apple Silicon的protoc版本(3.21.12及以上版本均提供对应二进制包):
PB.protocVersion := "3.21.12"
- 完善插件依赖
在project/scalapb.sbt中补充scalapb的编译插件依赖,否则无法生成Scala代码:
addSbtPlugin("com.thesamet" % "sbt-protoc" % "1.0.3") libraryDependencies += "com.thesamet.scalapb" %% "compilerplugin" % "0.11.11"
- 配置代码生成规则
在build.sbt中添加代码生成目标,指定protobuf文件编译后的Scala代码输出路径:
PB.targets in Compile := Seq( scalapb.gen() -> (sourceManaged in Compile).value / "scalapb" )
- 清理并重新编译
执行sbt命令清理缓存后重新编译:
sbt clean compile
另外,确保项目的protobuf文件放在src/main/protobuf目录下,这是scalapb默认的扫描路径。
内容的提问来源于stack exchange,提问作者KKarpac
相关产品推荐
相关产品推荐

