ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2019-10-08 04:02:57  阅读:269  来源: 互联网

标签:java-module java gradle kotlin jigsaw


我有一个使用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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有