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



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

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

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

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

这解决了问题,但我认为这不是正确的方法。现在descriptor.proto和我的.proto文件一起编译,结果在运行时有两个编译的descriptor.proto

  • protobuf-java-2.5.0.jar文件附带的
  • 与我的.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=<protobuf-install-directory>src

其中<protobuf安装目录>是协议缓冲区安装目录。关键是描述符。oto在中

<protobuf-install-directory>srcgoogleprotobuf

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

所以我使用<protobuf安装目录>\src作为导入目录,目录结构必须为

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

记录一下:我最近遇到了同样的问题,在我的情况下,我的项目依赖于protobuf-lite。显然,protobuf需要自定义扩展的"完整"protobuf,因此我必须添加依赖项,如下所示:

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

请注意,我在项目中依赖gRPC,但这也适用于com.google.protobuf

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

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

apt-installprotobuf编译器没有将其放入包含文件夹

如果你有像在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

最新更新