NoClassDefFoundError的两种情况
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的两种情况的更多相关文章
- java项目打jar包的两种情况
链接地址:http://jingyan.baidu.com/article/6b97984d8a6ddc1ca2b0bfa0.html 本文介绍一下java项目打jar包时的两种情况各怎么操作 方 ...
- Day6------------磁盘用满的两种情况
1.文件包含元数据和写入的内容 元数据:存在硬盘中的inode ls -i /etc/passwd.bak 查看inode df -i 查看inode 2.磁盘用满的两种情况 1).内容太多 2).空 ...
- JS获取元素宽高的两种情况
JS获取元素宽高分两种情况, 一.内联样式,也就是直接把width和height写在HTML元素中的style里: 这种情况使用 document.getElementById('xxx'). ...
- Hibernate多对多两种情况
Hibernate在做多对多映射的时候,除了原先的两张表外,会多出一个中间表做关联,根据中间表的会有两种不同的配置情况: 1.中间表不需要加入额外数据. 2.中间表有其他字段,需记录额外数据. 下面, ...
- 导致“mysql has gone away”的两种情况
导致“mysql has gone away”的两种情况 By Cruise 1. wait_timeout参数 在开发代理server时, 我使用了jdbc连接数据库,并采用长连接的方式连接数据库 ...
- Nginx访问PHP文件的File not found错误处理,两种情况
这个错误很常见,原有有下面两种几种 1. php-fpm找不到SCRIPT_FILENAME里执行的php文件 2. php-fpm不能访问所执行的php,也就是权限问题 第一种情况 可以在你的loc ...
- zoj3228 Searching the String AC自动机查询目标串中模式串出现次数(分可覆盖,不可覆盖两种情况)
/** 题目:zoj3228 Searching the String 链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=34 ...
- django-将数据库数据转换成JSON格式(ORM和SQL两种情况)
最近打算搞一个自动化运维平台,所以在看Django的知识. 在实际项目开发中,遇到一个小问题:前后端发生数据交互主流采用的是JSON.前端传数据到服务器端比较简单,稍微麻烦的是服务器端传JSON到前端 ...
- linux磁盘用满的两种情况
首先查看分区的内存使用情况和inode使用情况 第一种情况,内存用完: 我们拿分区sdb5来做实验 查看内存使用情况和inode使用情况: 第二种情况:inode使用完 我们在该分区下创建很多空文件 ...
- ie 9 position:fixed 无效的两种情况
第一种情况: 运行发现在Google Chrome,FireFox都可以的,但是在IE9就不行了很是郁闷,因为IE6以上的版本都是支持fixed的属性的:上网上找了好久没找到,因为不知道关键字该怎么搜 ...
随机推荐
- mybatis框架图
- sql面试50题------(21-30)
文章目录 21.查询不同老师所教不同课程平均分从高到低显示 23.使用分段[100,85),[85,70),[70,60),[<60] 来统计各科成绩,分别统计各分数段人数:课程ID和课程名称 ...
- jquery根据自定义属性选择标签
<div myattr="test"></div> 使用$("div[myattr='test']")进行选择 <a href=& ...
- 长文梳理muduo网络库核心代码、剖析优秀编程细节
前言 muduo库是陈硕个人开发的tcp网络编程库,支持Reactor模型,推荐大家阅读陈硕写的<Linux多线程服务端编程:使用muduo C++网络库>.本人前段时间出于个人学习.找工 ...
- 脚本之一键部署nexus
NEXUS_URL="https://download.sonatype.com/nexus/3/nexus-3.39.0-01-unix.tar.gz" #NEXUS_URL=& ...
- mybatis-自定义映射resultMap
自定义映射resultMap resultMap处理字段和属性的映射关系 resultMap:设置自定义映射 属性: id:表示自定义映射的唯一标识,不能重复 type:查询的数据要映射的实体类的类型 ...
- clang在编译时指定目标文件所需的最低macOS版本
调研这个的原因,是因为有个同事在macOS 12.2上打包好的程序,放在macOS 10.15上运行时报错: Dyld Error Message: Symbol not found: __ZNKS ...
- Excel中的VLOOKUP函数
VLOOKUP函数是Excel中的一个纵向查找函数,功能是按列查找,最终返回该列所需查询序列所对应的值. 该函数的语法规则如下: VLOOKUP(lookup_value,table_array,co ...
- 使用idea创建第一个Mybatis程序及可能遇到的问题
第一个Mybatis程序 思路:搭建环境->导入Mybatis->编写代码->执行 搭建环境 创建数据库 CREATE DATABASE `mybatis` USE `mybatis ...
- MessagePack 和System.Text.Json 序列号 反序列化对比
本博客将测试MessagePack 和System.Text.Json 序列号 反序列化性能 项目文件: Program.cs代码: using BenchmarkDotNet.Running; us ...
