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;
}
所以当我转到 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 中搜索 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 也只能看到一个源文件。
我的 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 中搜索 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 也只能看到一个源文件。