【问题标题】:Compiling GRPC server/client编译 GRPC 服务器/客户端
【发布时间】:2016-01-27 08:45:18
【问题描述】:

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

【问题讨论】:

    标签: java compilation rpc grpc


    【解决方案1】:

    此问题已由“Eric Anderson”on groups.google.com 回答:

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

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

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

    【讨论】:

    • 我已编辑您的答案,以引用您链接到的 Google 网上论坛的答案。这样,您的答案就可以防止链接失效,并且不会被删除为 link-only answer
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      也有类似问题,请确保:

      1. 您正确配置了protoc,即downloading 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生成服务和客户端类。

      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) } }
        

      【讨论】:

        猜你喜欢
        • 2020-09-09
        • 1970-01-01
        • 2018-04-12
        • 2021-04-10
        • 1970-01-01
        • 2020-10-18
        • 1970-01-01
        • 1970-01-01
        • 2016-10-04
        相关资源
        最近更新 更多