Я считаю, что проще всего просто отключить предупреждения для использования автоматического модуля. (В моем случае я должен использовать некоторые автоматические модули, хочу я этого или нет, поэтому эти предупреждения просто отвлекают внимание.) У меня есть следующее в моем build.gradle.kts:
я есть проект Gradle, использующий плагин Kotlin Gradle. Я хочу построить модуль Java 9, поэтому моя структура каталогов выглядит следующим образом:
src/main/java/
- module-info.java
src/main/kotlin/
- Foo.kt
- Bar.kt
build.gradle
...
мой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
...).
Все работает в порядке, если я напишу свойmodule-info.java
вот так:
module my.module {
requires kotlin.stdlib;
exports my.module.pkg;
}
и если я поставлю все мои зависимости времени компиляцииjavac
вовремя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
пункт за это.
Но если я удалюrequires
пункт, чтобы сделатьjavac
счастлив, это делает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
и настройкаclasspath
чтобы быть пустым, компилятор Kotlin вообще ничего не может найти, и я получаю миллионы неразрешенных ошибок ссылок!
Почему компилятор Kotlin говорит мне, что я должен иметьrequires kotlin.stdlib;
когда компилятор Java говорит обратное? Как я могу заставить Kotlin и Java работать вместе для создания модуля Java 9?