Java项目使用Hibernate遇javax.xml.bind.JAXBException异常及解决
配置Hibernate时遇到
NoClassDefFoundError及后续问题的解决过程 问题背景
在Java项目中使用hibernate.cfg.xml配置Hibernate,按教程添加了所有所需jar包,但运行应用时始终抛出NoClassDefFoundError错误。
初始错误信息
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 org.studyeasy.hibernate.App.main(App.java:12)
完整错误栈:
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 org.studyeasy.hibernate.App.main(App.java:12) 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:521) ... 5 more
尝试解决方案后出现的新错误
添加jaxb-api-23.1.jar到lib文件夹和构建路径后,出现新的配置解析错误:
Jan 05, 2023 12:46:58 PM org.hibernate.Version logVersion INFO: HHH000412: Hibernate Core {5.2.8.Final} Jan 05, 2023 12:46:58 PM org.hibernate.cfg.Environment <clinit> INFO: HHH000206: hibernate.properties not found Exception in thread "main" org.hibernate.internal.util.config.ConfigurationException: Unable to perform unmarshalling at line number 0 and column 0 in RESOURCE hibernate.cfg.xml. Message: null at org.hibernate.boot.cfgxml.internal.JaxbCfgProcessor.unmarshal(JaxbCfgProcessor.java:133) at org.hibernate.boot.cfgxml.internal.JaxbCfgProcessor.unmarshal(JaxbCfgProcessor.java:65) at org.hibernate.boot.cfgxml.internal.ConfigLoader.loadConfigXmlResource(ConfigLoader.java:57) at org.hibernate.boot.registry.StandardServiceRegistryBuilder.configure(StandardServiceRegistryBuilder.java:163) at org.hibernate.cfg.Configuration.configure(Configuration.java:258) at org.studyeasy.hibernate.App.main(App.java:13) Caused by: javax.xml.bind.JAXBException: Implementation of JAXB-API has not been found on module path or classpath. - with linked exception: [java.lang.ClassNotFoundException: com.sun.xml.internal.bind.v2.ContextFactory] at javax.xml.bind.ContextFinder.newInstance(ContextFinder.java:278) at javax.xml.bind.ContextFinder.find(ContextFinder.java:421) at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:721) at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:662) at org.hibernate.boot.cfgxml.internal.JaxbCfgProcessor.unmarshal(JaxbCfgProcessor.java:122) ... 5 more Caused by: java.lang.ClassNotFoundException: com.sun.xml.internal.bind.v2.ContextFactory 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:521) at javax.xml.bind.ServiceLoaderUtil.nullSafeLoadClass(ServiceLoaderUtil.java:122) at javax.xml.bind.ServiceLoaderUtil.safeLoadClass(ServiceLoaderUtil.java:155) at javax.xml.bind.ContextFinder.newInstance(ContextFinder.java:276) ... 9 more
项目代码
User.java
package org.studyeasy.hibernate.entity; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.Table; @Entity @Table(name = "user") public class User { @Id @Column(name = "id") int id; @Column(name = "username") String username; @Column(name = "password") String password; @Column(name = "first_name") String firstName; @Column(name = "last_name") String lastName; public User(String username, String password, String firstName, String lastName) { this.username = username; this.password = password; this.firstName = firstName; this.lastName = lastName; } public int getUserId() { return id; } public void setUserId(int id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getFirstName() { return firstName; } public void setFirstName(String firstName) { this.firstName = firstName; } public String getLastName() { return lastName; } public void setLastName(String lastName) { this.lastName = lastName; } }
App.java
package org.studyeasy.hibernate; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; import org.studyeasy.hibernate.entity.User; public class App { public static void main(String[] args) { SessionFactory factory = new Configuration().configure("hibernate.cfg.xml").addAnnotatedClass(User.class) .buildSessionFactory(); Session session = factory.getCurrentSession(); try { // 创建实体类对象 User user = new User("username", "password", "firstName", "lastName"); // 开启事务 session.beginTransaction(); // 执行保存操作 session.save(user); // 提交事务 session.getTransaction().commit(); System.out.println("数据插入成功!"); } finally { session.close(); factory.close(); } } }
hibernate.cfg.xml
<!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> <!-- 数据库连接配置 --> <property name="connection.driver_class">com.mysql.jdbc.Driver</property> <property name="dialect">org.hibernate.dialect.MySQLDialect</property> <!-- 示例MySQL连接URL --> <property name="connection.url">jdbc:mysql://localhost:3306/project</property> <property name="connection.username">root</property> <property name="connection.password">root</property> <!-- 控制台显示SQL语句 --> <property name="show_sql">true</property> <!-- 设置会话上下文模型 --> <property name="current_session_context_class">thread</property> </session-factory> </hibernate-configuration>
最终解决方法
将普通Java项目转为Maven项目,通过pom.xml添加所有必要依赖后,问题解决。感谢@Jens的帮助。
内容的提问来源于stack exchange,提问作者I. Riahi
相关产品推荐
相关产品推荐

