protoc命令未生成所有基类(java)

时间:2018-12-30 09:49:30

标签: protocol-buffers grpc grpc-java protobuf-java

我一直在尝试从grpc官方存储库中的.proto服务定义here生成基本的gRPC客户端和服务器接口。 该文件中定义的相关服务(来自上面的链接)如下:

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站点(特别是here),应该包含一个基本类RouteGuideGrpc.java的{​​{1}}和RouteGuide服务中定义的所有方法是通过上面的RouteGuideGrpc.RouteGuideImplBase命令生成的,但该文件并未为我生成。

有人遇到过类似的问题吗?官方文档是否完全不正确?有人会建议我如何生成缺少的类吗?

1 个答案:

答案 0 :(得分:3)

这可能会在将来对其他人有所帮助,所以我将回答自己的问题。

我相信用于gRPC代码生成的Java文档尚未完全更新,并且该信息分散在不同的官方存储库中。

因此,为了按预期生成所有gRPC java服务基类,您需要像protoc那样为grpc-java_out=${OUTPUT_DIR} cli指定一个附加标志。但是,为了使该附加标志起作用,您需要做一些其他事情:

  1. 用于gRPC Java protoc-gen-grpc-java的protoc插件的二进制文件:您可以从maven Central here中获得与系统相关的插件(该链接适用于v1.17.1)。如果您的系统没有可用的预编译二进制文件,则可以根据github存储库指令here自己编译。
  2. 确保将二进制位置添加到您的PATH环境变量中,并且将二进制准确地重命名为“ protoc-gen-grpc-java”(即protoc cli期望在路径中使用的名称) )。

  3. 最后,您准备好运行正确的命令protoc --java_out=${OUTPUT_DIR} --grpc-java_out=${OUTPUT_DIR} path/to/proto/file,现在应该在以前不生成的情况下生成诸如RouteGuideGrpc.RouteGuideImplBase之类的服务基类。

我希望这种解释将来对其他人有帮助。