编译Groovy和Kotlin?

时间:2016-03-25 05:16:53

标签: gradle groovy kotlin

我正在使用Groovy和Kotlin开发一个小项目,而我的Kotlin代码依赖于我的Groovy代码,而不是相反。但是,Kotlin首先编译我的代码而不是Groovy,因此,我得到像Unresolved reference: SiteRepository

这样的错误

我是如何通过更改构建序列或Kotlin明确依赖Groovy或任何其他建议来解决此问题的任何建议?

4 个答案:

答案 0 :(得分:24)

可以这样做:

4.10之后

Kotlin First:

//compileKotlin.dependsOn = compileKotlin.taskDependencies.values - 'compileJava'
compileGroovy.dependsOn compileKotlin
compileGroovy.classpath += files(compileKotlin.destinationDir)
classes.dependsOn compileGroovy

4.10之前

Groovy First:

compileGroovy.dependsOn = compileGroovy.taskDependencies.values - 'compileJava'
compileKotlin.dependsOn compileGroovy
compileKotlin.classpath += files(compileGroovy.destinationDir)
classes.dependsOn compileKotlin

Kotlin First:

compileKotlin.dependsOn = compileKotlin.taskDependencies.values - 'compileJava'
compileGroovy.dependsOn compileKotlin
compileGroovy.classpath += files(compileKotlin.destinationDir)
classes.dependsOn compileGroovy

要明确的是,你可以选择你的Kotlin代码是否依赖于Kotlin上的Groovy或Groovy,但你不能双管齐下。

答案 1 :(得分:7)

我认为在一个模块中针对Groovy编译Kotlin是不可能的,但是你可以将Groovy(或Kotlin)移到单独的模块中。 Groovy将在jar中编译,而Kotlin现在可以依赖于Groovy代码。为了帮助你,我在github上编写了简单的项目和publish it

更新1:

我使用kotlin和groovy创建新模块和项目,并检查任务依赖项:

./gradlew -m kotlin-groovy:build
:kotlin-groovy:compileKotlin SKIPPED
:kotlin-groovy:compileJava SKIPPED
:kotlin-groovy:compileGroovy SKIPPED
:kotlin-groovy:processResources SKIPPED
:kotlin-groovy:classes SKIPPED
:kotlin-groovy:jar SKIPPED
:kotlin-groovy:assemble SKIPPED
:kotlin-groovy:compileTestKotlin SKIPPED
:kotlin-groovy:compileTestJava SKIPPED
:kotlin-groovy:compileTestGroovy SKIPPED
:kotlin-groovy:processTestResources SKIPPED
:kotlin-groovy:testClasses SKIPPED
:kotlin-groovy:test SKIPPED
:kotlin-groovy:check SKIPPED
:kotlin-groovy:build SKIPPED

BUILD SUCCESSFUL

Total time: 2.587 secs

看起来像kotlin和groovy任务的改变顺序就足够了。但是,如果我们以这种方式改变步骤:

./gradlew -m kotlin-groovy:build
:kotlin-groovy:compileGroovy SKIPPED
:kotlin-groovy:compileKotlin SKIPPED
:kotlin-groovy:compileJava SKIPPED
:kotlin-groovy:processResources SKIPPED
:kotlin-groovy:classes SKIPPED
:kotlin-groovy:jar SKIPPED
:kotlin-groovy:assemble SKIPPED
:kotlin-groovy:compileTestKotlin SKIPPED
:kotlin-groovy:compileTestJava SKIPPED
:kotlin-groovy:compileTestGroovy SKIPPED
:kotlin-groovy:processTestResources SKIPPED
:kotlin-groovy:testClasses SKIPPED
:kotlin-groovy:test SKIPPED
:kotlin-groovy:check SKIPPED
:kotlin-groovy:build SKIPPED

BUILD SUCCESSFUL

Total time: 2.745 secs

Build仍然不起作用,因为Kotlin没有看到Groovy。

答案 2 :(得分:0)

如果要从Kotlin调用Groovy,对于 5.2.1级

compileGroovy.dependsOn.remove('compileJava')
compileKotlin.dependsOn compileGroovy
compileKotlin.classpath += files(compileGroovy.destinationDir)

答案 3 :(得分:0)

当Gradle 6.1发布时,以上建议的解决方案将不起作用。您可以使用一种新方法来解决原始问题。

tasks.named('compileGroovy') {
    // Groovy only needs the declared dependencies
    // and not the output of compileJava
    classpath = sourceSets.main.compileClasspath
}
tasks.named('compileKotlin') {
    // Kotlin also depends on the result of Groovy compilation 
    // which automatically makes it depend of compileGroovy
    classpath += files(sourceSets.main.groovy.classesDirectory)
}

https://docs.gradle.org/6.1-rc-1/release-notes.html#compilation-order