如何用Gradle Kotlin DSL构建Java 9/10环境下的Kotlin项目?
嘿,我来帮你搞定这个Java 9+模块系统和Kotlin的兼容问题!你遇到的错误:
module-info.java:3: error: module not found: kotlin.stdlib
requires kotlin.stdlib;
主要是因为旧版Kotlin标准库没适配Java模块系统,再加上你的Gradle配置还有几个小问题需要调整,下面是一步步的解决方案:
1. 升级Kotlin版本到支持Java模块的版本
你当前用的Kotlin 1.2.41太老了,对Java 9+模块系统的支持很有限,建议升级到至少1.3.x以上的稳定版(比如最新的1.9.x系列)。修改build.gradle.kts中的版本号:
buildscript { var kotlin_version: String by extra kotlin_version = "1.9.20" // 替换为最新稳定版 repositories { mavenCentral() } dependencies { classpath(kotlin("gradle-plugin", kotlin_version)) } } plugins { kotlin("jvm") version "1.9.20" application }
2. 修正module-info.java中的模块依赖名称
新版Kotlin标准库的模块名已经不是kotlin.stdlib了,而是带完整包名的org.jetbrains.kotlin.stdlib,如果用了stdlib-jdk8,也要添加对应的模块依赖:
module com.example.testproject { // 替换为正确的模块名 requires org.jetbrains.kotlin.stdlib; requires org.jetbrains.kotlin.stdlib.jdk8; exports com.example.testproject; }
3. 统一Java版本和Kotlin编译配置
你当前的配置里Java兼容性设为1.10,但Kotlin的JVM目标是1.8,这会导致不一致。同时需要启用Gradle的模块系统支持:
java { sourceCompatibility = JavaVersion.VERSION_10 targetCompatibility = sourceCompatibility // 让Gradle自动推断模块路径,适配Java模块系统 modularity.inferModulePath.set(true) } tasks.withType<KotlinCompile> { kotlinOptions.jvmTarget = "10" // 和Java版本保持一致 // 添加编译参数,确保字节码兼容Java模块系统 kotlinOptions.freeCompilerArgs += listOf("-Xjvm-default=all") }
4. 简化依赖配置
stdlib-jdk8已经包含了基础stdlib的内容,不需要重复依赖,而且runtime依赖在新版Kotlin中已经不再需要了:
val kotlin_version: String by extra dependencies { implementation(kotlin("stdlib-jdk8", kotlin_version)) implementation(kotlin("reflect", kotlin_version)) }
5. (可选)规范项目结构
虽然你把module-info.java放在src/main/kotlin下是可行的,但更规范的做法是将它移到src/main/java目录下,这样可以去掉sourceSets里的java.srcDirs配置,让Gradle默认处理即可。
做完这些调整后,运行gradle clean run,项目应该就能正常编译并运行了!
内容的提问来源于stack exchange,提问作者TeXnician

