我的 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;
}
所以当我进入 src
包 org.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 将该类识别为我的项目中唯一的一个类?
答案 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 也只能看到一个源文件。