Компилировать Groovy и Kotlin?

Я работаю над небольшим проектом с Groovy и Kotlin, а мой код Kotlin зависит от моего кода Groovy, а не наоборот. Тем не менее, Kotlin компилирует мой код сначала вместо Groovy, и, как результат, я получаю такие ошибки, как Unresolved reference: SiteRepository

Любые предложения, как я могу это исправить, изменив последовательность сборки или Kotlin, явно зависящую от Groovy, или любое другое предложение?

Ответы

Ответ 1

Это можно сделать так:

После 4.10

Котлин Первый:

//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

или Котлин Первый:

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

Чтобы было ясно, вы можете выбрать, зависит ли ваш код Kotlin от Groovy или Groovy от Kotlin, но вы не получите его в обоих направлениях.

Ответ 2

Я думаю, что невозможно скомпилировать Kotlin против Groovy в одном модуле, но вы можете перемещать Groovy (или Kotlin) в отдельный модуль. Groovy будет скомпилирован в банке, и теперь Котлин может зависеть от кода Groovy. Чтобы помочь вам, я написал простой проект и опубликовал его на github.

upd 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

Похоже, что порядок сортировки котлинских и хороших задач достаточно. Но если мы изменим шаги таким образом:

./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

Сборка по-прежнему не работает, потому что Котлин не видит Groovy.

Ответ 3

Для Gradle 5.2.1, если вы хотите позвонить в Groovy из Котлина:

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