You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

IntelliJ创建Gradle+Kotlin版JavaFX项目报模块包不存在错误

问题根因

该报错和JPMS(Java平台模块系统)本身不识别Kotlin代码无关,JPMS可以正常识别Kotlin编译生成的标准class文件。触发错误的核心原因是Gradle默认的模块校验逻辑仅扫描src/main/java目录下的编译产物,校验module-info.java中声明的导出包是否存在;而你的所有业务源码都存放在src/main/kotlin目录,编译后Kotlin字节码的输出路径不在Gradle默认的Java模块扫描范围内,因此抛出Package com.example.demo1 not found in module异常。

核心疑问解答
  • 构建artifacts不强制依赖module-info.java:如果不需要做模块化专属的打包操作(比如用jlink生成裁剪版自定义运行时、强模块封装隔离),完全可以删除module-info.java走传统classpath模式,项目运行、打普通fat jar、生成桌面安装包都不会受影响,你之前测试删除后可正常运行就是这个原因。
  • 不存在Java模块文件无法识别Kotlin包的问题,本质是构建工具的路径扫描配置不匹配。
可落地方案

根据你是否需要模块化能力二选一即可:

方案1:不需要模块化能力(推荐,适配绝大多数普通JavaFX桌面开发场景)

直接删除src/main/java目录下的module-info.java文件,后续正常开发、构建、打包即可,不需要额外调整其他配置。

调整Gradle构建脚本,通过--patch-module参数把Kotlin源码的编译输出目录纳入模块扫描路径,操作步骤:

  1. 打开项目根目录下的构建脚本文件,如果你选的Kotlin写构建脚本就是build.gradle.kts,选Groovy写构建脚本就是build.gradle
  2. 在脚本中添加对应配置:
  • Kotlin DSL(build.gradle.kts)添加如下代码:
tasks.withType<JavaCompile> {
    options.compilerArgumentProviders.add(CommandLineArgumentProvider {
        listOf(
            "--patch-module",
            "com.example.demo1=${sourceSets.main.get().output.classesDirs.asPath}"
        )
    })
}
  • Groovy DSL(build.gradle)添加如下代码:
tasks.withType(JavaCompile) {
    options.compilerArgumentProviders.add({
        [
            "--patch-module",
            "com.example.demo1=${sourceSets.main.output.classesDirs.asPath}"
        ]
    } as CommandLineArgumentProvider)
}
  1. 同步Gradle变更后重新构建运行,报错即可解决。

内容的提问来源于stack exchange,提问作者AIMIN PAN

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 00:54:20