用于gradle的Protobuf插件不会生成服务类

时间:2019-08-28 15:46:15

标签: java gradle protocol-buffers grpc-java protobuf-java

我尝试使用Gradle在Java中构建gRPC和protobuf应用程序

我遵循了来自https://github.com/grpc/grpc-java/blob/master/README.md

的指示

问题是未生成一个文件:* ServiceGrpc.java 但是相应的* ServiceGrpc.class文件位于gradle构建生成的构建目录中。

我尝试使用协议protoc手动运行编译器,但是存在完全相同的问题(我在Ubuntu 18.04上)

这是我的原始文件

syntax = "proto3";

option java_multiple_files=true; 
option java_generic_services= true;
//...//
message Track { 
    int64 id = 1; //... }
service TrackService { 
    rpc Create(Track) returns (Response); }
//...

文件Track.java,TrackOrBuilder.java,TrackOuterClass.java都在那里。以及它们在构建目录中的相应.class文件。

使用标志“ option java_generic_services = true”,将生成TrackService.java,并再次生成.class文件。

但是无论如何,都不会创建TrackServiceGrpc.java文件,相反,它对应的.class文件非常混乱。

这是我的build.gradle:

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath 'com.google.protobuf:protobuf-gradle-plugin:0.8.8'
    }
}
plugins {
    id 'java'
}
repositories {
    mavenCentral()
}
apply plugin: 'com.google.protobuf'

protobuf {
    protoc {
        artifact = "com.google.protobuf:protoc:3.9.0"
        generateProtoTasks.generatedFilesBaseDir = 'src'
    }
    plugins {
        grpc {
            artifact = 'io.grpc:protoc-gen-grpc-java:1.23.0'
        }
    }

    generateProtoTasks {
        all()*.plugins {
            grpc {}
        }
    }
}

dependencies {
    testCompile group: 'junit', name: 'junit', version: '4.12'
    //https://github.com/grpc/grpc-java/blob/master/README.md
    implementation 'io.grpc:grpc-netty-shaded:1.23.0'
    implementation 'io.grpc:grpc-protobuf:1.23.0'
    implementation 'io.grpc:grpc-stub:1.23.0'
    compile group: 'javax.annotation', name: 'javax.annotation-api', version: '1.3.2'
}

我在做什么错了?

1 个答案:

答案 0 :(得分:0)

如果存在用于gRPC服务的.class文件,则相应的.java文件必须位于某个位置。默认情况下,它应显示在$generatedFilesBaseDir/{main, test}/grpc中。默认情况下,$generatedFilesBaseDir$buildDir/generated/source/proto。但是似乎您已经更改(或打算更改)generatedFilesBaseDir,该配置应在protobuf闭包内而不是protoc闭包内完成。

protobuf {
    protoc {
        artifact = "com.google.protobuf:protoc:3.9.0"
    }
    plugins {
        grpc {
            artifact = 'io.grpc:protoc-gen-grpc-java:1.23.0'
        }
    }
    generatedFilesBaseDir = 'src'
    generateProtoTasks {
        all()*.plugins {
            grpc {}
        }
    }
}

此外,需要提及的是不建议配置generatedFileBaseDir,因为它可能存在潜在的问题。请参见https://github.com/google/protobuf-gradle-plugin/issues/332

上的讨论