在 ScalaPB 中使用 Protocol Buffers 生成 Java 和 Scala 类
Generate both Java and Scala classes using Protocol Buffers in ScalaPB
我一直在使用 sbt-protobuf to generate Java classes from proto definition files. I now want to generate Scala classes as well. To do that, I try to use the ScalaPB 插件。目标是在项目中有一个 src/main/protobuf/
目录,并根据这些定义生成 Java 和 Scala 类。
问题是,当我在项目中添加 ScalaPB 依赖项时,它会停止生成 Java 类(它只会生成 Scala 案例 类)。
事实上,尝试修改任何传统的 sbt-protobuf 设置,总是会导致此(或类似的)错误消息:
build.sbt:YYY: error: reference to protocOptions is ambiguous;
it is imported twice in the same scope by
import _root_.sbtprotobuf.ProtobufPlugin._
and import _root_.com.trueaccord.scalapb.ScalaPbPlugin._
protocOptions in SPB.protobufConfig ++= Seq(..)
我不确定这两个问题是否相关。想法是更改 protocOptions
以强制生成 Java 类。
这里有两件事要做:
- 将
PB.javaConversions in PB.protobufConfig := true
设置为真
- 确保对项目进行
clean
。如果文件已经存在,ScalaPB 将不会重新生成 class 个文件。如果您希望进行新配置,请确保清除以前的协议缓冲区。
这是一个示例 (build.sbt) 项目,它将生成 Java 和 Scala classes(使用 SBT 0.13.5):
import com.trueaccord.scalapb.{ScalaPbPlugin => PB}
name := "proto-buf-test"
scalaVersion := "2.10.5"
autoCompilerPlugins in Global := true
lazy val root = project.in(file(".")).settings(PB.protobufSettings:_*).settings(
PB.javaConversions in PB.protobufConfig := true
)
这是调用 "sbt compile" 之前构建结构的样子:
├── build.sbt
├── project
│ ├── build.properties
│ └── plugin.sbt
└── src
└── main
├── protobuf
│ └── types.proto
└── scala
└── com
└── yyyyy
└── test
└── Test.scala
根据 scalapb readme,您应该将 PB.gens.java
添加为 build.sbt 中的目标,如下所示:
PB.targets in Compile := Seq(
PB.gens.java -> (sourceManaged in Compile).value,
scalapb.gen(javaConversions = true) -> (sourceManaged in Compile).value
)
我一直在使用 sbt-protobuf to generate Java classes from proto definition files. I now want to generate Scala classes as well. To do that, I try to use the ScalaPB 插件。目标是在项目中有一个 src/main/protobuf/
目录,并根据这些定义生成 Java 和 Scala 类。
问题是,当我在项目中添加 ScalaPB 依赖项时,它会停止生成 Java 类(它只会生成 Scala 案例 类)。
事实上,尝试修改任何传统的 sbt-protobuf 设置,总是会导致此(或类似的)错误消息:
build.sbt:YYY: error: reference to protocOptions is ambiguous;
it is imported twice in the same scope by
import _root_.sbtprotobuf.ProtobufPlugin._
and import _root_.com.trueaccord.scalapb.ScalaPbPlugin._
protocOptions in SPB.protobufConfig ++= Seq(..)
我不确定这两个问题是否相关。想法是更改 protocOptions
以强制生成 Java 类。
这里有两件事要做:
- 将
PB.javaConversions in PB.protobufConfig := true
设置为真 - 确保对项目进行
clean
。如果文件已经存在,ScalaPB 将不会重新生成 class 个文件。如果您希望进行新配置,请确保清除以前的协议缓冲区。
这是一个示例 (build.sbt) 项目,它将生成 Java 和 Scala classes(使用 SBT 0.13.5):
import com.trueaccord.scalapb.{ScalaPbPlugin => PB}
name := "proto-buf-test"
scalaVersion := "2.10.5"
autoCompilerPlugins in Global := true
lazy val root = project.in(file(".")).settings(PB.protobufSettings:_*).settings(
PB.javaConversions in PB.protobufConfig := true
)
这是调用 "sbt compile" 之前构建结构的样子:
├── build.sbt
├── project
│ ├── build.properties
│ └── plugin.sbt
└── src
└── main
├── protobuf
│ └── types.proto
└── scala
└── com
└── yyyyy
└── test
└── Test.scala
根据 scalapb readme,您应该将 PB.gens.java
添加为 build.sbt 中的目标,如下所示:
PB.targets in Compile := Seq(
PB.gens.java -> (sourceManaged in Compile).value,
scalapb.gen(javaConversions = true) -> (sourceManaged in Compile).value
)