我正在使用Groovy和Kotlin开发一个小项目,而我的Kotlin代码依赖于我的Groovy代码,而不是相反。但是,Kotlin首先编译我的代码而不是Groovy,因此,我得到像Unresolved reference: SiteRepository
我是如何通过更改构建序列或Kotlin明确依赖Groovy或任何其他建议来解决此问题的任何建议?
答案 0 :(得分:24)
可以这样做:
Kotlin First:
//compileKotlin.dependsOn = compileKotlin.taskDependencies.values - 'compileJava'
compileGroovy.dependsOn compileKotlin
compileGroovy.classpath += files(compileKotlin.destinationDir)
classes.dependsOn compileGroovy
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