Компилировать 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)