我正在尝试为原型(prototype)消息生成 Java 代码,该消息引用了更深层包中的另一条消息。生成类时,protoc
失败并显示以下消息:
"<message_name> is not defined."
在哪里<message_name>
是更深层包中引用消息的名称。为简单起见,我制作了以下测试目录结构:
prototest
- protos
- outer.proto
- inner
- inner.proto
- output
在哪里inner.proto
是:
package protos.inner;
option java_package = "com.package.name.protos.inner";
option java_outer_classname = "InnerProto";
message Inner {
optional string msg = 1;
}
和outer.proto
是:
package protos;
option java_package = "com.package.name.protos";
option java_outer_classname = "OuterProto";
import "protos/inner/inner.proto";
message Outer {
optional Inner inner = 1;
}
这样Outer
消息引用了 Inner
信息。反向操作似乎工作正常(从 Outer
消息中引用 Inner
),但我无法弄清楚为什么另一个方向不起作用。
我用来生成 outer.proto
的命令是:
protoc \
--proto_path=$PROTOTEST \
--java_out=$PROTOTEST/output \
$PROTOTEST/protos/outer.proto
在哪里$PROTOTEST
是prototest目录的绝对路径。
最佳答案
看看this question ,虽然问题不同,但答案是一样的。 protobuf 导入不像 Java 导入,更像是 C 导入/Cobol 复制等。一种选择是在使用 Inner 时包含包层次结构。
尝试改变
optional Inner inner = 1;
到
optional protos.inner.Inner inner = 1;
您可能知道您需要编译这两个消息
protoc --proto_path=$PROTOTEST --java_out=$PROTOTEST/output $PROTOTEST/protos/outer.proto
protoc --proto_path=$PROTOTEST --java_out=$PROTOTEST/output $PROTOTEST/protos/inner/inner.proto
关于java - 无法导入内包中的 Protobuf 消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27516535/