gradle - 如何使用 Gradle 构建 Google Protocol Buffer 和 Kotlin?

标签 gradle kotlin protocol-buffers

我正在尝试使用 Gradle 构建一个同时使用 Google Protocol Buffer 和 Kotlin 的项目。我希望将 proto 文件编译成 Java 源代码,然后从我的 Kotlin 代码中调用它。

我的源文件是这样排列的:

src/main/proto/*.proto
src/main/kotlin/*.kt
src/test/kotlin/*.kt

这是我的 build.gradle 文件:

version '1.0-SNAPSHOT'

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

repositories {
    mavenCentral()
    maven { url "http://dl.bintray.com/kotlin/kotlin-eap-1.1" }
}


buildscript {
    ext.kotlin_version = '1.1-M02'

    repositories {
        mavenCentral()
        maven { url "http://dl.bintray.com/kotlin/kotlin-eap-1.1" }
    }

    dependencies {
        classpath 'com.google.protobuf:protobuf-gradle-plugin:0.8.0'
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
    }
}

protobuf {
    protoc {
        artifact = 'com.google.protobuf:protoc:3.0.0'
    }
}

dependencies {
    compile 'com.google.protobuf:protobuf-java:3.0.0'
    compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
    testCompile 'junit:junit:4.12'
}

当我运行 ./gradlew assemble 时,我在 :compileKotlin 期间收到一堆“ Unresolved 引用”错误。之后我可以看到没有生成 Java 源文件,所以似乎根本没有调用 proto 编译器。

如果我删除 apply plugin: 'kotlin' 行,那么 ./gradlew assemble 会成功生成 Java 源代码,但我的 Kotlin 源代码当然不会被编译。

如何修复我的 build.gradle 以便可以从 Kotlin 调用我的 protobuf 代码?

最佳答案

要让 protobuf-gradle-pluginkotlin-gradle-plugin 协同工作,需要确保在调用 Kotlin 之前(重新)生成 Java 代码编译器。

对于 Gradle 的默认源集 maintest,您可以这样做:

compileKotlin.dependsOn ':generateProto'
compileTestKotlin.dependsOn ':generateTestProto'

如果您使用其他源集,则需要进行调整。

旧版本的 protobuf-gradle-plugin 也需要更新 sourceSets,但新版本似乎不需要这个。

// Don't do this with protobuf-gradle-plugin 0.9.0 or higher
sourceSets.main.java.srcDirs += "${protobuf.generatedFilesBaseDir}/main/java"
sourceSets.test.java.srcDirs += "${protobuf.generatedFilesBaseDir}/test/java"

关于gradle - 如何使用 Gradle 构建 Google Protocol Buffer 和 Kotlin?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40499452/

相关文章:

protocol-buffers - 如何在没有太多重复的情况下使用 gRPC 服务创建 CRUD?

java - 使用 JNI 将 GPB 序列化数据从 Java 高效传递到 C++

java - 在 IntelliJ 中使用 Gradle 导入 Protobuf 生成的类

groovy - Gradle 同步任务,同步到文件夹但忽略目标中的指定目录

regex - 正则表达式的 Kotlin 性能问题

java - 覆盖 gradle 中的 Spring Starter Version 版本

loops - Kotlin 中 `break` 中的 `continue` 和 `forEach`

android - Huawei Android AppUpdateClient - 如何测试

spring-boot - IntelliJ 无法识别 Kotlin JPA 插件

android - 如何为不同的 gradle buildTypes 提供不同的 Android 应用图标?