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 中使用 Apache POI XWPF 在同一个 Word 文档中横向和纵向页面
我正在尝试使用 Java 和 Apache POI 库创建一个包含一些横向页面和一些纵向页面的 Word 文档 我可以更改所有页面的方向 但有没有办法只更改其中某些页面的方向 我尝试过使用不同的部分和主体 但无济于事 目前我已经编写了一个函
将对象列表传递给 Freemarker 然后循环
我已经熟悉了 FreeMarker 一个 Java 模板引擎 我已经能够通过哈希映射将对象传递给模板引擎了 这样就可以了 但是 一旦我尝试将任何类型的多个对象集传递给 FreeMarker 它就会给我一个 freemarker templa
如何使用 Apache Camel 路由从授权服务器获取访问令牌?
我有一个授权服务器 带有注释的简单类 SpringBootApplication RestController Configuration EnableAuthorizationServer oauth2 security 在端口上运行80
Spring 可以理解 @Inject 替换 Weld 作为 JSR-299 实现吗?
我从几个网页中注意到 Spring 3 0 显然支持来自 JSR 330 的 Inject 由于我们确实希望在 Web 应用程序和独立应用程序的库中使用 JSR 299 语法进行依赖项注入 并且有 Weld 的替代方案 因此如果 Sprin
使用Optional作为类中的属性是一个好习惯吗? [复制]
这个问题在这里已经有答案了 我读过一些关于目的的内容Optional 不幸的是我不记得在哪里 在Java 8中 我很惊讶作者没有提到使用Optional作为类中的属性 由于我在课堂上经常使用选项 我想知道这是否是一个好的做法 或者我可以更好
Android 背景 + 文本 + 按钮图标
我想要一个图像设置为文本的背景 并在文本的左侧设置一个图标 在iPhone中非常简单 但不知道如何在Android上做到这一点 调整按钮的大小并保持图标 文本的位置和距离正确 iPhone 安卓我有这个 xml代码是
使用java在mysql中插入带有\\的文件路径
我正在使用java制作一个独立的应用程序 并且我需要插入用户从文件选择器中选择的图像的路径 我正在获取文件的路径 但是当我将其存储在数据库 mysql 中时 它不会存储 所以当我检索该路径时 该文件不会显示 如何存储文件的路径 这样就可以使
UiBinder 中的 gwt 按钮
我需要创建一个按钮 所以它是一个带有图像的按钮 gwt with UiBinder 但我不确定如何进行 这是我的ui xml code
在 Eclipse 中导航 Java 调用堆栈
在调试器中像GDB http sources redhat com gdb 当您在断点处停止时 您可以轻松地向上移动调用堆栈并检查相关的源和堆栈帧数据 在 Eclipse 中如何做到这一点 In the 调试视角 http www ibm
Spring @Transactional 并发
class MyService 公共无效a 同步 某个键 b Transactional 传播 传播 REQUIRES NEW 公共无效b 数据库工作吗 除非您使用代码编织 否则这是行不通的 Spring处理事务的默认方式是通过AOP代理
使用 Spring 注入 Google Guava Hashmultimap
是否可以提供一个创建示例Multimap
在 jFrame 中启用右键单击
嘿 我正在寻找如何使用 NetBeans 在 jFrame 中启用 仅且仅 右键单击并显示弹出菜单 使用我的代码 private void formMouseClicked java awt event MouseEvent evt pop
如何从 REstAssured 中的 Json 数组获取 JSON 对象
任何人都可以帮我解决这个场景 我是新来的RestAssured和处理JSON在我们的自动化脚本中 我有一个API谁的回应是JSONArray i e id 1002 entity testcase fieldName TextName di
如何告诉 Java SAX 解析器忽略无效字符引用?
当尝试使用字符引用解析不正确的 XML 时 例如 x1 Java 的 SAX 解析器因致命错误而惨死 例如 org xml sax SAXParseException Character reference x1 is an invalid
Spring @Configuration如何缓存对bean的引用
使用基于 Java 的配置时 Spring 如何防止再次调用 bar 我想知道编译时注释处理或通过代理方法 Configuration public class AppConfig Bean public Foo foo return ne
bean 中的 Spring JavaConfig 属性未设置?
我正在考虑将 Spring JavaConfig 与一些属性文件一起使用 但 bean 中的属性未设置 bean 中的属性未设置 这是我的网络配置 Configuration EnableWebMvc PropertySource valu
在 Java Web 应用程序中获取 DataSource 资源
我的 context xml 文件中有以下资源标记
@JsonCreator '无法找到具有名称的创建者属性',即使使用ignoreUnknown = true
我有以下课程 JsonIgnoreProperties ignoreUnknown true public class Topic private List
确保对象实现 Comparable
我有一个小问题 想知道如何解决它 我有一个通用类Tuple
使用反射 API 填充 Proto 中的地图字段
我正在尝试编写一个模块 该模块将获取 Message Builder 和从字段名称到值的映射 并将用值填充构建器 一切正常 直到我遇到地图字段 使用 Proto3 我收到一条特定消息 我知道我可以执行该消息的字段 builder b put
随机推荐
解决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
热门标签
单臂路由试验
自动生成SDK
云端开发
国家
移动游戏
模式匹配引擎
调试小问题
zabbix硬件
极客
C语言选择练习
属性文件注入
数据安全产品解读
蓝桥杯算法大全
分布式微服务中间件
我的2023
NRF52系列
php 万能密码
江湖路远