Я считаю, что проще всего просто отключить предупреждения для использования автоматического модуля. (В моем случае я должен использовать некоторые автоматические модули, хочу я этого или нет, поэтому эти предупреждения просто отвлекают внимание.) У меня есть следующее в моем 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?