Protocol buffers protoc命令不生成所有基类(java)

Protocol buffers protoc命令不生成所有基类(java),protocol-buffers,grpc,grpc-java,protobuf-java,Protocol Buffers,Grpc,Grpc Java,Protobuf Java,我一直在尝试从gRPC官方repo的.proto服务定义生成基本的gRPC客户端和服务器接口。 该文件(从上面的链接)中定义的相关服务如下: service RouteGuide { rpc GetFeature(Point) returns (Feature) {} rpc ListFeatures(Rectangle) returns (stream Feature) {} rpc RecordRoute(stream Point) returns (RouteSum

我一直在尝试从gRPC官方repo的
.proto
服务定义生成基本的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站点(具体地说,
routeguiderpc.java
,它包含一个基类
routeguiderpc.RouteGuideImplBase
,其中RouteGuide服务中定义的所有方法都假定是由上面的
protoc
命令生成的,但是这个文件没有为我生成


有没有人面临过类似的问题?官方文件是否完全不正确?有人会对我如何生成缺少的类有什么建议吗?

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

我相信用于gRPC代码生成的java文档不是完全最新的,并且信息分散在不同的官方存储库中

因此,为了按预期生成所有GRPCJava服务基类,您需要为
protoc
cli指定一个额外的标志,就像So
gRPC-java\u out=${OUTPUT\u DIR}
。但是为了让这个额外的标志发挥作用,你需要一些额外的东西:

  • gRPC Java的protoc插件的二进制文件
    protoc gen gRPC Java
    :您可以从maven central(该链接适用于v1.17.1)获得适用于您系统的相关文件。如果您的系统没有预构建的二进制文件,您可以根据github repo指令自己编译一个
  • 确保将二进制位置添加到PATH环境变量中,并将二进制文件重命名为“
    protoc gen grpc java
    ”(即
    protoc
    cli希望在路径中使用的名称)

  • 最后,您已经准备好运行正确的命令
    protoc--java_out=${OUTPUT_DIR}--grpc-java_out=${OUTPUT_DIR}path/to/proto/file
    ,现在像
    routeguidegrc.RouteGuideImplBase
    这样的服务基类应该在以前没有的时候生成


  • 我希望这个解释将来能帮助其他人。

    您也可以使用
    --plugin
    标志,而不是重命名为
    proto-gen grpc-java
    。看见