У Kotlin 1.2.10 и Java 9 есть противоположные правила относительно автоматических модулей?

У меня есть проект Gradle с использованием плагина Kotlin Gradle. Я хочу построить модуль Java 9, поэтому моя структура каталогов выглядит так:

src/main/java/ - module-info.java src/main/kotlin/ - Foo.kt - Bar.kt build.gradle ... 

My build.gradle объявляет следующие зависимости:

 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" } 

и я использую все эти зависимости в моем источнике Kotlin ( Foo.kt , Bar.kt , …).

Все работает hunky-dory, если я напишу свой module-info.java следующим образом:

 module my.module { requires kotlin.stdlib; exports my.module.pkg; } 

и если я compileJava все свои зависимости времени компиляции до javac во время задачи compileJava используя эту технику .

Однако если я compileJava -Xlint:all для компилятора Java во время задачи compileJava (для компиляции module-info.java ), я получаю следующие предупреждения:

 /path/to/my.module/src/main/java/module-info.java:26: warning: requires directive for an automatic module requires kotlin.stdlib; ^ 

Итак, здесь у нас есть компилятор Java, javac жалуется, что kotlin.stdlib является автоматическим модулем, поэтому у меня не должно быть requires для него.

Но если я удалю условие kotlinc чтобы сделать javac счастливым, это делает kotlinc еще более kotlinc чем javac (я получаю сообщение об ошибке не предупреждение):

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

Теперь я могу исправить это, отредактировав мою задачу compileKotlin таким образом:

 compileKotlin { doFirst { kotlinOptions.freeCompilerArgs = ['-Xallow-kotlin-package'] } } 

Но это только приводит к БОЛЕЕ ошибкам во время задачи compileKotlin , все выглядит так:

 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 

И тогда, если я попытаюсь заставить compileKotlin взять путь к модулю, а не путь к классам, добавив "-Xmodule-path=${classpath.asPath}" в freeCompilerArgs и установив "-Xmodule-path=${classpath.asPath}" к freeCompilerArgs пустым, компилятор Kotlin не сможет найти что-либо в все, и я в конечном итоге с zillions нерешенных эталонных ошибок!

Почему компилятор Kotlin говорит мне, что мне requires kotlin.stdlib; когда компилятор Java говорит об обратном? Как я могу заставить Kotlin и Java работать вместе для создания модуля Java 9?

Intereting Posts
Использование задач ant от gradle-script-kotlin Как расширить dataclass с помощью toString Как получить номер мобильного телефона с SIM-карты в Android Программно с использованием языка kotlin? извлечение данных из firebase Почему Котлин не требует попыток и уловки явно У Котлина есть сборщик мусора? Если да, то на каком алгоритме он основан? Как я могу использовать модель представления, с sqlite и широковещательным приемником для обновления пользовательского интерфейса? IllegalArgumentException: параметр, заданный как непустой, равен null Интерфейс ввода кинжала в базовом классе динамический dsl с использованием kotlin с поддержкой контента Обобщить метод с нулевыми аргументами и возвращаемым типом Невозможно использовать имена меток, отобранных по методу Kotlin, в androidTest – исключение для дескриптора Dagger 2 – Inject со значением по умолчанию в конструкторе Назначение и извлечение карты типов Как хранить временную переменную при инициализации объекта Kotlin?