协议缓冲区无效的嵌入式描述符问题

Jos*_*man 2 java protocol-buffers

我在运行某些生成的协议缓冲区类时遇到一些问题。

我的项目布局如下:

模块/
  protobuf-api /
    原型/
      com / foo / api / Service.proto
      com / foo / shared / Shared.proto
      org / bar / api / Message1.proto
      org / bar / api / Message2.proto

Service.proto文件取决于Shared.proto和某些Message * .proto文件。在protobuf-api目录中,我运行以下命令进行编译:
find . -name *.proto -exec protoc --java_out=java -I=proto {} \;

当我尝试运行我的服务时,出现以下异常:

java.lang.ExceptionInInitializerError
    在com.linkedin.history.api.protobuf.HistoryServiceProtos $ HistoryServiceQuery。(HistoryServiceProtos.java:544)
    在com.linkedin.history.api.serializer.HistoryServiceSerializer.serialize(HistoryServiceSerializer.java:47)
     在test.history.serializer.TestSerializer.testHistoryServiceQuery(TestSerializer.java:38)
    在test.fwk.util.core.BaseTestSuiteCore.run(BaseTestSuiteCore.java:304)
     在test.fwk.util.core.BaseTestSuiteConf.run(BaseTestSuiteConf.java:186)
    在test.fwk.lispring.BaseTestSuite.run(BaseTestSuite.java:232)
    在test.fwk.lispring.BaseTestSuite.callAppropriateRun(BaseTestSuite.java:265)
    在test.fwk.util.core.BaseTestSuiteCore.run(BaseTestSuiteCore.java:199)
原因:java.lang.IllegalArgumentException:“ com / linkedin / history / api / protobuf / HistoryService.proto”的无效嵌入式描述符。
     在com.google.protobuf.Descriptors $ FileDescriptor.internalBuildGeneratedFileFrom(Descriptors.java:268)
     在com.linkedin.history.api.protobuf.HistoryServiceProtos。(HistoryServiceProtos.java:1794)
引起原因:com.google.protobuf.Descriptors $ DescriptorValidationException:com / linkedin / history / api / protobuf / HistoryService.proto:传递给FileDescriptor.buildFrom()的依赖项与FileDescriptorProto中列出的依赖项不匹配。
     在com.google.protobuf.Descriptors $ FileDescriptor.buildFrom(Descriptors.java:221)
     在com.google.protobuf.Descriptors $ FileDescriptor.internalBuildGeneratedFileFrom(Descriptors.java:266)

我在这里阅读了这篇文章但我认为我做的一切正确。关于为何出现初始化错误的任何建议?我正在使用相同的-I标志编译所有内容。

Jon*_*eet 5

怀疑问题是当您找到proto文件时,您已为其提供了完整路径,例如proto / com / foo / api / Service.proto,但是当它通过包含目录引用它时,它正在使用com / foo / api / Service.proto

简单修复-从proto目录运行此命令:

find . -name *.proto -exec protoc --java_out=../java -I=. {} \;
Run Code Online (Sandbox Code Playgroud)

我必须承认,我不记得很多细节protoc(我确实应该这样做),但是我怀疑这是可行的。

另一种方法,其可以工作:

protoc --java_out=java `find . -name '*.proto'`
Run Code Online (Sandbox Code Playgroud)

即,将所有原始文件传递给对protoc的单个调用。