无法导入内包中的Protobuf消息

时间:2014-12-17 00:37:50

标签: java protocol-buffers

我正在尝试为原始消息生成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目录的绝对路径。

1 个答案:

答案 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