Gradle 编译Groovy和Kotlin?

Gradle 编译Groovy和Kotlin?,gradle,groovy,kotlin,Gradle,Groovy,Kotlin,我正在使用Groovy和Kotlin进行一个小项目,我的Kotlin代码依赖于Groovy代码,而不是相反。但是,Kotlin首先编译我的代码,而不是Groovy,因此,我会出现类似未解析引用:SiteRepository 有什么建议我可以通过改变构建序列,或者根据Groovy显式地修改Kotlin,或者其他任何建议来解决这个问题吗?我认为在一个模块中针对Groovy编译Kotlin是不可能的,但是您可以在单独的模块中移动Groovy(或Kotlin)。Groovy将在jar中编译,Kotlin

我正在使用Groovy和Kotlin进行一个小项目,我的Kotlin代码依赖于Groovy代码,而不是相反。但是,Kotlin首先编译我的代码,而不是Groovy,因此,我会出现类似
未解析引用:SiteRepository


有什么建议我可以通过改变构建序列,或者根据Groovy显式地修改Kotlin,或者其他任何建议来解决这个问题吗?

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

upd 1:

//compileKotlin.dependsOn = compileKotlin.taskDependencies.values - 'compileJava'
compileGroovy.dependsOn compileKotlin
compileGroovy.classpath += files(compileKotlin.destinationDir)
classes.dependsOn compileGroovy
compileGroovy.dependsOn = compileGroovy.taskDependencies.values - 'compileJava'
compileKotlin.dependsOn compileGroovy
compileKotlin.classpath += files(compileGroovy.destinationDir)
classes.dependsOn compileKotlin
compileKotlin.dependsOn = compileKotlin.taskDependencies.values - 'compileJava'
compileGroovy.dependsOn compileKotlin
compileGroovy.classpath += files(compileKotlin.destinationDir)
classes.dependsOn compileGroovy
我使用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

构建仍然不起作用,因为Kotlin没有看到Groovy

可以这样做:

4点10分以后 科特林优先:

//compileKotlin.dependsOn = compileKotlin.taskDependencies.values - 'compileJava'
compileGroovy.dependsOn compileKotlin
compileGroovy.classpath += files(compileKotlin.destinationDir)
classes.dependsOn compileGroovy
compileGroovy.dependsOn = compileGroovy.taskDependencies.values - 'compileJava'
compileKotlin.dependsOn compileGroovy
compileKotlin.classpath += files(compileGroovy.destinationDir)
classes.dependsOn compileKotlin
compileKotlin.dependsOn = compileKotlin.taskDependencies.values - 'compileJava'
compileGroovy.dependsOn compileKotlin
compileGroovy.classpath += files(compileKotlin.destinationDir)
classes.dependsOn compileGroovy
4.10之前 Groovy优先:

//compileKotlin.dependsOn = compileKotlin.taskDependencies.values - 'compileJava'
compileGroovy.dependsOn compileKotlin
compileGroovy.classpath += files(compileKotlin.destinationDir)
classes.dependsOn compileGroovy
compileGroovy.dependsOn = compileGroovy.taskDependencies.values - 'compileJava'
compileKotlin.dependsOn compileGroovy
compileKotlin.classpath += files(compileGroovy.destinationDir)
classes.dependsOn compileKotlin
compileKotlin.dependsOn = compileKotlin.taskDependencies.values - 'compileJava'
compileGroovy.dependsOn compileKotlin
compileGroovy.classpath += files(compileKotlin.destinationDir)
classes.dependsOn compileGroovy
科特林优先:

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

为了清楚起见,您可以选择Kotlin代码是依赖于Groovy还是依赖于Kotlin上的Groovy,但这两种方式都不行。

对于Gradle 5.2.1,如果您想从Kotlin调用Groovy:

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

当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)
}
与科特林:

tasks.named(“compileGroovy”){
//Groovy只需要声明的依赖项
//而不是Ejava的输出
classpath=sourceset.main.get().compileClasspath
}
任务。命名为(“compileKotlin”){
//Kotlin还依赖于Groovy编译的结果
//这会自动使它依赖于compileGroovy
classpath+=文件(conventionOf(sourceset.main.get()).getPlugin(GroovySourceSet::class.java).groovy.classesDirectory)
}

谢谢你的回答,但根据这一点:,这似乎是可能的。只是不知道怎么做。为什么不能引入额外的模块?Kotlin是任何java/groovy项目中的主要语言,因为它的安全性和语言特性。因此,添加一个额外的模块(非常简单)看起来并不难。你说“看起来kotlin和groovy任务的变更顺序已经足够了”是什么意思?您是如何更改此构建顺序的?在
gradle.build
中,我写道:
compileKotlin.dependsOn(compileGroovy)
,然后我从
compileGroovy
中删除了
compileJava
,因为第一次更改为生成的循环dependsOn:
compileGroovy.dependsOn.remove('compileJava'))
。这似乎适用于主要来源。然而,当我试图在Groovy测试代码中引用Kotlin文件时,这种变通方法对我来说并不适用。我还尝试将
compile[Language]
更改为
compileTest[语言
测试类
。但这也没有帮助。我的答案是错误的。这就是最终对我起作用的原因:@JaredBurrows就我在Gradle 4.6中所知是不可能的。
org.Gradle.api.internal.tasks.DefaultTaskDependence
不允许删除任务依赖项是的,对于Gradle的never版本,
taskDependencies
不起作用。当从Gradle 3.1升级到4.10.2时,删除这一行可以修复它:
compileKotlin.dependsOn=compileKotlin.taskDependencies.values-“compileJava”
似乎也不再需要
classes.dependsOn compileGroovy
。在Gradle 6.0中您不能删除dependsOn,但我只需要这样做就可以做到:
compileKotlin.classpath+=files(compileGroovy.destinationDir)
。这真的很有用。有可能看到一个例子吗?@FranciscoAlbert我们去年用我们的应用程序从Groovy迁移到Kotlin。在过渡期间,我们必须支持两种语言。在一些初始设置问题之后,它工作得相当顺利,现在都在Kotlin中。如果你真的想要,我可以告诉你更多。所以,beautiful!感谢您在发行说明中强调这一点。对于gradle-6.2.2,我建议您不要将您的配置调整到groovy测试代码依赖于kotlin测试代码的场景中。不过,建议非常有效:
compileTestGroovy.classpath+=文件(compileTestKotlin.destinationDir)