IntelliJ 不识别 Scala 项目中的 protobuf 吗?

Does IntelliJ not recognize protobuf in a Scala project?

我的 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:stagesbt docker:publishLocal没有问题。

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

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

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

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

我可以通过在 build.sbt 上添加这一行来解决这个问题:

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

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

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 也只能看到一个源文件。