当前位置: 首页 > 知识库问答 >
问题:

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

逄嘉禧
2023-03-14
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.ktbar.kt,...)。

如果我像这样编写模块-info.java,那么一切工作都很顺利:

module my.module {
    requires kotlin.stdlib;
    exports my.module.pkg;
}
/path/to/my.module/src/main/java/module-info.java:26: warning: requires directive for an automatic module
    requires kotlin.stdlib;
                   ^
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

然后,如果我试图通过将“-xmodule-path=${classpath.aspath}”添加到freecompilerargs并将classpath设置为空来强制compilekotlin接受模块路径而不是类路径,那么Kotlin编译器根本找不到任何东西,最终会出现无数未解决的引用错误!

为什么Kotlin编译器告诉我,我必须有要求Kotlin.stdlib;,而Java编译器却说相反呢?我如何让Kotlin和Java一起工作来生成Java9模块?

共有1个答案

毋宸
2023-03-14

如果您正在用Kotlin编写Java9模块,您必须在模块-info.Java声明需要Kotlin.stdlib,以便满足编译后的Kotlin代码的运行时依赖关系以及对标准库API的显式依赖关系。

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

-xallow-kotlin-package编译器标志允许您省略require kotlin.stdlib,因为它只用于编译标准库本身。显然,如果您指定了这个标志并省略了这个要求,那么您将无法使用标准库中的任何API,因此这不是一个真正适合您的选项。

 类似资料:
  • 食氧;视窗7;JDK 9决赛从9日开始,21日结束;JUnit4.12和现有的应用程序。作为起点,可以编译、执行应用程序,并且所有JUnit测试都显示为绿色。现在我们使用eclipse生成文件模块信息。JAVA结果是: 但有一个错误:junit无法解析为模块。问题是:如何告诉文件junit没有定义任何模块,应该在兼容模式下运行?

  • 我想在java模块中使用CDI功能。我希望我的代码保持泛型,不依赖于特定的实现。 我使用Java11和Maven3.6.0。 为了简单起见,我的目标被简化为在java文件中导入包。当我在没有module(没有)的情况下这样做时,每件事都能正常工作。 我的理解是,CDI库应该采用一个受jar文件名称启发的自动模块名称。当我使用指令运行maven时,我在类路径中看到。我相信,如果我错了,请更正,这应该

  • 主要内容:模块系统特征,创建模块Java 9是一种称为模块的新型编程组件。模块是一个自我描述的代码和数据集合,并有一个名称来标识它。 模块系统特征 使用模块组件,Java 9中增加了以下增强功能 - 引入了一个新的可选阶段,即链接时间。这个阶段介于编译时间和运行时间之间。 在此阶段,可以组合和优化一组模块,使用jlink工具制作自定义运行时映像。 javac,jlink和java有额外的选项来指定模块路径,它们进一步定位模块的定

  • 我的项目依赖于Netty Epoll Transport。以下是依赖关系: 无法派生模块描述符:netty-transport-native-epoll-4.1.17。final-snapshot-linux-x 86_64.jar netty.transport.native.epoll:无效的模块名:'native'不是Java标识符 有什么变通办法吗?(当然,除了“释放正确的netty神器”

  • 那么,换句话说,为什么编译器不能在第二个方法中执行自动装箱呢?是因为在第二个方法中,绑定不是显式的,而在第一个方法中绑定是明确的。

  • 2. 隐含规则和模式规则 上一节的Makefile写得中规中矩,比较繁琐,是为了讲清楚基本概念,其实Makefile有很多灵活的写法,可以写得更简洁,同时减少出错的可能。本节我们来看看这样一个例子还有哪些改进的余地。 一个目标依赖的所有条件不一定非得写在一条规则中,也可以拆开写,例如: main.o: main.h stack.h maze.h main.o: main.c gcc -c ma