Kotlin 1.2.10和Java 9对自动模块有相反的规则吗?
作者:互联网
我有一个使用Kotlin Gradle插件的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;
}
如果我在使用this technique的compileJava任务期间将所有编译时依赖项提供给javac.
但是,如果我在compileJava任务期间打开-Xlint:all for Java编译器(编译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是一个自动模块,所以我不应该有一个require子句.
但是如果我删除了require子句以使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
然后,如果我尝试通过向freeCompilerArgs添加“-Xmodule-path = ${classpath.asPath}”并将classpath设置为空来强制compileKotlin获取模块路径而不是类路径,那么Kotlin编译器无法找到任何内容所有,我最终得到了数以万计的未解决的参考错误!
为什么Kotlin编译器告诉我必须要求kotlin.stdlib;什么时候Java编译器说相反?如何让Kotlin和Java一起工作来生成Java 9模块?
解决方法:
如果您在Kotlin中编写Java 9模块,则必须在module-info.java中声明需要kotlin.stdlib,以便除了对标准库API的显式依赖性之外,还要满足已编译的Kotlin代码的运行时依赖性.
javac警告您在启用lint时需要自动模块,因为与普通模块相比,自动模块具有一些潜在的drawbacks.在将标准库编译为普通模块之前,您必须处理此警告.
-Xallow-kotlin-package编译器标志允许您省略require kotlin.stdlib,因为它仅在编译标准库本身时使用.显然,如果您指定此标志并省略该要求,您将无法使用标准库中的任何API,因此这对您来说不是一个真正的选项.
标签:java-module,java,gradle,kotlin,jigsaw 来源: https://codeday.me/bug/20191008/1870435.html