【问题标题】:gRPC generated java files are getting duplicated or regenerated : class ClassNameGrpc is public and should be declared in a file named ClassNameGrpcgRPC 生成的 java 文件被重复或重新生成:类 ClassNameGrpc 是公共的,应在名为 ClassNameGrpc 的文件中声明
【发布时间】:2021-01-30 17:06:12
【问题描述】:

我创建了一个包含 2 个模块的 gradle java 项目:

  1. grpc 客户端模块
  2. grpc 服务器模块

当我构建它们时,出于某种原因,grpc 和 protobuf 文件不止一次生成。第二个文件生成后缀为“2”,因此引发错误,如下面的屏幕截图所示。

gradle 文件如下,客户端和服务器端相同。

apply plugin: 'java'
apply plugin: 'com.google.protobuf'

repositories {
mavenCentral()
}

def grpcVersion = '1.24.1'

dependencies {
compile "io.grpc:grpc-netty:${grpcVersion}"
compile "io.grpc:grpc-protobuf:${grpcVersion}"
compile "io.grpc:grpc-stub:${grpcVersion}"
compile 'com.google.protobuf:protobuf-java:3.9.2'
}

buildscript {
repositories {
    mavenCentral()
}
dependencies {

    classpath 'com.google.protobuf:protobuf-gradle-plugin:0.8.10'
}
}

protobuf {
protoc {
    artifact = 'com.google.protobuf:protoc:3.9.2'
}
plugins {
    grpc {
        artifact = "io.grpc:protoc-gen-grpc-java:${grpcVersion}"
    }
}
generateProtoTasks {
    all()*.plugins {
        grpc {}
    }
}
}


sourceSets {
main {
    java {
        srcDirs 'build/generated/source/proto/main/grpc'
        srcDirs 'build/generated/source/proto/main/java'
    }
}
}

jar {
manifest {
    attributes "Main-Class": "ecommerce.ecommerce.OrderMgtServer"
}
from {
    configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }
}
}

// Generate IntelliJ IDEA's .idea & .iml project files
apply plugin: 'idea'

// Provide convenience executables for trying out the examples.
apply plugin: 'application'

startScripts.enabled = false

【问题讨论】:

  • 是否有可能因为 Gradle 构建输出和 IDE 构建输出而获得重复的类?如果是这种情况,您可以将 IDE 构建操作委托给 gradle 吗?

标签: build.gradle grpc-java


【解决方案1】:

仅使用一个sourceSets {main { java·在build.gradle处添加了java插件和您版本的protobuf插件。

plugins {
    id 'java'
    id 'com.google.protobuf' version '0.8.10'
    id 'idea'
}
dependencies {
    implementation "io.grpc:grpc-netty-shaded:$grpc_version"
    implementation "io.grpc:grpc-protobuf:$grpc_version"
    implementation "io.grpc:grpc-stub:$grpc_version"
    implementation "io.grpc:grpc-services:$grpc_version" // reflection
}
sourceSets.main.java.srcDir new File(buildDir, 'generated/source')
idea {
    module {
        // Marks the already(!) added srcDir as "generated"
        generatedSourceDirs += file('build/generated/source')
    }
}

编辑build.gradle 后,执行task -> cleantask -> generateProtobuff。我认为你可以用它来解决你的错误。关于dependencies.compile 我不确定它是否会影响。但我使用的是dependencies.implementation

【讨论】:

  • 2 个 srcDirs 用于 1. Protobuf 消息 2. gRPC 服务调用。在grpc中,模型构建器java类和服务都需要生成。
  • 这很奇怪。我还在没有这个的 protobuf 消息的不同目录中创建我的服务。我还在 protobuf 文件上使用了option cc_generic_services = true;,并添加了implementation "io.grpc:grpc-services:$grpc_version" 以反映build.gradle
猜你喜欢
  • 2015-08-31
  • 2014-10-17
  • 2017-10-02
  • 2014-10-24
  • 2019-04-03
  • 2020-04-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多