我试图将一个protocol buffer消息导入到另一个中,但是导入无法识别。只要我不尝试将一个protobuf导入到另一个中,就会生成protobuf代码(在java中),代码会按预期编译和运行。
我正在使用:
- Intellij创意2020 v1.3无限版
- Protobuf编辑器插件:jvolkman/智能协议缓冲区编辑器(2020年4月)
- grad尔
我的Gradle构建文件如下所示:
plugins {
id 'java'
id 'com.google.protobuf' version "0.8.8"
}
group 'tech.tablesaw'
version '1.0-SNAPSHOT'
sourceCompatibility = 9.0
def grpcVersion = '1.30.1' // CURRENT_GRPC_VERSION
def protobufVersion = '3.12.0'
def protocVersion = protobufVersion
repositories {
mavenCentral()
}
test {
useJUnitPlatform()
}
dependencies {
implementation "io.grpc:grpc-protobuf:${grpcVersion}"
implementation "io.grpc:grpc-stub:${grpcVersion}"
compileOnly "org.apache.tomcat:annotations-api:6.0.53"
// advanced - need this for JsonFormat
implementation "com.google.protobuf:protobuf-java-util:${protobufVersion}"
runtimeOnly "io.grpc:grpc-netty-shaded:${grpcVersion}"
testImplementation "io.grpc:grpc-testing:${grpcVersion}"
compile group: 'tech.tablesaw', name: 'tablesaw-core', version: '0.38.1'
testCompile group: 'org.junit.jupiter', name: 'junit-jupiter-engine', version: '5.6.2'
testImplementation "org.mockito:mockito-core:2.28.2"
}
protobuf {
protoc { artifact = "com.google.protobuf:protoc:${protocVersion}" }
plugins {
grpc { artifact = "io.grpc:protoc-gen-grpc-java:${grpcVersion}" }
}
generateProtoTasks {
all()*.plugins { grpc {} }
}
}
// Inform IDEs like IntelliJ IDEA, Eclipse or NetBeans about the generated code.
sourceSets {
main {
java {
srcDirs 'build/generated/source/proto/main/grpc'
srcDirs 'build/generated/source/proto/main/java'
}
}
}
task TablesawServer(type: CreateStartScripts) {
mainClassName = 'tech.tablesaw.service.TableServiceServer'
applicationName = 'tablesaw-table-server'
outputDir = new File(project.buildDir, 'tmp')
}
task TablesawClient(type: CreateStartScripts) {
mainClassName = 'tech.tablesaw.service.TableServiceClient'
applicationName = 'tablesaw-table-client'
outputDir = new File(project.buildDir, 'tmp')
}
我的成绩信息是这样的
------------------------------------------------------------
Gradle 5.1.1
------------------------------------------------------------
Build time: 2019-01-10 23:05:02 UTC
Revision: 3c9abb645fb83932c44e8610642393ad62116807
Kotlin DSL: 1.1.1
Kotlin: 1.3.11
Groovy: 2.5.4
Ant: Apache Ant(TM) version 1.9.13 compiled on July 10 2018
JVM: 9.0.4 (Oracle Corporation 9.0.4+11)
OS: Mac OS X 10.13.5 x86_64
下面是protobuf的一个示例。column_type. proto的导入失败。
syntax = "proto3";
package tech.tablesaw.service.common;
import "tech/tablesaw/service/common/column_type.proto";
option java_multiple_files = true;
option java_package = "tech.tablesaw.service.common";
option java_outer_classname = "ColumnMetaProto";
option objc_class_prefix = "TSW";
// Proto file describing column metadata message.
// A column metadata object
message ColumnMetadata {
string name = 1;
int32 size = 2;
ColumnTypeEnum.ColumnType column_type = 3;
}
这里是我试图导入的文件:
syntax = "proto3";
package tech.tablesaw.service.common;
option java_multiple_files = true;
option java_package = "tech.tablesaw.service.common";
option java_outer_classname = "ColumnTypeEnum";
option objc_class_prefix = "TSW";
enum ColumnType {
SHORT = 0;
INTEGER = 1;
LONG = 2;
FLOAT = 3;
BOOLEAN = 4;
STRING = 5;
DOUBLE = 6;
LOCAL_DATE = 7;
LOCAL_TIME = 8;
LOCAL_DATE_TIME = 9;
INSTANT = 10;
TEXT = 11;
SKIP = 12;
}
最后,这里是protobufs在文件系统中的位置。
src > main > java
> proto > tech > tablesaw > service > common > column_metadata.proto
> column_type.proto
6条答案
按热度按时间ztigrdn81#
请参阅自述文件,其中介绍了如何添加其他路径。
默认情况下,
intellij-protobuf-editor
使用项目配置的源根目录作为protobuf导入路径。如果这不正确,您可以在Settings > Languages & Frameworks > Protocol Buffers
中覆盖这些路径。取消选中“自动配置”并添加您需要的路径。在您的情况下,您可以添加.../src/main/java/proto
(其中...
表示项目的基本路径)。k2fxgqgv2#
在另一个问题的评论中有这个问题的答案:Error using import in .proto file
如果你正在使用IntelliJ IDEA,请转到Preferences -〉Protobuf Support并添加.proto文件的路径,这样就可以解决这个错误。
在Intellij的一个更现代的版本中,这是在插件intellij-protobuf-editor中完成的,我添加了proto源文件夹的根目录路径,一切都很顺利
jc3wubiy3#
想描述一下是什么帮助了我,因为我在这里没有找到答案。我的步骤是为Maven,但我认为这将是几乎相同的Gradle。
1.检查您是否有此插件
1.检查
build
部分中是否包含此扩展名1.运行此maven目标
ee7vknir4#
如果你使用的是protobuf-gradle-plugin,你需要应用
idea
插件。应用之后,一切都像一个魅力。从他们的自述文件yi0zb3m45#
我正在使用GoLand,但IntelliJ的设置应该相同:
禁用
configure automatically
添加项目正在使用的所有路径。
uklbhaso6#
这有时是由于在作为maven依赖项添加到项目中的proto文件中使用了导入项造成的。
要解决这个问题,您可以在maven构建中包含一个步骤,从库中解压缩proto文件(这里我使用
proto-google-common-protos
作为示例),并将它们添加到IntelliJ“自动检测”的位置。