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 次 |
| 最近记录: |