Python
Java
PHP
IOS
Android
Nodejs
JavaScript
Html5
Windows
Ubuntu
Linux
如何解决java.lang.NoClassDefFoundError--第二部分
2023-11-08
如何解决NoClassDefFoundError--第二部分
第一部分请看:
http://vipcowrie.iteye.com/blog/1561291
本文面向的是JAVA初学者,建议你们自己编译和运行例子程序。
本文包含了NoClassDefFoundError的原因分析和例子程序,并且给出了建议的处理策略。
NoClassDefFoundError 问题原因1:缺少jar包
首先最常见的原因是classpath的配置问题。例子程序:
本例子程序尝试创建一个新的CallerClassA实例,然后执行他的一个方法,此方法引用了类ReferencingClassA,本例子演示了classpath问题导致的NoClassDefFoundError ,本例子还打印了当前的classloader chain的情况,以便进一步的分析。这个打印信息对你以后分析此类问题也很有帮助的:
程序
Java代码
public
class
NoClassDefFoundErrorSimulator {
public
static
void
main(String[] args) {
System.out
.println(
"java.lang.NoClassDefFoundError Simulator"
);
// Print current Classloader context
System.out.println(
"\nCurrent ClassLoader chain: "
+ ClassloaderUtil.getCurrentClassloaderDetail());
// 1. Create a new instance of CallerClassA
CallerClassA caller =
new
CallerClassA();
// 2. Execute method of the caller
caller.doSomething();
System.out.println(
"done!"
);
}
}
Java代码
public
class
CallerClassA {
private
final
static
String CLAZZ = CallerClassA.
class
.getName();
static
{
System.out.println(
"Classloading of "
+ CLAZZ +
" in progress..."
+ ClassloaderUtil.getCurrentClassloaderDetail());
}
public
CallerClassA() {
System.out.println(
"Creating a new instance of "
+ CallerClassA.
class
.getName() +
"..."
);
}
public
void
doSomething() {
// Create a new instance of ReferencingClassA
ReferencingClassA referencingClass =
new
ReferencingClassA();
}
}
Java代码
public
class
ReferencingClassA {
private
final
static
String CLAZZ = ReferencingClassA.
class
.getName();
static
{
System.out.println(
"Classloading of "
+ CLAZZ +
" in progress..."
+ ClassloaderUtil.getCurrentClassloaderDetail());
}
public
ReferencingClassA() {
System.out.println(
"Creating a new instance of "
+ ReferencingClassA.
class
.getName() +
"..."
);
Maps.newHashMap();
}
public
void
doSomething() {
// nothing to do...
}
}
打印classloader工具类:
Java代码
public
class
ClassloaderUtil {
public
static
String getCurrentClassloaderDetail() {
StringBuffer classLoaderDetail =
new
StringBuffer();
Stack<ClassLoader> classLoaderStack =
new
Stack<ClassLoader>();
ClassLoader currentClassLoader = Thread.currentThread()
.getContextClassLoader();
classLoaderDetail
.append(
"\n-----------------------------------------------------------------\n"
);
// Build a Stack of the current ClassLoader chain
while
(currentClassLoader !=
null
) {
classLoaderStack.push(currentClassLoader);
currentClassLoader = currentClassLoader.getParent();
}
// Print ClassLoader parent chain
while
(classLoaderStack.size() >
0
) {
ClassLoader classLoader = classLoaderStack.pop();
// Print current
classLoaderDetail.append(classLoader);
if
(classLoaderStack.size() >
0
) {
classLoaderDetail.append(
"\n--- delegation ---\n"
);
}
else
{
classLoaderDetail.append(
" **Current ClassLoader**"
);
}
}
classLoaderDetail
.append(
"\n-----------------------------------------------------------------\n"
);
return
classLoaderDetail.toString();
}
}
正常运行
:
Java代码
java -classpath .;../guava-
12.0
.jar NoClassDefFoundError.NoClassDefFoundErrorSimulator
java.lang.NoClassDefFoundError Simulator
Current ClassLoader chain:
-----------------------------------------------------------------
sun.misc.Launcher$ExtClassLoader
@addbf1
--- delegation ---
sun.misc.Launcher$AppClassLoader
@19821f
**Current ClassLoader**
-----------------------------------------------------------------
Classloading of NoClassDefFoundError.CallerClassA in progress...
-----------------------------------------------------------------
sun.misc.Launcher$ExtClassLoader
@addbf1
--- delegation ---
sun.misc.Launcher$AppClassLoader
@19821f
**Current ClassLoader**
-----------------------------------------------------------------
Creating a
new
instance of NoClassDefFoundError.CallerClassA...
Classloading of NoClassDefFoundError.ReferencingClassA in progress...
-----------------------------------------------------------------
sun.misc.Launcher$ExtClassLoader
@addbf1
--- delegation ---
sun.misc.Launcher$AppClassLoader
@19821f
**Current ClassLoader**
-----------------------------------------------------------------
Creating a
new
instance of NoClassDefFoundError.ReferencingClassA...
done!
异常重现
:
Java代码
java -classpath . NoClassDefFoundError.NoCl
java.lang.NoClassDefFoundError Simulator
Current ClassLoader chain:
-----------------------------------------------------------------
sun.misc.Launcher$ExtClassLoader
@addbf1
--- delegation ---
sun.misc.Launcher$AppClassLoader
@19821f
**Current ClassLoader**
-----------------------------------------------------------------
Classloading of NoClassDefFoundError.CallerClassA in progress...
-----------------------------------------------------------------
sun.misc.Launcher$ExtClassLoader
@addbf1
--- delegation ---
sun.misc.Launcher$AppClassLoader
@19821f
**Current ClassLoader**
-----------------------------------------------------------------
Creating a
new
instance of NoClassDefFoundError.CallerClassA...
Classloading of NoClassDefFoundError.ReferencingClassA in progress...
-----------------------------------------------------------------
sun.misc.Launcher$ExtClassLoader
@addbf1
--- delegation ---
sun.misc.Launcher$AppClassLoader
@19821f
**Current ClassLoader**
-----------------------------------------------------------------
Creating a
new
instance of NoClassDefFoundError.ReferencingClassA...
Exception in thread
"main"
java.lang.NoClassDefFoundError: com/google/common/collect/Maps
at NoClassDefFoundError.ReferencingClassA.<init>(ReferencingClassA.java:
28
)
at NoClassDefFoundError.CallerClassA.doSomething(CallerClassA.java:
31
)
at NoClassDefFoundError.NoClassDefFoundErrorSimulator.main(NoClassDefFoundErrorSimulator.jav
Caused by: java.lang.ClassNotFoundException: com.google.common.collect.Maps
at java.net.URLClassLoader$
1
.run(URLClassLoader.java:
202
)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:
190
)
at java.lang.ClassLoader.loadClass(ClassLoader.java:
306
)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:
301
)
at java.lang.ClassLoader.loadClass(ClassLoader.java:
247
)
...
3
more
发生了什么?当你在classpath中不包含guava的引用的时候,由于ReferencingClassA在运行期引用了此类,导致了classloader报告找不到此类,从而出现NoClassDefFoundError。
classloader分析
注意:
Java代码
Classloading of NoClassDefFoundError.CallerClassA in progress...
-----------------------------------------------------------------
sun.misc.Launcher$ExtClassLoader
@addbf1
--- delegation ---
sun.misc.Launcher$AppClassLoader
@19821f
**Current ClassLoader**
-------------------------
sun.misc.Launcher$AppClassLoader是系统的classloader,负责根据classpath设置在启动的时候加载应用需要的class。
sun.misc.Launcher$ExtClassLoader是扩展classloader,负责从java_home/lib/etc以及其他使用java.ext.dirs配置的目录从加载扩展java class。
从打印结果可以看出,sun.misc.Launcher$ExtClassLoader是系统classloader的实际父类。
建议处理策略
分析异常堆栈,找到缺少的java类名称,在classpath中验证,确保编译和运行期都能找到此类。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)
Java
如何解决java.lang.NoClassDefFoundError--第二部分 的相关文章
更改启动 Java 运行时后 IntelliJ IDEA 无法在 Ubuntu 上启动
之前 我的 IntelliJ 运行得很好 但我使用的是 java 6 所以我的项目无法使用 gradle 运行 我用命令将java切换到版本8sudo update alternatives config java 我检查了java ver
中断并标签,“标签 MyLabel 丢失”
我有这样的代码 if condition1 break MyLabel while true some code here MyLabel if condition2 break more code here 我收到此错误 标签 MyLab
Spring安全+LocaleResolver
我需要在身份验证成功后更改区域设置 区域设置解析器
Hibernate 每个子类一个表继承策略的效率
我正在考虑 Hibernate 管理的类层次结构的表布局 当然 每个子类表技术在我看来是一般意义上最合适的 然而 通过逻辑思考 我对其性能有些担忧 尤其是随着子类数量的扩展 举一个非常简短 且经典 的示例 假设您有以下类 public ab
Grails 项目 - Servlet 调用 - ClassNotFoundException:javax.servlet.AsyncContext
我在用 IntelliJ IDEA 终极版 12 4 grails 2 2 0 BuildConfig groovy 文件中的 grails servlet version 2 5 并实现了简单的 servlet post 请求 使用 RE
模式更新后 jOOQ 生成的类的运行时验证?
我用org jooq util DefaultGenerator在构建过程中生成 jOOQ 类来表示我的数据库模式 当应用程序运行时 架构预计会在应用程序不知情的情况下发生更改 此类更改可能与已生成的代码兼容 也可能不兼容 如何在运行时检测
如何将日期字符串解析为Date? [复制]
这个问题在这里已经有答案了 如何将下面的日期字符串解析为Date object String target Thu Sep 28 20 29 30 JST 2000 DateFormat df new SimpleDateFormat E
NIO 直接缓冲区何时以及如何被释放?
我有一个 C 库 需要一个临时缓冲区作为暂存空间 我正在考虑将直接字节缓冲区的地址传递给它 在最终释放缓冲区之前 是否允许虚拟机重新定位缓冲区 JNI 框架消失后 本机库将保留该指针 我的理解是 JNI 本地对象引用无法缓存 因为 VM 可
JTree ConvertValueToText 返回在更改时被截断
我有一个自定义树实现convertValueToText 此实现取决于某些全局状态 如果返回的字符串比先前返回的字符串更长 实际上我认为更宽 因为以像素为单位触发它 则文本将被截断并用 填充 当重绘是由 取消 选择元素或某个元素引起时 情况
为什么不自动装箱泛型的 Java 基本类型?
Java 不允许在通用数据结构中使用原始类型 例如 不允许使用 ArrayList 原因是 原始类型不能直接转换为Object 然而 Java 1 5 确实支持自动装箱 并且包装类在通用数据结构中工作 那么为什么编译器不能将其自动装箱到 A
合并和颜色样式不适用于 Apache POI excel 2003 格式
在 Apache POI 中 我为某些单元格应用了一些样式并合并了这些单元格 当我在 2010 年或 2007 年打开时 它工作正常 但在 2003 年 格式样式消失了 每次保存 2003 Excel 文件之前都会弹出兼容性检查对话框 请参
我可以使用 Selenium Webdriver 测试元素的顺序吗?
有一个表单 其中有 3 个字段 具有 3 个不同的 ID fieldset div div fieldset
ThreadPoolExecutor 和队列
我以为使用线程池执行器 http docs oracle com javase 6 docs api java util concurrent ThreadPoolExecutor html我们可以提交Runnables 要在以下位置执行B
如何在 QueryDSL 中选择文字
我目前正在开发一个使用 queryDSL 和 hibernate 的项目 其中它需要一个选择文字 按照发布的示例here https stackoverflow com questions 18691317 querydsl how to
在 java 8 下使用泛型出现类型错误,但在 java 7 下则不然
我有一段代码可以在 java 7 下编译良好 但不能在 java 8 下编译 这是一个独立的重现示例 我已经采用了显示此问题的真实代码并删除了所有实现 import java util Iterator class ASTNode
Java 声音可视化器
我正在尝试制作一个java声音可视化工具 但我完全不知道如何在实时处理音频后立即从提取的音频中获取字节 我可以将程序与 wav 文件同步 但这不是我想要做的 我想用程序生成声音 然后播放它 而不将其保存在任何地方 谢谢您的帮助 本文可以帮助
java中永远不会出现的异常
我为点和向量编写一个类 我想用它们来计算向量的点和范数 这些是点类和向量类 public class Point public float x y public class MyVector public Point start end 我
在 Apache Servicemix 4 中的 OSGi 包之间共享配置文件?
有人能够在 SMX4 中的两个或多个捆绑包之间成功共享配置吗 我正在寻找的是这样的 有一个文件 SMX HOME etc myconfiguration cfg 使此配置 可用 以便使用 Spring dm 通过 OSGi 配置管理将其注入
如何从 Sublime Text 编辑器调试 Java 应用程序
有时我正在对相当大的 Java 应用程序进行简单的修复 但我不想打开 Eclipse 来执行此任务 Eclipse 启动时间很长 并且由于该项目是由大量子项目构建的 而这些子项目无论如何都是由 Maven 构建的 因此需要很长时间才能使用
如何在 Hibernate 中自动递增复合主键中的 Id?
我有一个带有复合主键的表 groupId and batchId 实体类看起来像 Entity name EMPLOYEE public class Employee EmbeddedId private EmployeePK employ
随机推荐
解决VSCODE 因为在此系统上禁止运行脚本 报错
文章转载自 https blog csdn net larpland article details 101349586 学习react的时候 在VSCODE中使用yarn 结果报错 找了下原因 是因为PowerShell执行策略的问题 解
基于matlab的人脸识别算法
基于matlab的人脸识别算法 1 主成分的数目的选取 前已指出 设有p个随机变量 便有p个主成分 由于总方差不增不减 C1 C2等前几个综合变量的方差较大 而Cp Cp 1等后几个综合变量的方差较小 严格说来 只有前几个综合变量才称得上主
VC++ 隐藏控制台程序窗口
转自 http hi baidu com sicceer blog item d9c35a810d15c4c8bc3e1ec8 html 设置 pragma comment linker subsystem windows entry ma
2021年总结和2022年规划(全面进行,take it easy)
先说下为啥要take it easy 算了笔账 如果今年就此失业 还有4200房贷 但是planb就是终身每月9200 还剩下5000 足够买菜自由了 所以控制消费欲望即可 别人是先编程到挣够后半辈子的钱 而我是逆行 先挣够后半辈子的钱再编
anaconda换清华镜像源(Windows)
第一步 在C Users 用户名 下输入如下图所示的命令 conda config set show channel urls yes 第二步 在下图路径 找到如下图蓝色标记的文件 第三步 用记事本打开上一步找到的文件 将里面的内容完全替换
解决1130 - Host ‘172.17.0.1‘ is not allowed to connect to this MySQL server
1 docker pull mysql 安装mysql 2 启动mysql容器 docker run name mysql p 3306 3306 e MYSQL ROOT PASSWORD 123456 d mysql 使用Navicat
C++中栈和队列、set、vector的基本使用方法
在算法中栈和队列的使用的频繁的 在学习算法的过程中栈 队列 set vector的使用方法我们一定要掌握 在C 中栈和队列 set vector已经被封装好了 我们可以直接通过以下步骤调用栈和队列 1 相关头文件 包含栈头文件 includ
Conda 创建,查看,激活,关闭激活,删除 虚拟环境的方法【亲测】
创建虚拟环境的方法 conda create n aa222 python 3 8 表示创建一个名字为aa222的环境 这环境用的python版本是3 8版本的 请根据自己的python版本进行选择 也可以使用下面的方法创建 conda c
Java连接kafka
1 maven依赖
线上问题排查-HBase写数据出现NotServingRegionException(Region ... is not online)异常
今天线上遇到一个问题 有一台服务器的cpu持续冲高 排查发现是我们的一个java应用进程造成的 该进程在向hbase中写入数据时 日志不断地打印下面的异常 Copy org apache hadoop hbase NotServingReg
com.fasterxml.jackson.databind.exc.InvalidDefinitionException: No serializer found
fasterxml jackson 将对象转换为json报错处理 Spring Boot程序中 JsonIgnoreProperties与 JsonIgnore基本使用
python中的pd进行数据处理
1 用pd读取excel中的的某一列生成列表 并将集合或列表写进excel def excel one line to list df pd read excel r poi grid xlsx usecols 1 names None 读
Robot Framework Selenium UI自动化测试 --- 进阶篇
回顾 如果您对Robot Framework Selenium 以下简称RFS 没有基础概念和使用经验 请先阅读入门篇 入门篇对RFS有基础的介绍和使用教程 展望 本篇主要讲述了如何工程化的使用RFS 并穿插介绍各种常用关键字和使用技巧 希
vue3 数组清空与重新赋值
vue3里面 如果数组是用reactive 声明的 要清空数组得用list length 0 如果想要使用list 或者直接赋值类型list 1 2 3 4 5 得把数组用ref 来声明 然后用list value 来修改 然后如果是对象里
使用Stream流,根据条件去重并求数量
一 去重类型 1 先创建数据 放入4个对象 其中有两个对象name属性相同 求name不一样的对象有多少数量 List
锈湖新作地铁繁花试玩版正式上线啦
地铁繁花是锈湖厂商新作点击式解谜冒险解谜游戏 英文名称为 Underground Blossom 在游戏中你将深入锈湖的地下 扮演并追溯Laura Vanderboom的人生和记忆吧 从一个车站到另一个车站 每个地铁站都象征着劳拉的一段过去
Ubuntu16.04下安装JDK1.8
前提条件 拥有Ubuntu16 04环境 安装步骤 下载JDK安装包 下载版本 jdk 8u171 linux x64 tar gz 下载方式 云盘下载 云盘下载 提取码 7brp 官网下载 https www oracle com tec
python获取clickhouse数据表的全部列名称
使用python获取的方法 import clickhouse connect client clickhouse connect get client host 127 0 0 1 def get col name table name
详解:Char 和 varChar 之间的区别
MySQL中的字符串有两个常用的类型 char和varchar 二者各有优势 下面我们来详细分析一下 通常在建表的时候对于String 类型的数据定义我们或许会很纠结 什么时候用char 什么时候用 varchar 呢 首先可以明确的是 c
如何解决java.lang.NoClassDefFoundError--第二部分
如何解决NoClassDefFoundError 第二部分 第一部分请看 http vipcowrie iteye com blog 1561291 本文面向的是JAVA初学者 建议你们自己编译和运行例子程序 本文包含了NoClassDef
热门标签
线程安全的list
线程安全list
制作数据集
国产系统
kylinos
C Primer
ajax发送跨域请求
线性代数的几何意义
2019政府定制版本
WPS Office
Audino
图理论基础
计蒜客题库
ua获取手机型号
大厂面试算法指南
c语言常用算法归纳
鼠标键盘事件
wait命令
文献翻译
挑战难题
reycleview