进口;google/protobuf/descriptor.proto“;在java协议缓冲区中

进口;google/protobuf/descriptor.proto“;在java协议缓冲区中,java,protocol-buffers,Java,Protocol Buffers,我有一个.proto文件定义,需要导入“google/protobuf/descriptor.proto”,因为我使用了 因此,在我的.proto文件中,我执行以下操作: import "google/protobuf/descriptor.proto"; package ...; ... 因为我的文件没有编译,抱怨依赖性,所以我得到了descriptor.proto文件的副本,将它放在与proto文件相同的目录中 这解决了问题,但我认为这不是正确的方法。现在,descr

我有一个
.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
    文件一起提供的一个
  • 与我的
    .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
protoc addressbookSD.proto--java\u out=./--proto\u path=./--proto\u path=\src
其中是协议缓冲区安装目录。 关键点是descriptor.proto在

<protobuf-install-directory>\src\google\protobuf
\src\google\protobuf
protobuf导入语句中的级别必须与文件系统中的目录匹配,就像在java中一样

所以我使用\src作为导入目录,目录结构必须是

<protobuf-install-directory>\src
    +-- google
         +-- protobuf
             +-- descriptor.proto
\src
+--谷歌
+--protobuf
+--原始描述符

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

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

    ...
}

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

您的protoc无法在系统的默认include文件夹中找到文件

apt install protobuf编译器未将其放在包含文件夹中

如果在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

此外,在Unix上,descriptor.proto通常安装到
/usr/include/google/protobuf/descriptor.proto
/usr/local/include/google/protobuf/descriptor.proto
,因此在Unix上将
/usr/include
/usr/local/include
添加到
--proto\u路径中。