gradle 的 Protobuf 插件不生成服务类

mog*_*uil 5 java protocol-buffers gradle grpc-java protobuf-java

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

我按照以下说明操作:https : //github.com/grpc/grpc-java/blob/master/README.md

问题是没有生成一个文件: *ServiceGrpc.java 但是对应的*ServiceGrpc.class文件在gradle build生成的build目录下。

我尝试使用命令 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); }
//...
Run Code Online (Sandbox Code Playgroud)

文件 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'
}
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么 ?

voi*_*zcy 1

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

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 {}
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

另外,需要指出的是,generatedFileBaseDir不鼓励进行配置,因为它可能存在潜在问题。请参阅https://github.com/google/protobuf-gradle-plugin/issues/332的讨论