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标志编译所有内容。
我怀疑问题是当您找到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的单个调用。
归档时间: |
|
查看次数: |
3005 次 |
最近记录: |