gRPC 不为服务生成接口,只为服务类生成接口

2022-09-04 22:31:13

我是gRPC的新手,并且有这个问题:我用rpc服务定义创建了一个.proto。编译后,我得到生成的源:所有消息都有一个实现接口的类。但是,服务本身不会实现任何接口 - 它只是不生成。这就是我应该在服务器中实现的接口。我做错了什么?我很确定gRPC文档对这个问题没有任何说明。

我的 .proto 服务:

syntax = "proto3";
option java_multiple_files = true;
option java_package = "com.blah.my.rpc.api";
option java_outer_classname = "MyServiceProto";
option objc_class_prefix = "Pb";

package com.blah.my.rpc.api;

service MyService
{
  rpc connect(PbEmptyMessage) returns (PbParameterGroup){}

  rpc getParams(PbGenList) returns (PbParameterGroup){}

}

message PbEmptyMessage
{
}

message PbGenId
{
      string paramName = 1;
      string systemName = 2;
      string sName = 3;
      string sId = 4;
}

message PbParameterGroup
{
       bytes sParameters = 2;
       fixed64 time  = 3;
}

我在 maven 中的插件定义:

<extensions>
            <extension>
                <groupId>kr.motd.maven</groupId>
                <artifactId>os-maven-plugin</artifactId>
                <version>1.4.0.Final</version>
            </extension>
        </extensions>

        <plugins>
            <plugin>
                <groupId>org.xolstice.maven.plugins</groupId>
                <artifactId>protobuf-maven-plugin</artifactId>
                <version>0.5.0</version>
                <configuration>
                    <protocArtifact>com.google.protobuf:protoc:3.0.0-beta-2:exe:${os.detected.classifier}
                    </protocArtifact>
                    <pluginId>grpc-java</pluginId>
                    <pluginArtifact>io.grpc:protoc-gen-grpc-java:0.14.0:exe:${os.detected.classifier}</pluginArtifact>
                    <protoSourceRoot>${basedir}/src/main/resources</protoSourceRoot>
                    <outputDirectory>${basedir}/target/generated-sources</outputDirectory>
                </configuration>
                <executions>
                    <execution>
                        <phase>generate-sources</phase>
                        <goals>
                            <goal>compile</goal>
                            <goal>test-compile</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

答案 1

从插件开发人员那里得到了答案。

第一件事:目标应该是:

<goal>compile</goal>
<goal>compile-custom</goal>

2d和主要的东西:在两个目标之间重用,因此其内容被重写。删除此参数解决了问题。<outputDirectory>


答案 2

有同样的问题,@Alexandra的答案让我朝着正确的方向前进。

outputDirectory是需要删除的参数。GRPC生成的代码位于不同的包中,但是如果您指定参数,则内容将被覆盖。outputDirectory

我还发现我需要在我的 maven 文件中指定一个显式路径。也就是说,我不是那个构建系统的专家。protoc

        <plugin>
            <groupId>org.xolstice.maven.plugins</groupId>
            <artifactId>protobuf-maven-plugin</artifactId>
            <version>0.5.1</version>
            <extensions>true</extensions>
            <configuration>
                <protocExecutable>/usr/local/bin/protoc</protocExecutable>
                <pluginId>grpc-java</pluginId>
            </configuration>

            <executions>
                <execution>
                    <goals>
                        <goal>compile</goal>
                        <goal>compile-custom</goal>
                        <goal>test-compile</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>

使用上述内容似乎对我有用。


推荐