我正在尝试使用 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-plugin
和 kotlin-gradle-plugin
协同工作,需要确保在调用 Kotlin 之前(重新)生成 Java 代码编译器。
对于 Gradle 的默认源集 main
和 test
,您可以这样做:
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/