Это своего рода ответ на свой вопрос (я не до конца понимаю этот вопрос, поэтому объяснения могут быть неверными).Выводы, которые я здесь делаю, являются чисто эмпирическими и основаны на преобразовании из Kotlin DSL в Groovy и обратно Gradle.
Первая проблема, с которой я столкнулся, заключалась в том, что у меня было два конфликтующих поставщика для функций Kotlin в:
implementation(kotlin("stdlib", kotlin_version))
implementation(kotlin("runtime", kotlin_version))
Я решил это, решив пойти с stdlib
.Все остальные зависимости не конфликтовали друг с другом.
Более серьезная проблема была в другом: задача compileJava
не нашла правильные классы (из проекта) и модули (из дистрибутива).Поэтому мне нужно было адаптировать пути, как в следующем примере:
val compileKotlin: KotlinCompile by tasks
val compileJava: JavaCompile by tasks
compileJava.destinationDir = compileKotlin.destinationDir
Это в основном компилирует классы Java в скомпилированном выводе Kotlins и заставляет Java находить классы из проекта.
Последнийпроблема может быть окончательно решена с помощью следующей неидиоматической части скрипта Kotlin:
tasks {
"compileJava" {
dependsOn(":compileKotlin")
if (JavaVersion.current() >= JavaVersion.VERSION_1_9) {
inputs.property("moduleName", ext["moduleName"])
doFirst {
compileJava.options.compilerArgs = listOf(
// include Gradle dependencies as modules
"--module-path", java.sourceSets["main"].compileClasspath.asPath,
)
java.sourceSets["main"].compileClasspath = files()
}
}
}
}
Это в основном позволяет задаче compileJava
использовать пустой путь к классу и задает путь к модулю в качестве параметра компилятора для текущего установленного compileClasspathосновной исходный набор (исходный набор Kotlin, который также добавляется как исходный набор Java).