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)
如果我使用这种技术javac
在compileJava
任务期间提供所有编译时依赖项.
但是,如果我-Xlint:all
在compileJava
任务期间(编译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模块?
如果您在 Kotlin 中编写 Java 9 模块,除了对标准库 API 的显式依赖项之外,还必须requires kotlin.stdlib
在您的代码中进行声明,以满足已编译的 Kotlin 代码的运行时依赖项。module-info.java
javac
警告您在启用 lint 时需要自动模块,因为与普通模块相比,自动模块有一些潜在的缺点。在标准库被编译为普通模块之前,您必须处理此警告。
-Xallow-kotlin-package
编译器标志允许您省略require kotlin.stdlib
,因为它仅在编译标准库本身时使用。显然,如果您指定此标志并忽略该要求,您将无法使用标准库中的任何 API,因此这实际上不是您的选择。
归档时间: |
|
查看次数: |
2831 次 |
最近记录: |