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

时间:2013-11-19 10:42:35

标签: java protocol-buffers

我有一个.proto文件定义需要导入"google/protobuf/descriptor.proto",因为我使用了Custom Options

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

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

...

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

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

  • protobuf-java-2.5.0.jar文件附带的文件
  • 与我的.proto文件
  • 一起编译的那个

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

感谢您提供最佳实践提示!

3 个答案:

答案 0 :(得分:6)

当我在.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=<protobuf-install-directory>\src

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

<protobuf-install-directory>\src\google\protobuf

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

所以我使用&lt; protobuf-install-directory&gt; \ src 作为导入目录,目录结构必须是

<protobuf-install-directory>\src
    +-- google
         +-- protobuf
             +-- descriptor.proto

答案 1 :(得分:0)

仅作记录:最近我遇到了同样的问题,就我而言,我的项目取决于protobuf-lite。显然,protobuf需要自定义扩展的“完整” protobuf,因此我不得不添加依赖项,如下所示:

dependencies {
    protobuf "io.grpc:grpc-protobuf:${grpcVersion}"

    ...
}

请注意,我在项目中依赖gRPC,但这也可以与com.google.protobuf一起使用。

答案 2 :(得分:0)

您的协议无法在系统的默认包含文件夹中找到文件

https://github.com/golang/protobuf/issues/694

apt install protobuf-compiler不会将其放在包含文件夹中

如果您在Linux计算机中遇到错误,请使用此

google / protobuf / descriptor.proto:找不到文件。

google / protobuf / duration.proto:找不到文件。

google / protobuf / timestamp.proto:找不到文件。

在Linux系统上正确安装

PROTOC_ZIP=protoc-3.7.1-linux-x86_64.zip
curl -OL https://github.com/protocolbuffers/protobuf/releases/download/v3.7.1/$PROTOC_ZIP
sudo unzip -o $PROTOC_ZIP -d /usr/local bin/protoc
sudo unzip -o $PROTOC_ZIP -d /usr/local 'include/*'
rm -f $PROTOC_ZIP