IntelliJ 无法识别 Scala 项目中的 protobuf 吗?

时间:2021-01-07 14:28:30

标签: scala intellij-idea sbt protocol-buffers

我的 Scala 项目中有一个 protobuf 文件 src/main/protobuf/datamodel.proto。我正在使用安装在我的 ubuntu 机器上的 protoc 编译器生成 java 文件。

cd src/
protoc --java_out=main/java main/protobuf/datamodel.proto

datamodel.proto:

syntax = "proto3";
package org.github.felipegutierrez.explore.akka.classic.remote.serialization;
option java_package = "org.github.felipegutierrez.explore.akka.classic.remote.serialization";
option java_outer_classname = "Datamodel";
message OnlineStoreUser {
  int32 userId = 1;
  string userName = 2;
  string userEmail = 4;
  string userPhone = 5;
}
message ProtobufVote {
  string ssn = 1;
  string candidate = 2;
}

所以当我进入 srcorg.github.felipegutierrez.explore.akka.classic.remote.serialization 时,相应的文件就在那里。然后我决定使用 sbt-protobuf 插件。基本上我在 plugins.sbt 文件中添加了:

addSbtPlugin("com.github.gseitz" % "sbt-protobuf" % "0.6.5")

并在 build.sbt 文件上:

enablePlugins(JavaAppPackaging, ProtobufPlugin)
sourceDirectories in ProtobufConfig += (protobufExternalIncludePath in ProtobufConfig).value
unmanagedResourceDirectories in Compile += (sourceDirectory in ProtobufConfig).value
libraryDependencies ++= Seq(
  ...
  "com.google.protobuf" % "protobuf-java"  % "3.14.0",
  "com.google.protobuf" % "protoc" % "3.14.0" pomOnly(),
)

当我在项目的根目录上运行 sbt protobuf:protobufGenerate 时,会创建相应的 java 文件。没关系,我可以编译,使用 sbt docker:stage, sbt docker:publishLocal 没有问题。

错误:但是当我点击我的 IntelliJ IDEA Build > Rebuild project 时,我收到了错误:

Datamodel is already defined as class Datamodel
public final class Datamodel {

我想这与 IntelliJ + sbt + protobuf 配置有关。当我在 IntelliJ 中搜索类 Datamodel 时,我在目标目录 src_managed 下只找到了一个,这是 sbt protobuf:protobufGenerate 生成它的地方。

有谁知道我可以在哪里正确配置它并使 IntelliJ 将该类识别为我的项目中唯一的一个类?

1 个答案:

答案 0 :(得分:0)

通过在 build.sbt 上添加这一行,我能够解决这个问题:

javaSource in ProtobufConfig := ((sourceDirectory in Compile).value / "generated")

并从 option java_package 文件中删除 datamodel.proto 行:

syntax = "proto3";
package org.github.felipegutierrez.explore.akka.classic.remote.serialization;
option java_outer_classname = "Datamodel";
// commented this line because we are using "sbt-protobuf" plugin to generate java file on the specific location
// option java_package = "org.github.felipegutierrez.explore.akka.classic.remote.serialization";
message OnlineStoreUser {
  int32 userId = 1;
  string userName = 2;
  string userEmail = 4;
  string userPhone = 5;
}

现在命令 sbt protobuf:protobufGenerate 生成一个源文件,IntelliJ 也只能看到一个源文件。