在java协议缓冲区中导入“google / protobuf / descriptor.proto”

我有一个.proto文件定义,需要导入"google/protobuf/descriptor.proto"因为我使用自定义选项 。

所以在我的.proto文件中我做了:

 import "google/protobuf/descriptor.proto"; package ...; ... 

由于我的文件没有编译抱怨依赖,我得到了descriptor.proto文件的副本,将它放在我的proto文件所在的目录中。

这解决了问题,但我不相信这是正确的方法。 现在, descriptor.proto与我的.proto文件一起编译,导致在运行时有2个编译的descriptor.proto

  • protobuf-java-2.5.0.jar文件一起提供的protobuf-java-2.5.0.jar
  • 与我的.proto文件一起编译的.proto

我认为应该以某种方式使用--proto-path选项,但不完全确定什么是正确的方法。

感谢您的最佳实践提示!

当我在.proto中使用了描述符时,我就像使用它一样

 import "google/protobuf/descriptor.proto"; message AddressBook { required google.protobuf.FileDescriptorSet proto_files = 1; 

然后在默认目录中使用addressbookSD.proto生成java(在Windows上):

 protoc addressbookSD.proto --java_out=./ --proto_path=./ --proto_path=\src 

其中< protobuf-install-directory >是协议缓冲区安装目录。 关键点是descriptor.proto在

 \src\google\protobuf 

protobuf导入阶段中的级别必须与文件系统中的目录匹配,就像在java中一样。

所以我使用< protobuf-install-directory> \ src作为导入目录,目录结构必须是

 \src +-- google +-- protobuf +-- descriptor.proto