JavaFX集成HSQLDB工具遇异常求助:模块解析与类找不到错误
解决JavaFX嵌入HSQLDB DataManager的两个异常问题
我来帮你一步步搞定这两个运行时异常,咱们一个一个捋清楚问题根源和解决办法:
1. 模块导出冲突:java.lang.module.ResolutionException
这个错误的核心是Java模块系统检测到你的项目模块(sqltool)和hsqldb模块都导出了同一个包org.hsqldb.lib,而模块规范不允许两个不同模块把相同的包暴露给同一个模块(这里是javafx.graphicsEmpty)。
解决办法:
- 如果你的项目没必要搞模块化(也就是没写
module-info.java),直接删掉它,用非模块化的方式运行项目就行,这是最省事的方案。 - 如果必须保留模块化结构,修改你的
module-info.java:- 绝对不要添加
exports org.hsqldb.lib;这行(除非你明确需要导出这个包,但显然你不需要)。 - 同时正确声明依赖的模块:
module sqltool { requires javafx.controls; requires javafx.swing; requires hsqldb; }
- 绝对不要添加
- 要是用Maven运行,也可以临时加参数绕开冲突(不推荐长期用,但能快速验证):
在maven-surefire-plugin的配置里加这些参数:<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>3.1.2</version> <configuration> <argLine> --add-modules javafx.controls,javafx.swing,hsqldb --add-exports org.hsqldb.lib=javafx.graphicsEmpty </argLine> </configuration> </plugin>
2. 类找不到:java.lang.NoClassDefFoundError: java/sql/SQLException
这个问题是因为Java 9及以后,java.sql模块是可选模块,默认不会自动加载,而HSQLDB的DataManager依赖JDBC相关的类(比如SQLException),所以就找不到了。
解决办法:
- 如果是模块化项目,在
module-info.java里加上对java.sql的依赖:module sqltool { // 保留之前的requires声明 requires java.sql; } - 如果是非模块化项目,运行的时候要手动引入
java.sql模块:- 命令行运行:
java --add-modules javafx.controls,javafx.swing,java.sql -jar 你的jar包名.jar - Maven里的话,在
maven-surefire-plugin或maven-exec-plugin的argLine里加--add-modules java.sql:<argLine> --add-modules javafx.controls,javafx.swing,java.sql </argLine>
- 命令行运行:
- 另外检查下Maven依赖,确保HSQLDB的jar包完整引入,别把
scope设成provided了,正确的依赖配置应该是这样:<dependency> <groupId>org.hsqldb</groupId> <artifactId>hsqldb</artifactId> <version>2.7.2</version> <!-- 用最新的稳定版就行 --> <scope>runtime</scope> </dependency>
额外小提示
在你的SwingForm里初始化DatabaseManagerSwing之前,可以显式加载下HSQLDB的驱动,避免驱动加载异常:
public SwingForm(){ JPanel innerPanel = new JPanel(); // 显式加载驱动,可选但能避免一些奇怪的问题 try { Class.forName("org.hsqldb.jdbcDriver"); } catch (ClassNotFoundException e) { e.printStackTrace(); } DatabaseManagerSwing dbms = new DatabaseManagerSwing(); innerPanel.add(dbms); add(innerPanel); }
内容的提问来源于stack exchange,提问作者Marko
相关产品推荐
相关产品推荐

