当前位置: 首页 > 知识库问答 >
问题:

使用Gradle自动生成gRPC存根文件时的问题

董喜
2023-03-14

我被要求为一门大学课程实现一些gRPC类,在从一个源proto文件生成java类时遇到了一些问题。

首先是一些背景知识:这是一项相当基本的服务,有一个简单的方法,可以接收id并返回电话和电子邮件。这是原始文件(BuscarData表示获取数据,很抱歉没有翻译完!):

syntax = 'proto3';
option java_multiple_files=true;
option java_generic_services= true;
package  uy.edu.um.sd20;

message DataRequest {
  int32 id = 1;
}

message DataResponse {
  string phone = 1;
  string email = 2;
}

service DataRepo {
  rpc BuscarData (DataRequest) returns (DataResponse);
}

我的想法是用gradle插件生成类。我的身材。格拉德尔:

plugins {
    id 'java'
    id "com.google.protobuf" version '0.8.8'
}
apply plugin: 'java'

group 'org.example'
version '1.0-SNAPSHOT'

repositories {
    mavenCentral()
}

dependencies {
    testCompile group: 'junit', name: 'junit', version: '4.12'
    compile group: 'com.google.protobuf', name: 'protobuf-java', version: '3.11.4'
    implementation 'io.grpc:grpc-netty-shaded:1.29.0'
    implementation 'io.grpc:grpc-protobuf:1.29.0'
    implementation 'io.grpc:grpc-stub:1.29.0'

}

sourceSets {
    main {
        proto {
            srcDir 'src/main/proto'
        }
        java {
            srcDirs 'src/main/java', 'generated-sources/main/java'
        }
    }
}

protobuf {
    protoc {
        artifact = 'com.google.protobuf:protoc:3.11.0'
    }
    plugins {
        grpc {
            artifact = 'io.grpc:protoc-gen-grpc-java:1.29.0'
        }
    }
    generateProtoTasks.generatedFilesBaseDir = 'generated-sources'

    generateProtoTasks {
        all().each { task ->
            // Here you can configure the task
        }
        ofSourceSet('main')

    }
}

据我所知,一切都在那里:grpc和protoc依赖项,以及使protoc能够编译grpc的插件(protoc gen grpc),以及将生成的文件存放在哪里。然而,有两个问题:

  1. 生成的源没有标记为源或类似的东西,这意味着它们不能从其他类导入
  2. 如果我没有弄错的话,生成的源代码应该生成DataRepoImpl的框架,以便我可以添加BuscarData所需的代码。然而,它没有。或者我应该创建它,从DataRepo扩展而来。java,但由于问题1,我无法测试它

我添加了项目文件结构的截图:img

正如您所看到的,相当多(如果不是全部的话)gradle设置是从许多不同的网站复制粘贴和清除的。我希望我足够小心,不要重复任何进口产品。也有类似的问题,我在那里尝试了解决方案,但没有运气。有一个例子,我知道我必须包括gen grpc插件:另一个SO问题

欢迎提供任何有关其他内容的提示!我对stackoverflow问题的提问是新手,所以我可能在问题的特殊性或问题的目的方面犯了错误。

谢谢

弗兰丽。

共有1个答案

濮佑运
2023-03-14

对于1),插件应将生成的文件作为java编译任务的输入,即使您没有在源集配置中明确添加“generated-sources/main/java”。版本0.8.8已经有一段时间了,您可以尝试使用较新的版本。对于您可能遇到的问题,可能有一些小的修复。

对于2),您没有将grpc插件添加到每个GenerateProto任务。应该是

generateProtoTasks {
    all().each { task ->
        task.plugins { grpc{} }
    }
    ofSourceSet('main')

}
 类似资料:
  • 我设法通过.proto文件生成了类,但它们在构建中。 我希望在main中生成类,因为当我要扩展存根时,不可能实现这些方法。 瞧: 文件.proto: proto文件在主文件夹中。 有人知道怎么解决吗?

  • 我添加了maven配置,如下所示。 我正在通过“mvn proc-jar: run”执行它,但是它跳过了grpc服务存根,只将“消息”转换为java代码。 输出为 我有一个简单的proto文件定义为 我只输出生成为HelloReply、HelloReplyOrBuilder、HelloRequest、HelloRequestOrBuilder、HelloWorldProto的文件。缺少迎宾Grpc

  • Spring RestDocs可用于为具有Spring MockMvc或RestEasy的HTTP API生成文档(例如,asciidoctor格式)。在生成API文档的同时,还可以使用Spring Cloud Contract WireMock生成WireMock存根。只需编写正常的RestDocs测试用例,并使用@AutoConfigureRestDocs在restdocs输出目录中自动存储存

  • 正如问题所说,我从源代码编译了grpc,也做了,但是,grpc_python_plugin的

  • 与之相反:从Swagger/OpenAPI生成Spring MVC控制器 我需要将我的Spring Boot项目与远程服务器集成,以公开Swagger OpenAPI。我可以成功下载《狂妄自大》。jsondescriptor,但我希望在为许多Java方法生成REST存根方面获得一些自动帮助。我用的是Gradle。我更喜欢大摇大摆地做到我的项目中,既可以脱机构建(远程服务不公开),又可以利用Grad

  • 我使用proto编译器3.4.0版编译了GNMI proto文件。我的proto文件如下所示:https://github.com/openconfig/gnmi/blob/master/proto/gnmi/gnmi.proto 我生成GRPC存根使用 并使用了此处推荐的pom文件,如下所示: 现在我正在尝试订阅如下所示的服务: 想知道我错过了什么。我正在使用客户端和证书连接到服务,但无法解决上