如何解决NoClassDefFoundError--第二部分
第一部分请看:
http://vipcowrie.iteye.com/blog/1561291
本文面向的是JAVA初学者,建议你们自己编译和运行例子程序。
本文包含了NoClassDefFoundError的原因分析和例子程序,并且给出了建议的处理策略。
NoClassDefFoundError 问题原因1:缺少jar包
首先最常见的原因是classpath的配置问题。例子程序:
本例子程序尝试创建一个新的CallerClassA实例,然后执行他的一个方法,此方法引用了类ReferencingClassA,本例子演示了classpath问题导致的NoClassDefFoundError ,本例子还打印了当前的classloader chain的情况,以便进一步的分析。这个打印信息对你以后分析此类问题也很有帮助的:
程序
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!");
}
}
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();
}
}
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工具类:
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 -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 -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分析
注意:
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中验证,确保编译和运行期都能找到此类。
分享到:
相关推荐
### Java中的`java.lang.NoClassDefFoundError`: javax/mail/Message #### 错误概述 在Java编程过程中遇到`java.lang.NoClassDefFoundError`是一个常见的问题,这种异常通常发生在试图加载一个类时,该类在编译时...
JavaMail在进行电子邮件发送时,可能会遇到`java.lang.NoClassDefFoundError`异常,特别是当尝试使用`com.sun.mail.util.LineInputStream`类时。这个异常通常表示在运行时找不到某个类的定义,即使该类在编译时是...
在Java的标准库中,并没有内置的`isHexDigit`函数,但在一些自定义的代码或者第三方库中可能会看到这个函数,它的作用是验证输入的字符是否能作为十六进制数的一部分。 问题可能出在以下几个方面: 1. **编码不...
poi word转pdf报java.lang.NoClassDefFoundError :org/apache/poi/POIXMLDocumentPart, 有两种方式解决 poi-ooxml3.1.X 升级 poi-ooxml4.1.2版本后与org.apache.poi.xwpf.converter.core-1.0.6.jar找不到/...
### Spark升级后遇到`java.lang.NoClassDefFoundError: org/apache/spark/Logging`问题解决方案 #### 一、问题背景及现象 在升级Spark至2.1版本之后,在使用streaming-kafka进行测试时,遇到了`java.lang....
通常来说,我们在日常开发中使用的是第3种方式,有时为了简便也会使用第2种方式,比如你要从一个很大的Json对象中只读取那么一两个字段的时候,采用databind方式显得有些重,JsonNode反而更简单。 作者:无知者云 ...
学习如何使用Derby UI Plugin对于Java 2的初学者来说,是一个很好的实践项目,可以提升数据库操作技能,并了解如何集成和使用第三方工具。此外,由于Derby是Java的一部分,熟悉它还可以帮助开发者深入理解Java的内存...
第一步:引入Jsoup和lang和lang3的依赖: ...第二步:直接使用即可: import org.apache.commons.lang.StringEscapeUtils; import org.apache.commons.lang3.StringUtils; import org.jsoup.Jsoup; im
写在前面 ...解压使用会出现几个bug,之前也是出现了,... Exception in thread “main” java.lang.NoClassDefFoundError: org/json/JSONObject 解决方法: 这是因为sqoop缺少java-json.jar包 下载java-json.jar包: http
从题目给出的部分内容中,可以看到一个具体的错误示例:“java.lang.NoClassDefFoundError: org/jdom/JDOMException”。这个错误表示在运行时找不到`JDOMException`这个类,通常是由于类路径(classpath)配置问题导致...
根据提供的文件信息,我们可以归纳...通过以上总结,我们可以看到Java面向对象程序设计第二版课后答案中涉及了Java编程的基础知识、数据类型、控制流语句等多个方面,旨在帮助学习者掌握Java编程的基本技能和思维模式。
`java.lang.NoClassDefFoundError`: 缺少 Struts2 Dojo 插件(`struts2-dojo-plugin-2.1.2.jar`) **异常描述**: 在使用 Struts2 的 Dojo 插件时,如果缺少必要的 JAR 包 `struts2-dojo-plugin-2.1.2.jar`,将会...
描述中提到的问题“java.lang.NoClassDefFoundError: org/bouncycastle/jce/provider/BouncyCastleProvider”是一个常见的Java运行时错误,通常表示在程序运行时找不到某个类的定义。在这个特定情况下,系统无法找到...
解决"java.lang.NoClassDefFoundError"的问题通常涉及以下几个步骤: 1. 检查是否所有必要的JAR文件都在Tomcat的`lib`目录下,包括JavaEE和JSF的库。 2. 确认应用的类路径设置正确,尤其是在使用IDE进行开发时,确保...
文档提到,在学习过程中遇到了`Exception in thread "main" java.lang.NoClassDefFoundError`这一错误。这通常是由于JVM无法找到对应的类定义导致的。可能的原因包括: - **未正确设置环境变量**。 - **编译和运行时...
然而,对于初学者而言,在尝试执行`java HelloWorld`时,很可能会遇到`java.lang.NoClassDefFoundError`这样的错误提示,这对于初学者来说无疑是一个不小的挑战。 为了解决这个问题,并帮助初学者更好地理解Java的`...
- `javaXiti8.class`: 抛出异常`Exceptioninthread"main"java.lang.NoClassDefFoundError:Xiti8/class`,因为`java`命令后面不能跟`.class`文件。 9. **操作题**: - 由于题目为操作题,具体内容未给出,故无法...
`java.lang.NullPointerException` `NullPointerException`是当程序尝试访问一个为`null`的对象实例的字段、调用其方法或构造函数时抛出的异常。这种异常通常发生在程序员错误地假设某个引用总是指向一个有效的...
如果遇到`java.lang.NoClassDefFoundError`错误,可能是因为缺少了必要的依赖库,比如ezmorph.jar或commons-collections.jar。 此外,JSON在前端开发中也有广泛应用,例如EXTJS框架。EXTJS中的`Ext.Toolbar`组件...
- **运行时错误**: `exception in thread "main" java.lang.NoClassDefFoundError` - 确认`classpath`中已加入`.`。 - 检查类名是否正确,大小写是否一致。 #### 三、Java基础知识解答 **3.1 "=="与"equals()"的...