使用 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) 的插件,以及将生成的文件存放在哪里。
但是,有两个问题:
- 生成的源未标记为源或类似的东西,这意味着它们不能从其他 类
导入
- 如果我没记错的话,生成的源应该生成 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')
}
有人要求我为一门大学课程实现一些 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) 的插件,以及将生成的文件存放在哪里。 但是,有两个问题:
- 生成的源未标记为源或类似的东西,这意味着它们不能从其他 类 导入
- 如果我没记错的话,生成的源应该生成 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')
}