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

导出可执行Jar文件时抛出java.lang.IllegalStateException异常求助

解决Jar包运行时JavaFX FXML加载的"Location is not set"异常

从你的堆栈跟踪信息来看,问题的核心是JavaFX的FXML资源在Jar包中无法被正确定位——在Eclipse中运行时,资源是通过文件系统路径访问的,但打包成Jar后,资源变成了Jar内部的条目,直接用相对路径或文件流加载会失败,导致IllegalStateException: Location is not set。

下面是具体的修复步骤:

1. 检查并修改FXML加载代码

所有加载FXML的地方,必须使用类加载器的getResource()方法来获取资源的URL,而不是直接使用文件路径或字符串。

修复Main.java中的加载逻辑

在realStart方法(对应堆栈中的第87/89行),把原来的FXML加载代码替换为:

// 假设Main类在wallettemplate包下,main.fxml和Main.java同包
FXMLLoader loader = new FXMLLoader(getClass().getResource("main.fxml"));
// 如果main.fxml在类路径根下的wallettemplate目录,用:
// FXMLLoader loader = new FXMLLoader(getClass().getResource("/wallettemplate/main.fxml"));
Parent root = loader.load();

getResource()会返回Jar内部资源的URL,FXMLLoader可以正确加载这个路径下的FXML文件。

修复ClickableFLOAddress中的加载逻辑

第二次运行的错误显示自定义控件ClickableFLOAddress的第74行加载FXML失败,同样要修改为类加载器获取资源:

// 假设FXML文件和ClickableFLOAddress同包,比如叫clickable_flo_address.fxml
FXMLLoader loader = new FXMLLoader(getClass().getResource("clickable_flo_address.fxml"));
loader.setRoot(this);
loader.setController(this);
loader.load();

确保FXML文件的路径和类的包结构完全匹配。

2. 确保资源文件被正确打包进Jar

  • 在Eclipse中,确认存放FXML文件的文件夹被标记为Source Folder(右键文件夹 → Build Path → Use as Source Folder),这样Eclipse编译时会自动把资源复制到输出目录,最终打包进Jar。
  • 导出Jar时,在Eclipse的导出向导中,选择"Runnable JAR File",然后在"Library handling"中选择合适的选项(比如"Package required libraries into generated JAR"),同时确保在"Select the resources to export"中勾选了所有FXML资源文件。

3. 验证Jar包内容

修复后,可以用命令行验证Jar内是否包含所需资源:

jar tf flocre.jar

查看输出中是否存在wallettemplate/main.fxml和wallettemplate/controls/clickable_flo_address.fxml(根据你的实际包结构调整路径),如果这些文件不存在,说明打包时资源没有被包含,需要检查项目的构建路径配置。

按照这些步骤修改后,Jar包应该能正常加载FXML并启动钱包了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:36:24