1. 程式人生 > >使用jdk9和Hibernate5時遇到java.lang.NoClassDefFoundError: javax/xml/bind/JAXBException

使用jdk9和Hibernate5時遇到java.lang.NoClassDefFoundError: javax/xml/bind/JAXBException

在編寫一個結構為Hibernate+DAO+Service+Servlet+JSP的maven小專案時

已經確保hibernate.cfg.xml關於資料層的配置沒有問題

在某次需要與資料庫互動的操作時,跳出了以下異常

java.lang.NoClassDefFoundError: javax/xml/bind/JAXBException
    org.hibernate.boot.spi.XmlMappingBinderAccess.<init>(XmlMappingBinderAccess.java:43)
    org.hibernate.boot.MetadataSources.<init>(MetadataSources.java:87)
    org.hibernate.cfg.Configuration.<init>(Configuration.java:123)
    org.hibernate.cfg.Configuration.<init>(Configuration.java:118)
    dao.impl.UserDAOImpl.userExists(UserDAOImpl.java:32)
    servlets.LoginServlet.doPost(LoginServlet.java:81)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:660)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
    filters.TokenFilter.doFilter(TokenFilter.java:18)

java.lang.ClassNotFoundException: javax.xml.bind.JAXBException
    org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1275)
    org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1104)
    org.hibernate.boot.spi.XmlMappingBinderAccess.<init>(XmlMappingBinderAccess.java:43)
    org.hibernate.boot.MetadataSources.<init>(MetadataSources.java:87)
    org.hibernate.cfg.Configuration.<init>(Configuration.java:123)
    org.hibernate.cfg.Configuration.<init>(Configuration.java:118)
    dao.impl.UserDAOImpl.userExists(UserDAOImpl.java:32)
    servlets.LoginServlet.doPost(LoginServlet.java:81)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:660)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
    filters.TokenFilter.doFilter(TokenFilter.java:18)

表明JAXB API classes沒有找到(原本在jdk6時引入)

報錯程式碼行為

Configuration config = new Configuration().configure();

顯然不是本身語句的原因

需要注意的是,使用的是jdk9

JAXB API是java EE的API,而java EE的API不再包含對java SE 9的模組中,因此JAXB APIs不再包含在java SE 9的預設類路徑中,因此引發了以上報錯

原本想通過新增javax.xml.bind包或者在pom.xml中新增相關依賴的方式解決問題(新增依賴方式如下)

<dependency>
<groupId>javax.xml.bind</groupId> <artifactId>jaxb-api</artifactId> <version>2.3.0</version> </dependency>
但意外的是,仍然是相同的異常,問題仍沒有解決。

因此,解除安裝了jdk9和jre9,重新安裝jdk8和jre8。

重新執行專案,進行相同操作時,沒有報相同的異常,問題得到解決。