真正解决方案:java.lang.ClassNotFoundException: javax.xml.bind.JAXBException

真正解决方案:java.lang.ClassNotFoundException: javax.xml.bind.JAXBException今天在使用JDK9.0环境下使用Hibernate时候出现了这个错误,错误日志如下:故障原因:JAXBAPI是javaEE的API,因此在javaSE9.0中不再包含这个Jar包。java9中引入了模块的概念,默认情况下,JavaSE中将不再包含javaEE的Jar包而在java6/7/8时关于这个API都是捆绑在一起的…

大家好,又见面了,我是你们的朋友全栈君。

真正解决方案:java.lang.ClassNotFoundException: javax.xml.bind.JAXBException

1. 故障描述

今天在使用JDK 9.0 环境下使用Hibernate 时候出现了这个错误,错误日志如下:

这里写图片描述

2. 故障原因分析

JAXB API是java EE 的API,因此在java SE 9.0 中不再包含这个 Jar 包。
java 9 中引入了模块的概念,默认情况下,Java SE中将不再包含java EE 的Jar包
而在 java 6/7 / 8 时关于这个API 都是捆绑在一起的

3.解决方案

3.1 解决方案一

降低JDK 9 版本到 JDK 6/7/8

3.2 解决方案二(亲测可行)

手动加入这些依赖Jar包

要解决这个问题,我导入了下面这四个Jar包修复成功。

javax.activation-1.2.0.jar

jaxb-api-2.3.0.jar

jaxb-core-2.3.0.jar

jaxb-impl-2.3.0.jar

下载上面这些文件和复制他们到libs文件夹下,
添加他们导入到Build Path中
重新运行即可

3.3 解决方案三

Maven项目可添加如下依赖:

<!-- Java 6 = JAX-B Version 2.0 -->
<!-- Java 7 = JAX-B Version 2.2.3 -->
<!-- Java 8 = JAX-B Version 2.2.8 -->
<dependencies>
    <dependency>
        <groupId>javax.xml.bind</groupId>
        <artifactId>jaxb-api</artifactId>
        <version>2.3.0</version>
    </dependency>
    <dependency>
        <groupId>com.sun.xml.bind</groupId>
        <artifactId>jaxb-impl</artifactId>
        <version>2.3.0</version>
    </dependency>
    <dependency>
        <groupId>com.sun.xml.bind</groupId>
        <artifactId>jaxb-core</artifactId>
        <version>2.3.0</version>
    </dependency>
    <dependency>
        <groupId>javax.activation</groupId>
        <artifactId>activation</artifactId>
        <version>1.1.1</version>
    </dependency>
</dependencies>

Gradle 项目引入依赖:

dependencies { 
   
    // JAX-B dependencies for JDK 9+
    implementation "javax.xml.bind:jaxb-api:2.3.0"
    implementation "com.sun.xml.bind:jaxb-core:2.3.0"
    implementation "com.sun.xml.bind:jaxb-impl:2.3.0"
    implementation "javax.activation:activation:1.1.1"
}

Tips:
建议使用中心仓库,否则可能某些jar找不到:

HTTP: http://repo1.maven.org/maven2
HTTPS:https://repo1.maven.org/maven2

原文地址

测试代码:

public class DatabaseConnectionTools { 
   
    private static final SessionFactory ourSessionFactory;

    static { 
   
        try { 
   
            Configuration configuration = new Configuration();
            configuration.configure();

            ourSessionFactory = configuration.buildSessionFactory();
        } catch (Throwable ex) { 
   
            throw new ExceptionInInitializerError(ex);
        }
    }

    public static Session getSession() throws HibernateException { 
   
        return ourSessionFactory.openSession();
    }

    public static void main(final String[] args) throws Exception { 
   
        final Session session = getSession();
        try { 
   
            System.out.println("querying all the managed entities...");
            final Metamodel metamodel = session.getSessionFactory().getMetamodel();
            for (EntityType<?> entityType : metamodel.getEntities()) { 
   
                final String entityName = entityType.getName();
                final Query query = session.createQuery("from " + entityName);
                System.out.println("executing: " + query.getQueryString());
                for (Object o : query.list()) { 
   
                    System.out.println(" " + o);
                }
            }
        } finally { 
   
            session.close();
        }
    }
}

Tips: 如果做完上述操作,仍然报错,请检查out 文件夹下的lib 文件夹中是否包含刚添加的几个Jar包,如果没有,那么请继续下面的操作:
这里写图片描述
选中project,然后右键选择open module settings
这里写图片描述
然后检查Problem选项卡,检查右侧是否有‘Fixed’ 字样,如果有,请点击’Fixed’
这里写图片描述

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/162495.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • win10 VMware 虚拟机 实现桥接模式 上网

    win10 VMware 虚拟机 实现桥接模式 上网前言:  可能很多朋友想用VMware在自己的windows系统上体验下其它操作系统或者运行某些只能在Linux上的软件。但是可能自己买阿里云或者腾讯云感觉划不来。下面我来简单的来告诉大家,运用VMware的桥接模式,可以让大家像拥有另外一台不同操作系统的电脑一样在局域网中。同样可以来上网,可以和局域网中的其他机器一样通信,甚至可以暴露ip与端口到公网中,这样其他机器或者网页等也能访问它。环境…

    2022年6月14日
    161
  • android registerreceiver() 参数,android – 如何使用registerReceiver方法?

    android registerreceiver() 参数,android – 如何使用registerReceiver方法?我想使用动态注册的BroadcastReceiver有一个Activity的引用,所以它可以修改其UI。我使用Context.registerReceiver()方法,但接收器的onReceive()方法从未调用。这里是显示问题的示例代码:packagecom.example;importandroid.app.Activity;importandroid.app.IntentService…

    2022年9月12日
    0
  • shell脚本给文件重命名_linux移动或重命名文件命令

    shell脚本给文件重命名_linux移动或重命名文件命令文件A重命名为BmvAB;

    2022年9月10日
    0
  • KEIL_MDK生成Bin文件「建议收藏」

    KEIL_MDK生成Bin文件「建议收藏」1、MDK配置MDK是使用安装目录下的(formelf.exe)工具来生成bin文件,配置方法:勾选”Run#1″,在后面输入框写入bin文件生成方式2、绝对路径”D:\ProgramFiles\MDK516\ARM\ARMCC\bin\fromelf.exe”–bin-o./obj/test_app.bin./obj/test_app.axf”…

    2022年10月20日
    0
  • 解决: Linux – git: command not found

    解决: Linux – git: command not found出错原因:服务器没有安装GIT,所以导致出错。解决方法:Centos下使用:yuminstallgit-y或者yuminstall-ygitUbuntu/Debian下使用:apt-getinstallgit-y转自:https://my.oschina.net/u/1382365/blog/490262?p=1…

    2022年5月7日
    42
  • vggnet pytorch_Javaweb项目

    vggnet pytorch_Javaweb项目VGG网络是在2014年由牛津大学著名研究组VGG(VisualGeometryGroup)提出。

    2022年10月25日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号