【问题标题】:gRPC not generating interface for a service, only a service classgRPC 不为服务生成接口,仅生成服务类
【发布时间】:2016-09-19 07:55:42
【问题描述】:

我是 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>

【问题讨论】:

  • 我没有完整的答案,但请注意,“存根”(服务接口)是由与其他代码分开的 protoc 插件生成的。看起来您在 maven 文件中命名了 grpc 插件,但您可能想调查它是否由于某种原因没有被调用。

标签: java grpc protocol-buffers


【解决方案1】:

从插件开发者那里得到答案。

第一件事:目标应该是:

编译 编译自定义

2d and main thing: 在两个目标之间重用,因此其内容被重写。去掉这个参数解决了这个问题。


【讨论】:

  • 感谢您的回答并解决了浪费我 3 多个小时时间的问题。将compile-custom添加到执行目标后,最终生成了服务存根。
【解决方案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>

使用上述方法似乎对我有用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-06-07
    • 2021-07-31
    • 2020-03-23
    • 2016-10-12
    • 2021-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多