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

多模块JavaFX Gradle项目出现Location未设置异常求助

解决JavaFX多模块项目java.lang.IllegalStateException: Location is not set问题

核心问题分析

该问题本质是多模块环境下资源加载路径配置错误,Gradle未正确处理模块间依赖,或是module-info.java未开放资源包权限,导致根模块无法定位fx_view模块中的FXML文件,最终返回null触发异常。


1. Gradle配置修正

根模块build.gradle

确保正确声明JavaFX依赖、子模块依赖及主类/主模块信息:

plugins {
    id 'application'
    id 'org.openjfx.javafxplugin' version '0.0.13'
}

repositories {
    mavenCentral()
}

javafx {
    version = '21' // 替换为你的JavaFX实际版本
    modules = ['javafx.controls', 'javafx.fxml']
}

dependencies {
    implementation project(':fx_view')
    implementation project(':core')
    implementation project(':service')
}

application {
    mainClass = 'com.your.root.module.Main' // 替换为根模块主类全限定名
    mainModule = 'com.your.root.module' // 替换为根模块的模块名
}

fx_view模块build.gradle

保证JavaFX版本与根模块一致,正确配置资源目录:

plugins {
    id 'java'
    id 'org.openjfx.javafxplugin' version '0.0.13'
}

repositories {
    mavenCentral()
}

javafx {
    version = '21' // 与根模块JavaFX版本保持一致
    modules = ['javafx.controls', 'javafx.fxml']
}

dependencies {
    implementation project(':core')
    implementation project(':service')
}

// 确保resources目录被正确识别并打包
sourceSets {
    main {
        resources {
            srcDirs = ['src/main/resources']
        }
    }
}

settings.gradle确认

检查所有子模块已被正确包含:

rootProject.name = 'your-root-project-name'
include ':core'
include ':fx_view'
include ':service'

2. module-info.java修正

根模块module-info.java

声明对fx_view及JavaFX模块的依赖:

module com.your.root.module {
    requires javafx.controls;
    requires javafx.fxml;
    requires com.your.fx.view.module; // 替换为fx_view模块的模块名
    requires com.your.core.module;
    requires com.your.service.module;

    exports com.your.root.module; // 导出根模块主类所在包
}

fx_view模块module-info.java

开放FXML资源包权限给JavaFX,同时导出控制器包供根模块访问:

module com.your.fx.view.module {
    requires javafx.controls;
    requires javafx.fxml;
    requires com.your.core.module;
    requires com.your.service.module;

    // 导出控制器所在包,允许根模块实例化控制器
    exports com.your.fx.view.module.controller;
    // 打开FXML资源所在包,允许FXMLLoader访问
    opens com.your.fx.view.module.resources to javafx.fxml;
    // 若FXML在resources根目录,直接开放整个模块:
    // opens com.your.fx.view.module to javafx.fxml;
}

3. 修正FXML加载代码

根模块加载fx_view中的FXML时,必须使用模块类加载器,禁止使用本地文件路径:

// 方式1:通过类加载器获取资源
URL fxmlUrl = getClass().getClassLoader().getResource("com/your/fx/view/module/resources/main.fxml");
// 若FXML在fx_view的resources根目录,路径简化为"main.fxml"

// 方式2:直接通过模块路径获取
Module fxViewModule = ModuleLayer.boot().findModule("com.your.fx.view.module").orElseThrow();
URL fxmlUrl = fxViewModule.getResource("main.fxml");

if (fxmlUrl == null) {
    throw new IllegalStateException("FXML文件未找到,请检查路径或模块配置");
}
FXMLLoader loader = new FXMLLoader(fxmlUrl);
Parent root = loader.load();

4. 排查验证步骤

  • 执行./gradlew clean build清理缓存并重新构建,避免旧构建残留
  • 查看fx_view模块的构建jar包,确认FXML文件已被打包进resources目录
  • 打印模块路径验证:System.out.println(System.getProperty("jdk.module.path")),确认fx_view模块在模块路径中
  • 检查FXML文件路径与加载代码中的路径完全匹配(注意大小写、包层级)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.02 00:33:09