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
相关产品推荐
相关产品推荐

