未用Maven/pom.xml时Hibernate报错:javax/xml/bind/JAXBException缺失
问题描述
在未使用pom.xml及Maven的环境下使用Hibernate,运行程序时出现错误,相关代码与报错信息如下:
主类代码
package com.luv2code.hibernate.demo; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; public class CreateStudentDemo { public static void main(String[] args) { // 创建Session工厂 SessionFactory factory = new Configuration().configure("hibernate.cfg.xml").addAnnotatedClass(Student.class).buildSessionFactory(); // 创建Session Session session = factory.getCurrentSession(); try { // 创建学生对象 System.out.println("创建一个新的学生对象"); Student tempStudent = new Student("Paul", "Wall", "paulWall@gmail.com"); // 开启事务 session.beginTransaction(); // 保存学生对象 System.out.println("保存学生"); session.save(tempStudent); // 提交事务 session.getTransaction().commit(); System.out.println("完成..."); } catch (Exception e) { System.out.println("错误!!!"); }finally { ((SessionFactory) factory).close(); } } }
Hibernate配置文件
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <!-- JDBC数据库连接设置 --> <property name="connection.driver_class">com.mysql.cj.jdbc.Driver</property> <property name="connection.url">jdbc:mysql://localhost:3306/hb_student_tracker?useSSL=false&serverTimezone=UTC</property> <property name="connection.username">hbstudent</property> <property name="connection.password">hbstudent</property> <!-- JDBC连接池设置...使用内置测试池 --> <property name="connection.pool_size">1</property> <!-- 选择SQL方言 --> <property name="dialect">org.hibernate.dialect.MySQLDialect</property> <!-- 将SQL输出到控制台 --> <property name="show_sql">true</property> <!-- 设置当前会话上下文 --> <property name="current_session_context_class">thread</property> </session-factory> </hibernate-configuration>
报错信息
Exception in thread "main" java.lang.NoClassDefFoundError: javax/xml/bind/JAXBException at org.hibernate.boot.spi.XmlMappingBinderAccess.<init>(XmlMappingBinderAccess.java:43) at org.hibernate.boot.MetadataSources.<init>(MetadataSources.java:87) at org.hibernate.cfg.Configuration.<init>(Configuration.java:123) at org.hibernate.cfg.Configuration.<init>(Configuration.java:118) at com.luv2code.hibernate.demo.CreateStudentDemo.main(CreateStudentDemo.java:13) Caused by: java.lang.ClassNotFoundException: javax.xml.bind.JAXBException 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:520) ... 5 more
解决方案
该错误核心原因是:你使用的JDK版本为9及以上,JAXB API在JDK9之后被移出JDK核心库,但当前Hibernate版本依赖该API,导致类找不到。
方案一:手动添加依赖jar包
由于未使用Maven,需手动下载以下JAXB相关jar包,放入项目lib目录并添加到类路径中:
jaxb-api.jarjaxb-core.jarjaxb-impl.jarjavax.activation-api.jar
建议选择与你当前Hibernate版本兼容的版本(如2.3.x系列)。
方案二:添加JVM兼容参数
若不想额外添加jar包,可在运行程序时添加JVM参数,让JDK兼容旧模块:
--add-modules java.xml.bind
操作方式:在IDE运行配置的VM参数栏中添加上述参数,重新运行程序即可。
内容的提问来源于stack exchange,提问作者Mohammed Abdou TOUNSSI
相关产品推荐
相关产品推荐

