¿Kotlin 1.2.10 y Java 9 tienen reglas opuestas con respecto a los módulos automáticos?
Tengo un proyecto Gradle con el complemento Kotlin Gradle. Quiero construir un módulo Java 9, por lo que mi estructura de directorios se ve así:
src/main/java/
- module-info.java
src/main/kotlin/
- Foo.kt
- Bar.kt
build.gradle
...
Mibuild.gradle
declara las siguientes dependencias:
dependencies {
compile "org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.2.10"
compile "org.jetbrains.kotlin:kotlin-reflect:1.2.10"
compile "org.junit.jupiter:junit-jupiter-api:5.0.2"
}
y uso todas estas dependencias en mi fuente Kotlin (Foo.kt
, Bar.kt
, ...)
Todo funciona hunky-dory si escribo mimodule-info.java
al igual que:
module my.module {
requires kotlin.stdlib;
exports my.module.pkg;
}
y si proporciono todas mis dependencias en tiempo de compilación ajavac
durante elcompileJava
tarea utilizandoesta tecnica.
sin embargo si enciendo-Xlint:all
para el compilador de Java durante elcompileJava
tarea (para compilarmodule-info.java
), Recibo las siguientes advertencias:
/path/to/my.module/src/main/java/module-info.java:26: warning: requires directive for an automatic module
requires kotlin.stdlib;
^
Así que aquí tenemos el compilador de Java,javac
quejándose de quekotlin.stdlib
es un módulo automático, así que no debería tener unrequires
cláusula para ello.
Pero si borro elrequires
cláusula para hacerjavac
feliz, hacekotlinc
incluso más enojado quejavac
fue (recibo un error, no una advertencia):
e: /path/to/my.module/src/main/java/module-info.java: The Kotlin standard library is not found in the module graph. Please ensure you have the 'requires kotlin.stdlib' clause in your module definition
FAILURE: Build failed with an exception.
* What went wrong:
Execution failed for task ':my.module:compileKotlin'.
Ahora también puedo arreglar eso editando micompileKotlin
tarea así:
compileKotlin {
doFirst {
kotlinOptions.freeCompilerArgs = ['-Xallow-kotlin-package']
}
}
Pero esto solo conduce a MÁS errores durante elcompileKotlin
tarea, todas parecidas a esta:
e: /path/to/my.module/src/main/kotlin/Foo.kt: (27, 30): Symbol is declared in module 'org.junit.jupiter.api' which current module does not depend on
Y luego si trato de forzarcompileKotlin
tomar una ruta de módulo en lugar de una ruta de clase agregando"-Xmodule-path=${classpath.asPath}"
afreeCompilerArgs
y ambientaciónclasspath
para estar vacío, el compilador de Kotlin no puede encontrar nada en absoluto, ¡y termino con millones de errores de referencia sin resolver!
¿Por qué el compilador de Kotlin me dice que tengo que tenerrequires kotlin.stdlib;
cuando el compilador de Java dice lo contrario? ¿Cómo puedo hacer que Kotlin y Java trabajen juntos para producir un módulo Java 9?