java - 无法导入内包中的 Protobuf 消息

标签 java protocol-buffers

我正在尝试为原型(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/

相关文章:

json - JSON RPC 与 HTTP2 与 grpc 有什么区别?

go - Twirp 不适用于原型(prototype)

python - Python 中用于 Protobuf 的原始包装器

java - 在 Java 中访问 xml 文件并更新它

java - hibernate CascadeType中的问题

java - 将 XML 数据追加到 ArrayList

java - C# 和 Java 之间通过 protobuf-net 进行序列化/解封

go - 错误 "protoc-gen-go: program not found or is not executable"

java - 值得在 selenium 中使用文件属性吗?

java - DataSnapshot 的 getValue 方法返回了我的类的 null 实例,而它不应该返回。向我的类添加字段会破坏我的代码