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

Problem when auto generating gRPC stub files using Gradle

有人要求我为一门大学课程实现一些 gRPC 类,并且在从一个来源生成 java 类 时遇到了一些问题 运行原型文件。

先介绍一些背景知识:这是一个相当基本的服务,有一个简单的方法来接收一个 id 和 returns phone 和一封电子邮件。这是proto文件(BuscarData是FetchData的意思,遗漏的未翻译请见谅!):

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 插件生成 类。我的 build.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. 导入
  3. 如果我没记错的话,生成的源应该生成 DataRepoImpl 的框架,这样我就可以添加 BuscarData 所需的代码。然而,它没有。或者也许我应该创建它,从 DataRepo.java 扩展,但由于问题 n°1,我无法测试它。

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

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

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

谢谢!

弗兰里

对于 1),插件应该将生成的文件作为 java 编译任务的输入,即使您没有在 sourceSets 配置中显式添加 'generated-sources/main/java'。 0.8.8 版本已经有一段时间了,你可以试试更新的版本。可能对您可能遇到的问题进行了一些小修复。

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

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

}