protocol-buffers - protoc 命令未生成所有基类(java)
问题描述
我一直在尝试从 grpc 官方 repo 的服务定义中生成基本的 gRPC 客户端和服务器接口.proto
。该文件中定义的相关服务(来自上面的链接)如下:
service RouteGuide {
rpc GetFeature(Point) returns (Feature) {}
rpc ListFeatures(Rectangle) returns (stream Feature) {}
rpc RecordRoute(stream Point) returns (RouteSummary) {}
rpc RouteChat(stream RouteNote) returns (stream RouteNote) {}
}
我运行的命令是protoc --java_out=${OUTPUT_DIR} path/to/proto/file
根据 grpc 站点(特别是这里),aRouteGuideGrpc.java
包含一个基类RouteGuideGrpc.RouteGuideImplBase
,RouteGuide 服务中定义的所有方法都应该是从protoc
上面的命令生成的,但该文件没有为我生成。
有没有人遇到过类似的问题?官方文档根本不正确吗?有人对我能做些什么来生成那个缺失的课程有什么建议吗?
解决方案
这可能会在将来对其他人有所帮助,所以我会回答我自己的问题。
我相信用于 gRPC 代码生成的 java 文档并不完全是最新的,并且信息分散在不同的官方存储库中。
事实证明,为了按预期生成所有 gRPC java 服务基类,您需要protoc
像这样为 cli指定一个附加标志grpc-java_out=${OUTPUT_DIR}
。但是为了让那个额外的标志起作用,你需要有一些额外的东西:
- gRPC Java 的 protoc 插件的二进制文件:您可以从此处
protoc-gen-grpc-java
的maven Central 获取适用于您系统的相关文件(链接适用于 v1.17.1)。如果您的系统没有可用的预构建二进制文件,您可以从此处的 github 存储库说明中自己编译一个。 确保将二进制位置添加到您的 PATH 环境变量中,并将二进制重命名为“
protoc-gen-grpc-java
”(即protoc
cli 期望在路径中具有的名称)。最后,您已准备好运行正确的命令,现在应该生成以前没有
protoc --java_out=${OUTPUT_DIR} --grpc-java_out=${OUTPUT_DIR} path/to/proto/file
的服务基类。RouteGuideGrpc.RouteGuideImplBase
我希望这个解释可以帮助其他人在未来。
推荐阅读
- python - Pandas 在单元格中对字符串进行排序
- haskell - 如何解决相同包的不同版本范围的依赖树?
- reactjs - 如何使用 npm run buildf 修复此解析器错误?
- javascript - 如何修复与已发布内容不同的标题?
- c# - => 在属性声明中意味着什么(不是 lambda 表达式)?
- python - 如何在 Django 网站数据库中进行“用户名”加密。?
- python - 如何在 Keras 中查找数组中非零的数量?
- python - 迭代 CSV,使用参数调用 API
- r - 如何计算 R 中的隐含波动率
- ruby - 我需要知道每次我定义一个类时是否有办法执行某些东西