我正在尝试为原始消息生成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目录的绝对路径。
答案 0 :(得分:3)
看一下this question,虽然问题不同但答案是一样的。 protobuf导入不像Java导入,但更像是C import / Cobol copy等。一个选项是在使用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