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

JavaFX初始化Hibernate Configuration对象遇异常求助

JavaFX项目初始化Hibernate Configuration对象抛出NoClassDefFoundError异常

问题描述

正在开发JavaFX项目,尝试整合Hibernate。第一步初始化Configuration对象时抛出异常,已正确导入该类,IDE也能识别,但运行时报错。目前还未到配置hibernate.cfg.xml的步骤,仅初始化对象就出问题。

代码片段

package com.example.databasetest;

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Scene;
import javafx.stage.Stage;
import org.hibernate.cfg.Configuration;

import java.io.IOException;

public class HelloApplication extends Application {
    @Override
    public void start(Stage stage) throws IOException {
        FXMLLoader fxmlLoader = new FXMLLoader(HelloApplication.class.getResource("hello-view.fxml"));
        Scene scene = new Scene(fxmlLoader.load(), 320, 240);
        stage.setTitle("Hello!");
        stage.setScene(scene);
        stage.show();

        // 报错代码行
        Configuration config = new Configuration();
    }

    public static void main(String[] args) {
        launch();
    }
}

抛出的异常

Exception in Application start method
java.lang.reflect.InvocationTargetException
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:566)
    at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(LauncherImpl.java:465)
    at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.java:364)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:566)
    at java.base/sun.launcher.LauncherHelper$FXHelper.main(LauncherHelper.java:1051)
Caused by: java.lang.RuntimeException: Exception in Application start method
    at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:901)
    at javafx.graphics/com.sun.javafx.application.LauncherImpl.lambda$launchApplication$2(LauncherImpl.java:196)
    at java.base/java.lang.Thread.run(Thread.java:829)
Caused by: java.lang.NoClassDefFoundError: java/sql/SQLException
    at java.base/java.lang.Class.forName0(Native Method)
    at java.base/java.lang.Class.forName(Class.java:398)
    at org.jboss.logging.Logger.doGetMessageLogger(Logger.java:2562)
    at org.jboss.logging.Logger.getMessageLogger(Logger.java:2530)
    at org.jboss.logging.Logger.getMessageLogger(Logger.java:2516)
    at org.hibernate.orm.core@5.6.0.Final/org.hibernate.internal.CoreLogging.messageLogger(CoreLogging.java:28)
    at org.hibernate.orm.core@5.6.0.Final/org.hibernate.internal.CoreLogging.messageLogger(CoreLogging.java:24)
    at org.hibernate.orm.core@5.6.0.Final/org.hibernate.cfg.Configuration.<clinit>(Configuration.java:87)
    at com.example.databasetest/com.example.databasetest.HelloApplication.start(HelloApplication.java:24)
    at javafx.graphics/com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$9(LauncherImpl.java:847)
    at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runAndWait$12(PlatformImpl.java:484)
    at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$10(PlatformImpl.java:457)
    at java.base/java.security.AccessController.doPrivileged(Native Method)
    at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$11(PlatformImpl.java:456)
    at javafx.graphics/com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:96)
    at javafx.graphics/com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
    at javafx.graphics/com.sun.glass.ui.win.WinApplication.lambda$runLoop$3(WinApplication.java:184)
    ... 1 more
Caused by: java.lang.ClassNotFoundException: java.sql.SQLException
    at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:581)
    at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
    at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:522)
    ... 18 more
Exception running application com.example.databasetest.HelloApplication

补充信息

  • 使用Java 11,搭配兼容的Hibernate 5.6版本
  • 已在module-info.java中注册Hibernate模块

解决方案

这个异常的核心是Java模块系统未允许项目访问java.sql模块,从Java 9开始,java.sql是可选模块,默认不会自动导出给模块化项目。

步骤1:修改module-info.java

在模块声明中添加对java.sql模块的依赖:

module com.example.databasetest {
    requires javafx.controls;
    requires javafx.fxml;
    requires org.hibernate.orm.core;
    // 新增该行,允许访问java.sql模块
    requires java.sql;

    opens com.example.databasetest to javafx.fxml;
    exports com.example.databasetest;
}

步骤2:检查依赖完整性

若修改后仍报错,确认项目包含Hibernate所需的所有依赖:

  • Hibernate Core(已添加)
  • JBoss Logging(通常随Hibernate自动引入)
  • JDBC驱动(后续配置数据库需要,但初始化Configuration也可能依赖基础JDBC类)

额外说明

Hibernate的Configuration类初始化时会加载JDBC相关类,而Java 11的模块化系统默认不会让项目访问java.sql模块,因此必须显式声明依赖,这和是否配置hibernate.cfg.xml无关,是模块权限问题。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 02:16:03