JavaFX项目打包为exe后出现java.sql.SQLException类未找到异常的解决方法
问题描述
- 基于JavaFX在IDEA开发待办事项列表项目,数据库采用Firebird 2.5.9,IDEA内运行完全正常
- 将项目打包为jar后,通过exe4j工具转换为exe文件,执行exe时抛出如下异常:
java.lang.NoClassDefFoundError: java/sql/SQLException at java.base/java.lang.Class.getDeclaredMethods0(Native Method) at java.base/java.lang.Class.privateGetDeclaredMethods(Class.java:3434) at java.base/java.lang.Class.getDeclaredMethod(Class.java:2705) at com.exe4j.runtime.LauncherEngine.launch(LauncherEngine.java:82) at com.exe4j.runtime.WinLauncher.main(WinLauncher.java:94) Caused by: java.lang.ClassNotFoundException: java.sql.SQLException at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641) at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188) at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521) ... 5 more
已尝试过相关解决方案,但不适配当前场景,需解决该异常使exe正常执行。
解决方案
1. 处理Java模块化依赖(Java 9+)
如果使用Java 9及以上版本,由于模块化系统限制,需确保项目正确引入java.sql模块:
- 若项目为模块化项目(存在
module-info.java),添加模块依赖声明:
module your.project.module { requires java.sql; // 同时保留JavaFX相关模块依赖,例如: requires javafx.controls; requires javafx.fxml; // 引入Firebird驱动模块(若驱动为模块化版本) requires org.firebirdsql.jdbc; }
- 若为非模块化项目,在打包或exe4j配置中添加VM参数:
--add-modules java.sql
2. 构建包含完整依赖的胖jar
仅打包项目自身代码会缺失JavaSQL及Firebird驱动类,需构建胖jar:
- 使用Maven的
maven-assembly-plugin或Gradle的shadowJar插件,将所有依赖(包括Firebird驱动、JavaSQL相关类)打包进同一个jar文件 - 解压验证胖jar,确认
java/sql/SQLException.class和Firebird驱动类存在于jar包内
3. 修正exe4j配置
- 确保exe4j中指定的JRE版本与开发环境一致(避免Java 8与Java 9+混用)
- 在exe4j的「VM Parameters」中添加
--add-modules java.sql(针对Java 9+非模块化项目) - 检查exe4j中配置的主类路径是否正确,确保主类所在的jar被加载
4. 验证Firebird驱动兼容性
使用与Firebird 2.5.9兼容的Jaybird驱动(推荐2.2.x或3.0.x版本),并确保驱动被正确添加到项目依赖且被打包进胖jar。
内容的提问来源于stack exchange,提问作者Yicheng QIAN
相关产品推荐
相关产品推荐

