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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 22:22:55