`
vipcowrie
  • 浏览: 352108 次
  • 性别: Icon_minigender_1
  • 来自: 南京
博客专栏
1167aa84-228b-38f8-88a0-4733613efdef
让Java跑起来
浏览量:64756
文章分类
社区版块
存档分类
最新评论

如何解决java.lang.NoClassDefFoundError--第二部分

阅读更多
如何解决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中验证,确保编译和运行期都能找到此类。
6
1
分享到:
评论
3 楼 nxweiwei 2014-05-21  
如何在classpath中验证啊,能写详细点嘛?
2 楼 吴乃翁 2013-09-30  
写的很好,只是这里写着 NoClassDefFoundError 问题原因1:缺少jar包 ,我一直在找原因2就再也找不到了
1 楼 adam_zs 2013-03-26  
     

相关推荐

    java.lang.NoClassDefFoundError

    ### Java中的`java.lang.NoClassDefFoundError`: javax/mail/Message #### 错误概述 在Java编程过程中遇到`java.lang.NoClassDefFoundError`是一个常见的问题,这种异常通常发生在试图加载一个类时,该类在编译时...

    JavaMail抛java.lang.NoClassDefFoundError (comsunmailutilLineInputStream)异常解决方案

    JavaMail在进行电子邮件发送时,可能会遇到`java.lang.NoClassDefFoundError`异常,特别是当尝试使用`com.sun.mail.util.LineInputStream`类时。这个异常通常表示在运行时找不到某个类的定义,即使该类在编译时是...

    java.io.CharConversionException: isHexDigit 出现错误的原因及其解决办法

    在Java的标准库中,并没有内置的`isHexDigit`函数,但在一些自定义的代码或者第三方库中可能会看到这个函数,它的作用是验证输入的字符是否能作为十六进制数的一部分。 问题可能出在以下几个方面: 1. **编码不...

    解决poi-ooxml3.1.X 升级 poi-ooxml4.1.2版本xwpx-1.0.6冲突问题

    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-core_2.11-1.5.2.logging.jar解决spark升级没有log的jar包

    ### Spark升级后遇到`java.lang.NoClassDefFoundError: org/apache/spark/Logging`问题解决方案 #### 一、问题背景及现象 在升级Spark至2.1版本之后,在使用streaming-kafka进行测试时,遇到了`java.lang....

    com.fasterxml.jackson

    通常来说,我们在日常开发中使用的是第3种方式,有时为了简便也会使用第2种方式,比如你要从一个很大的Json对象中只读取那么一两个字段的时候,采用databind方式显得有些重,JsonNode反而更简单。 作者:无知者云 ...

    derby_ui_plugin_1.1.1

    学习如何使用Derby UI Plugin对于Java 2的初学者来说,是一个很好的实践项目,可以提升数据库操作技能,并了解如何集成和使用第三方工具。此外,由于Derby是Java的一部分,熟悉它还可以帮助开发者深入理解Java的内存...

    在Java中轻松将HTML格式文本转换为纯文本(保留换行)

    第一步:引入Jsoup和lang和lang3的依赖: ...第二步:直接使用即可: import org.apache.commons.lang.StringEscapeUtils; import org.apache.commons.lang3.StringUtils; import org.jsoup.Jsoup; im

    Sqoop 导入数据异常处理

    写在前面 ...解压使用会出现几个bug,之前也是出现了,... Exception in thread “main” java.lang.NoClassDefFoundError: org/json/JSONObject 解决方法: 这是因为sqoop缺少java-json.jar包 下载java-json.jar包: http

    JDOMException错误解决办法

    从题目给出的部分内容中,可以看到一个具体的错误示例:“java.lang.NoClassDefFoundError: org/jdom/JDOMException”。这个错误表示在运行时找不到`JDOMException`这个类,通常是由于类路径(classpath)配置问题导致...

    java面向对象程序设计第二版课后答案.docx

    根据提供的文件信息,我们可以归纳...通过以上总结,我们可以看到Java面向对象程序设计第二版课后答案中涉及了Java编程的基础知识、数据类型、控制流语句等多个方面,旨在帮助学习者掌握Java编程的基本技能和思维模式。

    Struts2运行经常遇见的异常描述

    `java.lang.NoClassDefFoundError`: 缺少 Struts2 Dojo 插件(`struts2-dojo-plugin-2.1.2.jar`) **异常描述**: 在使用 Struts2 的 Dojo 插件时,如果缺少必要的 JAR 包 `struts2-dojo-plugin-2.1.2.jar`,将会...

    bcpkix-jdk15on-1.49.rar

    描述中提到的问题“java.lang.NoClassDefFoundError: org/bouncycastle/jce/provider/BouncyCastleProvider”是一个常见的Java运行时错误,通常表示在程序运行时找不到某个类的定义。在这个特定情况下,系统无法找到...

    javaee架包

    解决"java.lang.NoClassDefFoundError"的问题通常涉及以下几个步骤: 1. 检查是否所有必要的JAR文件都在Tomcat的`lib`目录下,包括JavaEE和JSF的库。 2. 确认应用的类路径设置正确,尤其是在使用IDE进行开发时,确保...

    2022年初学Java的备忘录Java教程.docx

    文档提到,在学习过程中遇到了`Exception in thread "main" java.lang.NoClassDefFoundError`这一错误。这通常是由于JVM无法找到对应的类定义导致的。可能的原因包括: - **未正确设置环境变量**。 - **编译和运行时...

    java-package与import机制

    然而,对于初学者而言,在尝试执行`java HelloWorld`时,很可能会遇到`java.lang.NoClassDefFoundError`这样的错误提示,这对于初学者来说无疑是一个不小的挑战。 为了解决这个问题,并帮助初学者更好地理解Java的`...

    Java面向对象程序设计课后习题答案

    - `javaXiti8.class`: 抛出异常`Exceptioninthread"main"java.lang.NoClassDefFoundError:Xiti8/class`,因为`java`命令后面不能跟`.class`文件。 9. **操作题**: - 由于题目为操作题,具体内容未给出,故无法...

    java异常exception

    `java.lang.NullPointerException` `NullPointerException`是当程序尝试访问一个为`null`的对象实例的字段、调用其方法或构造函数时抛出的异常。这种异常通常发生在程序员错误地假设某个引用总是指向一个有效的...

    JSON的使用方法(详细注解)

    如果遇到`java.lang.NoClassDefFoundError`错误,可能是因为缺少了必要的依赖库,比如ezmorph.jar或commons-collections.jar。 此外,JSON在前端开发中也有广泛应用,例如EXTJS框架。EXTJS中的`Ext.Toolbar`组件...

    Java入门及faq__1(1)

    - **运行时错误**: `exception in thread "main" java.lang.NoClassDefFoundError` - 确认`classpath`中已加入`.`。 - 检查类名是否正确,大小写是否一致。 #### 三、Java基础知识解答 **3.1 "=="与"equals()"的...

Global site tag (gtag.js) - Google Analytics