我在弄清楚如何编译 GRPC Java 服务器时遇到了很多麻烦。我查看了整个 grpc.io 网站,发现最接近的是:http ://www.grpc.io/docs/#quick-start ,我在其中运行
../gradlew -PskipCodegen=true installDist
构建和
./build/install/grpc-examples/bin/hello-world-client
运行客户端。这一切都有效,但仅适用于 hello-world 教程。我不知道如何为我自己的客户端/服务器执行此操作。我可以使用 .proto 文件生成客户端/服务器 protobuf。我查看了他们的自述文件和 Java 教程,但在编写它们https://github.com/grpc/grpc-java/blob/master/examples/README之后,我找不到如何编译实际的服务器(和客户端)
。 MD
(无法链接 java 教程,因为我没有足够的声誉)。除非缺少文档,否则有人知道如何编译实现从 .proto 文件生成的 GRPC 类的服务器和客户端吗?我确实花了相当多的时间搜索。非常感谢任何建议,谢谢。
3 回答
也有类似的问题,请确保:
- 您正确配置了
protoc
,这将下载可执行文件并将其配置为操作系统的环境变量。 该
build.gradle
文件,确保包含protobuf-gradle-plugin:apply plugin: 'java' apply plugin: 'idea' apply plugin: 'com.google.protobuf' ext.grpcVersion = '1.0.1' ext.protobufVersion = '3.0.2' buildscript { repositories { mavenCentral() } dependencies { classpath 'com.google.protobuf:protobuf-gradle-plugin:0.8.0' } } repositories { mavenCentral() } dependencies { compile "com.google.protobuf:protobuf-java:${protobufVersion}" compile "io.grpc:grpc-all:${grpcVersion}" } protobuf { protoc { artifact = "com.google.protobuf:protoc:${protobufVersion}" } plugins { grpc { artifact = "io.grpc:protoc-gen-grpc-java:${grpcVersion}" } } generateProtoTasks { ofSourceSet('main')*.plugins { grpc { } } } } idea { module { sourceDirs += file("${protobuf.generatedFilesBaseDir}/main/java"); sourceDirs += file("${protobuf.generatedFilesBaseDir}/main/grpc"); } }
你的
proto
文件:syntax = "proto3"; package com.company.project; service CompanyService{ rpc call(RequestMessage) returns (ResponseMessage) {} }
运行
gradle clean build
,它应该为CompanyService
.
该idea
插件仅用于告诉 IntelliJ 将其识别src/main/proto
为源集。
要实际执行客户端和服务器,您需要执行 gRpc 教程中提到的实现,然后应用
application
插件,以便正确生成可执行文件jar
//build.grdle code... apply plugin: 'application' mainClassName = 'com.company.project.MainClass' jar { manifest { attributes('Main-Class' : mainClassName) } }
我有一个类似的问题,但通过添加“应用程序”插件在 Gradle 中使用它解决了它。在我使用“java”插件之前,我只能生成一个 jar 文件。切换到“应用程序”插件后,有一个类似于 gRPC 示例的 gradle 任务。
./gradlew installDist
现在要启动你的服务器,你可以运行类似这样的东西:
./build/install/your-project/bin/your-server
要从我的 .proto 文件中实际生成 Java 类,我需要运行“./gradle build”,并且还包括使用 sourceDir 元素生成的源代码,您可以在下面的 build.gradle 中看到。
这是完整的 build.gradle 文件。
apply plugin: 'application'
apply plugin: 'com.google.protobuf'
apply plugin: 'idea'
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath 'com.google.protobuf:protobuf-gradle-plugin:0.7.6'
}
}
repositories {
jcenter()
}
dependencies {
compile 'io.grpc:grpc-all:0.14.0'
}
mainClassName = "com.domain.service.YourMainClass"
protobuf {
protoc {
artifact = "com.google.protobuf:protoc:3.0.0-beta-2"
}
plugins {
grpc {
artifact = 'io.grpc:protoc-gen-grpc-java:0.14.0'
}
}
generateProtoTasks {
all()*.plugins {
grpc {}
}
}
}
idea {
module {
sourceDirs += file("${projectDir}/build/generated/source/proto/main/grpc");
sourceDirs += file("${projectDir}/build/generated/source/proto/main/java");
}
}
我是 gRPC 的新手,因此对我的 Gradle 文件的任何改进都会受到影响。
'Eric Anderson'在 groups.google.com上回答了这个问题:
JAR 中只有您的代码。听起来您想制作一个包含所有依赖项的“胖”罐子。你可以这样做:
jar { from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } } }
请注意,这不是 gRPC 特定的;它只是与 Gradle 一起工作。可能有替代方案,例如快速谷歌搜索返回的 gradle-fatjar-plugin。