Kotlin 1.2.10和Java 9对自动模块有相反的规定吗?

0xb*_*7ed 7 java gradle java-platform-module-system kotlin java-module

我有一个使用Kotlin Gradle插件的Gradle项目.我想构建一个Java 9模块,所以我的目录结构如下所示:

src/main/java/
    - module-info.java
src/main/kotlin/
    - Foo.kt
    - Bar.kt
build.gradle
...
Run Code Online (Sandbox Code Playgroud)

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"
}
Run Code Online (Sandbox Code Playgroud)

我用所有这些依赖于我的科特林源(Foo.kt,Bar.kt,...).

如果我module-info.java这么写,那么一切都很有效:

module my.module {
    requires kotlin.stdlib;
    exports my.module.pkg;
}
Run Code Online (Sandbox Code Playgroud)

如果我使用这种技术javaccompileJava任务期间提供所有编译时依赖项.

但是,如果我-Xlint:allcompileJava任务期间(编译module-info.java)打开Java编译器,我会收到以下警告:

/path/to/my.module/src/main/java/module-info.java:26: warning: requires directive for an automatic module
    requires kotlin.stdlib;
                   ^
Run Code Online (Sandbox Code Playgroud)

所以这里我们有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'.
Run Code Online (Sandbox Code Playgroud)

现在我也可以通过编辑我的compileKotlin任务来解决这个问题:

compileKotlin {
    doFirst {
        kotlinOptions.freeCompilerArgs = ['-Xallow-kotlin-package']
    }
}
Run Code Online (Sandbox Code Playgroud)

但这只会在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
Run Code Online (Sandbox Code Playgroud)

然后,如果我试图强迫compileKotlin加入采取模块路径,而不是一个类路径"-Xmodule-path=${classpath.asPath}"freeCompilerArgs并设置classpath为空,则科特林编译器无法找到所有的东西,而我最终没有解决引用错误不计其数!

为什么Kotlin编译器告诉我,requires kotlin.stdlib;当Java编译器说相反时我必须拥有它?如何让Kotlin和Java一起工作来生成Java 9模块?

Ily*_*lya 3

如果您在 Kotlin 中编写 Java 9 模块,除了对标准库 API 的显式依赖项之外,还必须requires kotlin.stdlib在您的代码中进行声明,以满足已编译的 Kotlin 代码的运行时依赖项。module-info.java

javac警告您在启用 lint 时需要自动模块,因为与普通模块相比,自动模块有一些潜在的缺点。在标准库被编译为普通模块之前,您必须处理此警告。

-Xallow-kotlin-package编译器标志允许您省略require kotlin.stdlib,因为它仅在编译标准库本身时使用。显然,如果您指定此标志并忽略该要求,您将无法使用标准库中的任何 API,因此这实际上不是您的选择。