编译GRPC服务器/客户端

时间:2015-10-27 19:03:20

标签: java compilation rpc grpc

我在搞清楚如何编译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文件生成客户端/服务器protobufs。我查看了他们的自述文件和Java教程,在编写实际的服务器(和客户端)之后无法找到它们的编译方式。 https://github.com/grpc/grpc-java/blob/master/examples/README.md (无法链接java教程,因为我没有足够的声誉)。除非我的文档丢失,否则有没有人知道如何编译实现从.proto文件生成的GRPC类的服务器和客户端?我确实花了很多时间搜索。非常感谢任何建议,谢谢。

3 个答案:

答案 0 :(得分:6)

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

  1. 您正确配置了protocdownloading the executable并将其配置为操作系统的环境变量。
  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生成服务和客户端类。

  5. idea插件,用于告知IntelliJ将src/main/proto识别为源集。

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

      jar

答案 1 :(得分:0)

Eric Anderson已经回答了on groups.google.com这个问题'

  

JAR只包含您的代码。听起来你想做一个"胖"包含所有依赖项的jar。你可以这样做:

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

请注意,这不是特定于gRPC的;它只是与Gradle合作。可能有其他选择,例如快速谷歌搜索返回gradle-fatjar-plugin。

答案 2 :(得分:0)

我有一个类似的问题,但通过添加'应用程序'插件在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文件的任何改进都会被批准。