ClassNotFoundException vs. NoClassDefFoundError

ClassNotFoundException

关于ClassNotFoundException发生的原因,这篇文章ClassNotFoundException vs. NoClassDefFoundError写得很清晰。

总的来说就是:

  • 需要加载的类在classpath中找不到,一般这种情况都是使用类似Class.forName("oracle.jdbc.driver.OracleDriver")的方式获取类不存在

解决问题的思路:

  • 排查导入的jar包,对于使用maven的程序来说,就是去检查pom.xml中的配置
  • 如果配置的有的话就去看一下maven实际导入的jar包中,对应路径下是否有这个类

NoClassDefFoundError

关于ClassNotFoundException发生的原因,这篇文章ClassNotFoundException vs. NoClassDefFoundError写得很清晰。

总的来说就是:

  • 这个类编译时有,但是运行时没有

解决问题的思路:

  • 缩小范围,确定是哪个类的definition找不到。确定原因后再定解决办法

以下我演示两个NoClassDefFoundError的情景。

NoClassDefFoundError的情景

情景1.

B项目依赖了A项目,并配置<optional>为true。

<dependency>
<groupId>com.example</groupId>
<artifactId>a</artifactId>
<version>0.0.1-SNAPSHOT</version>
<optional>true</optional>
</dependency>

C项目依赖了B项目,并调用B项目中的某个方法,该方法调用了A项目的代码。

此时会发生NoClassDefFoundError报错。

情景2.

  • B项目依赖了A项目
  • C项目依赖了B项目
  • C项目也依赖了A项目

C项目调用B项目中的某个方法,该方法调用了A项目xxx类的代码。

正常来说这个过程是没问题的,但是B项目、C项目使用的A项目版本不同。

A项目xxx类在这两个版本的包路径不同。

这个是我用hutool的过程中发现的一个问题,NetUtil在项目不同版本中包位置不一样。

Note.

需要注意的一点是,如上两个情景,虽然都是因为少了A项目的代码,所以一般堆栈信息会直接报错是找不到A项目某个类的definition。

但如果使用A项目的代码是在B项目的static块中(<cinit>方法执行失败),那么此时会报的是找不到B项目这个类的definition。

NoClassDefFoundError的两种情况的更多相关文章

  1. java项目打jar包的两种情况

    链接地址:http://jingyan.baidu.com/article/6b97984d8a6ddc1ca2b0bfa0.html 本文介绍一下java项目打jar包时的两种情况各怎么操作   方 ...

  2. Day6------------磁盘用满的两种情况

    1.文件包含元数据和写入的内容 元数据:存在硬盘中的inode ls -i /etc/passwd.bak 查看inode df -i 查看inode 2.磁盘用满的两种情况 1).内容太多 2).空 ...

  3. JS获取元素宽高的两种情况

    JS获取元素宽高分两种情况, 一.内联样式,也就是直接把width和height写在HTML元素中的style里: 这种情况使用     document.getElementById('xxx'). ...

  4. Hibernate多对多两种情况

    Hibernate在做多对多映射的时候,除了原先的两张表外,会多出一个中间表做关联,根据中间表的会有两种不同的配置情况: 1.中间表不需要加入额外数据. 2.中间表有其他字段,需记录额外数据. 下面, ...

  5. 导致“mysql has gone away”的两种情况

    导致“mysql has gone away”的两种情况 By Cruise 1.  wait_timeout参数 在开发代理server时, 我使用了jdbc连接数据库,并采用长连接的方式连接数据库 ...

  6. Nginx访问PHP文件的File not found错误处理,两种情况

    这个错误很常见,原有有下面两种几种 1. php-fpm找不到SCRIPT_FILENAME里执行的php文件 2. php-fpm不能访问所执行的php,也就是权限问题 第一种情况 可以在你的loc ...

  7. zoj3228 Searching the String AC自动机查询目标串中模式串出现次数(分可覆盖,不可覆盖两种情况)

    /** 题目:zoj3228 Searching the String 链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=34 ...

  8. django-将数据库数据转换成JSON格式(ORM和SQL两种情况)

    最近打算搞一个自动化运维平台,所以在看Django的知识. 在实际项目开发中,遇到一个小问题:前后端发生数据交互主流采用的是JSON.前端传数据到服务器端比较简单,稍微麻烦的是服务器端传JSON到前端 ...

  9. linux磁盘用满的两种情况

    首先查看分区的内存使用情况和inode使用情况 第一种情况,内存用完: 我们拿分区sdb5来做实验 查看内存使用情况和inode使用情况: 第二种情况:inode使用完 我们在该分区下创建很多空文件 ...

  10. ie 9 position:fixed 无效的两种情况

    第一种情况: 运行发现在Google Chrome,FireFox都可以的,但是在IE9就不行了很是郁闷,因为IE6以上的版本都是支持fixed的属性的:上网上找了好久没找到,因为不知道关键字该怎么搜 ...

随机推荐

  1. 13.MongoDB系列之分片简介

    1. 分片概念 分片是指跨机器拆分数据的过程,有时也会用术语分区.MongoDB既可以手工分片,也支持自动分片 2. 理解集群组件 分片的目标之一是由多个分片组成的集群对应用程序来说就像是一台服务器. ...

  2. VS code 如何使用HTML Boilerplate插件

    此插件是一个HTML 模版插件,可以摆脱为 HTML 新文件重新编写头部和正文标签的苦恼. 只需在空文件中输入 html,并按 tab 键,即可生成干净的文档结构.也可以输入!,然后按tab键或者en ...

  3. 9.异步redis

    在使用Python代码操作redis时候,连接.操作.断开都是网络IO #安装支持异步redis的模块 pip3 install aioredis async def execute(address, ...

  4. C# Interlocked 类

    [前言] 在日常开发工作中,我们经常要对变量进行操作,例如对一个int变量递增++.在单线程环境下是没有问题的,但是如果一个变量被多个线程操作,那就有可能出现结果和预期不一致的问题. 例如: stat ...

  5. Golang 加密方法

    如果想直接使用我下列的库 可以直接go get 我的github go get -u github.com/hybpjx/InverseAlgorithm md5 加密--不可逆 MD5信息摘要算法是 ...

  6. day10-Tomcat02

    Tomcat02 4.IDEA开发JavaWeb工程 4.1开发javaweb工程&配置Tomcat&启动项目 需求:使用idea开发javaweb工程fishWeb,并将网页部署到f ...

  7. ABAP 调用HTTP上传附件

    1.需求说明 在SAP中调用第三方文件服务器的HTTP请求,将文件保存在文件服务器上,并返回保存的文件地址.SAP保存返回的文件地址,通过浏览器进行访问. 2.需求实现 2.1.POSTMAN测试 通 ...

  8. Java注解和反射笔记

    Java注解和反射笔记 1 注解 1.1 定义 Annotation是从JDK1.5开始引入的技术 作用 不是程序本身,可以对程序作出解释 可以被其他程序(编译器等)读取 格式 @注释名,可以添加一些 ...

  9. SpringBoot使用poi实现导出excel

    //实体类 //导出的数据的实体 public class User { private String id; private String name; private String year; // ...

  10. Go语言核心36讲16----接口

    你好,我是郝林,今天我们来聊聊接口的相关内容. 前导内容:正确使用接口的基础知识 在Go语言的语境中,当我们在谈论"接口"的时候,一定指的是接口类型.因为接口类型与其他数据类型不同 ...