4

我在弄清楚如何编译 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 类的服务器和客户端吗?我确实花了相当多的时间搜索。非常感谢任何建议,谢谢。

4

3 回答 3

6

也有类似的问题,请确保:

  1. 您正确配置了protoc,这将下载可执行文件并将其配置为操作系统的环境变量。
  2. 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");
    }
    }
    
  3. 你的proto文件:

    syntax = "proto3";
    package com.company.project;
    
    service CompanyService{
        rpc call(RequestMessage) returns (ResponseMessage) {}
    }
    
  4. 运行gradle clean build,它应该为CompanyService.

idea插件仅用于告诉 IntelliJ 将其识别src/main/proto为源集。

  1. 要实际执行客户端和服务器,您需要执行 gRpc 教程中提到的实现,然后应用application插件,以便正确生成可执行文件jar

    //build.grdle code...
    apply plugin: 'application'
    mainClassName = 'com.company.project.MainClass'
    jar { manifest { attributes('Main-Class' : mainClassName) } }
    
于 2016-09-27T22:07:59.290 回答
1

我有一个类似的问题,但通过添加“应用程序”插件在 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 文件的任何改进都会受到影响。

于 2016-05-03T07:04:12.793 回答
0

'Eric Anderson'在 groups.google.com上回答了这个问题:

JAR 中只有您的代码。听起来您想制作一个包含所有依赖项的“胖”罐子。你可以这样做:

jar {
      from {
          configurations.compile.collect {
              it.isDirectory() ? it : zipTree(it)
        }
    }
}

请注意,这不是 gRPC 特定的;它只是与 Gradle 一起工作。可能有替代方案,例如快速谷歌搜索返回的 gradle-fatjar-plugin。

于 2015-11-03T23:38:21.133 回答