java lang包.lang.noclassdeffounderror怎么解决

& &&&请问java.lang.NoClassDefFoundError如何解决
请问java.lang.NoClassDefFoundError如何解决
&|&来自: -
java.lang.NoClassDefFoundError:&Could&not&initialize&class&cn.smbms.utis.MyBatisUtil
at&cn.smbms.dao.user.UserMapperTest.test(UserMapperTest.java:61)
at&sun.reflect.NativeMethodAccessorImpl.invoke0(Native&Method)
at&。。。。
小葱哥哥ioy
悬赏10青鸟豆&|&浏览134
才能回答问题
cn.smbms.utis.MyBatisUtil没有这个类?要么就是没编译!
本周答题榜
本周回答21题
本周回答20题
本周回答6题
本周回答4题
本周回答4题
本周回答4题
本周回答4题
本周回答3题
Beijing Aptech Beida Jade Bird Information Technology Co.,Ltd北大青鸟IT教育 北京阿博泰克北大青鸟信息技术有限公司 版权所有
京ICP备号-3【eclipse】 怎么解决java.lang.NoClassDefFoundError错误 - 无信不立 - 博客园
posts(613)
comments(8)
trackbacks(0)
在日常开 发中,我们经常碰到java.lang.NoClassDefFoundError这样的错误,需要花费很多时间去找错误的原因,具体是哪个类不见了?类 明明还在,为什么找不到?而且我们很容易把java.lang.NoClassDefFoundError和 java.lang.ClassNotfoundException这两个错误搞混,事实上这两个错误是完全不同的。我们往往花费时间去不断尝试一些其他 的方法去解决这个问题,而没有真正去理解这个错误的原因。这篇文章就是通过解决NoClassDefFoundError错误处理的经验分享来揭开 NoClassDefFoundError的一些秘密。NoClassDefFoundError的错误并非不能解决或者说很难解决,只是这种错误的表现 形式很容易迷惑其他的Java开发者。下面我们来分析下为什么会发生NoClassDefFoundError这样的错误,以及怎样去解决这个错误。
NoClassDefFoundError错误发生的原因
NoClassDefFoundError错误的发生,是因为Java虚拟机在编译时能找到合适的类,而在运行时不能找到合适的类导致的错误。例如 在运行时我们想调用某个类的方法或者访问这个类的静态成员的时候,发现这个类不可用,此时Java虚拟机就会抛出 NoClassDefFoundError错误。与ClassNotFoundException的不同在于,这个错误发生只在运行时需要加载对应的类不 成功,而不是编译时发生。很多Java开发者很容易在这里把这两个错误搞混。
简单总结就是,NoClassDefFoundError发生在编译时对应的类可用,而运行时在Java的classpath路径中,对应的类不可用导致的错误。发生NoClassDefFoundError错误时,你能看到如下的错误日志:
<span style="color: # Exception in thread "main" java.lang.NoClassDefFoundError
错误的信息很明显地指明main线程无法找到指定的类,而这个main线程可能时主线程或者其他子线程。如果是主线程发生错误,程序将崩溃或停止,而如果是子线程,则子线程停止,其他线程继续运行。
NoClassDefFoundError和ClassNotFoundException区别
我们经常被java.lang.ClassNotFoundException和java.lang.NoClassDefFoundError这两个错误迷惑不清,尽管他们都与classpath 有关,但是他们完全不同。NoClassDefFoundError发生在JVM在动态运行时,根据你提供的类名,在classpath中找到对应的类进 行加载,但当它找不到这个类时,就发生了java.lang.NoClassDefFoundError的错误,而 ClassNotFoundException是在编译的时候在classpath中找不到对应的类而发生的错误。 ClassNotFoundException比NoClassDefFoundError容易解决,是因为在编译时我们就知道错误发生,并且完全是由于 环境的问题导致。而如果你在J2EE的环境下工作,并且得到NoClassDefFoundError的异常,而且对应的错误的类是确实存在的,这说明这 个类对于类加载器来说,可能是不可见的。
怎么解决NoClassDefFoundError错误
根据前文,很明显NoClassDefFoundError的错误是因为在运行时类加载器在classpath下找不到需要加载的类,所以我们需要把对应的类加载到classpath中,或者检查为什么类在classpath中是不可用的,这个发生可能的原因如下:
对应的Class在java的classpath中不可用
你可能用jar命令运行你的程序,但类并没有在jar文件的manifest文件中的classpath属性中定义
可能程序的启动脚本覆盖了原来的classpath环境变量
因为NoClassDefFoundError是java.lang.LinkageError的一个子类,所以可能由于程序依赖的原生的类库不可用而导致
检查日志文件中是否有java.lang.ExceptionInInitializerError这样的错误,NoClassDefFoundError有可能是由于静态初始化失败导致的
如果你工作在J2EE的环境,有多个不同的类加载器,也可能导致NoClassDefFoundError
下面我们看一些当发生NoClassDefFoundError时,我们该如何解决的样例。
NoClassDefFoundError解决示例
当发生由于缺少jar文件,或者jar文件没有添加到classpath,或者jar的文件名发生变更会导致java.lang.NoClassDefFoundError的错误。
当类不在classpath中时,这种情况很难确切的知道,但如果在程序中打印出System.getproperty(“java.classpath”),可以得到程序实际运行的classpath
运行时明确指定你认为程序能正常运行的 -classpath 参数,如果增加之后程序能正常运行,说明原来程序的classpath被其他人覆盖了。
NoClassDefFoundError也可能由于类的静态初始化模块错误导致,当你的类执行一些静态初始化模块操作,如果初始化模块抛出异 常,哪些依赖这个类的其他类会抛出NoClassDefFoundError的错误。如果你查看程序日志,会发现一些 java.lang.ExceptionInInitializerError的错误日志,ExceptionInInitializerError的错 误会导致java.lang.NoClassDefFoundError: Could not initialize class,如下面的代码示例:
* Java program to demonstrate how failure of static initialization subsequently cause
* java.lang.NoClassDefFoundError in Java.
* @author Javin Paul
6 public class NoClassDefFoundErrorDueToStaticInitFailure {
public static void main(String args[]){
<span style="color: #
List&User& users = new ArrayList&User&(2);
<span style="color: #
<span style="color: #
for(int i=0; i&2; i++){
<span style="color: #
<span style="color: #
users.add(new User(String.valueOf(i))); //will throw NoClassDefFoundError
<span style="color: #
}catch(Throwable t){
<span style="color: #
t.printStackTrace();
<span style="color: #
<span style="color: #
<span style="color: #
<span style="color: # }
<span style="color: #
<span style="color: # class User{
<span style="color: #
private static String USER_ID = getUserId();
<span style="color: #
<span style="color: #
public User(String id){
<span style="color: #
this.USER_ID =
<span style="color: #
<span style="color: #
private static String getUserId() {
<span style="color: #
throw new RuntimeException("UserId Not found");
<span style="color: #
<span style="color: # }
<span style="color: #
<span style="color: # Output
<span style="color: # java.lang.ExceptionInInitializerError
<span style="color: #
at testing.NoClassDefFoundErrorDueToStaticInitFailure.main(NoClassDefFoundErrorDueToStaticInitFailure.java:23)
<span style="color: # Caused by: java.lang.RuntimeException: UserId Not found
<span style="color: #
at testing.User.getUserId(NoClassDefFoundErrorDueToStaticInitFailure.java:41)
<span style="color: #
at testing.User.&clinit&(NoClassDefFoundErrorDueToStaticInitFailure.java:35)
<span style="color: #
... 1 more
<span style="color: # java.lang.NoClassDefFoundError: Could not initialize class testing.User
<span style="color: #
at testing.NoClassDefFoundErrorDueToStaticInitFailure.main(NoClassDefFoundErrorDueToStaticInitFailure.java:23)
<span style="color: #
<span style="color: #
<span style="color: # Read more: http:///2011/06/noclassdeffounderror-exception-in.html#ixzz3dqtbvHDy
由于NoClassDefFoundError是LinkageError的子类,而LinkageError的错误在依赖其他的类时会发生,所 以如果你的程序依赖原生的类库和需要的dll不存在时,有可能出现java.lang.NoClassDefFoundError。这种错误也可能抛出 java.lang.UnsatisfiedLinkError: no dll in java.library.path Exception Java这样的异常。解决的办法是把依赖的类库和dll跟你的jar包放在一起。
如果你使用Ant构建脚本来生成jar文件和manifest文件,要确保Ant脚本获取的是正确的classpath值写入到manifest.mf文件
Jar文件的权限问题也可能导致NoClassDefFoundError,如果你的程序运行在像linux这样多用户的操作系统种,你需要把你 应用相关的资源文件,如Jar文件,类库文件,配置文件的权限单独分配给程序所属用户组,如果你使用了多个用户不同程序共享的jar包时,很容易出现权限 问题。比如其他用户应用所属权限的jar包你的程序没有权限访问,会导致java.lang.NoClassDefFoundError的错误。
基于XML配置的程序也可能导致NoClassDefFoundError的错误。比如大多数Java的框架像Spring,Struts使用 xml配置获取对应的bean信息,如果你输入了错误的名称,程序可能会加载其他错误的类而导致NoClassDefFoundError异常。我们在使 用Spring MVC框架或者Apache Struts框架,在部署War文件或者EAR文件时就经常会出现Exception in thread “main” java.lang.NoClassDefFoundError。
在有多个ClassLoader的J2EE的环境中,很容易出现NoClassDefFoundError的错误。由于J2EE没有指明标 准的类加载器,使用的类加载器依赖与不同的容器像Tomcat、WebLogic,WebSphere加载J2EE的不同组件如War包或者EJB- JAR包。关于类加载器的相关知识可以参考这篇文章。
总结来说,类加载器基于三个机制:委托、可见性和单一性,委托机制是指将加载一个类的请求交给父类加载器,如果这个父类加载器不能够找到或者加载这 个类,那么再加载它。可见性的原理是子类的加载器可以看见所有的父类加载器加载的类,而父类加载器看不到子类加载器加载的类。单一性原理是指仅加载一个类 一次,这是由委托机制确保子类加载器不会再次加载父类加载器加载过的类。现在假设一个User类在WAR文件和EJB-JAR文件都存在,并且被WAR ClassLoader加载,而WAR ClassLoader是加载EJB-JAR ClassLoader的子ClassLoader。当EJB-JAR中代码引用这个User类时,加载EJB-JAR所有class的 Classloader找不到这个类,因为这个类已经被EJB-JAR classloader的子加载器WAR classloader加载。
这会导致的结果就是对User类出现NoClassDefFoundError异常,而如果在两个JAR包中这个User类都存在,如果你使用 equals方法比较两个类的对象时,会出现ClassCastException的异常,因为两个不同类加载器加载的类无法进行比较。
有时候会出现Exception in thread “main” java.lang.NoClassDefFoundError: com/sun/tools/javac/Main 这样的错误,这个错误说明你的Classpath, PATH 或者 JAVA_HOME没有安装配置正确或者JDK的安装不正确。这个问题的解决办法时重新安装你的JDK。
Java在执行linking操作的时候,也可能导致NoClassDefFoundError。例如在前面的脚本中,如果在编译完成之后,我们 删除User的编译文件,再运行程序,这个时候你就会直接得到NoClassDefFoundError,而错误的消息只打印出User类的名称。
<span style="color: # java.lang.NoClassDefFoundError: testing/User
<span style="color: #
at testing.NoClassDefFoundErrorDueToStaticInitFailure.main(NoClassDefFoundErrorDueToStaticInitFailure.java:23)
现在我们知道要怎样去面对NoClassDefFoundError异常并解决它了。Java(240)
在JAVA开发中,main线程中抛出java.lang.NoClassDefFoundError是一个非常普遍且比较难解决的问题。解决这个问题的复杂性主要取决于你的软件大小和中间件部署情况,尤其要考虑在应用中出现的数量众多的classloader的情况。&
本文将从一个比较高的角度看这个问题,主要是介绍java classloader机制。&
那么,什么是java.lang.NoClassDefFoundError呢?&
我们先简单的看一下这个问题,这个runtime异常是JVM抛出的,当JVM发现一个classloader试图去Load一个class,而此class在当前的classloader tree中找不到的时候,就会抛出此异常。&
很明显,这个问题是运行期的问题,在编译期一切正常。&
那么,解决起来很简单,就是把jar包放到classpath下不就行了么?&
ok,到这里还不行,这个问题解决起来不是那么容易的,在运行期的程序classpath中加入缺少的jar包仅仅是一种解决方法。关键是,我们必须掌握此种异常的根本原因,以后解决此问题就可以以不变应万变。这就是我写这个文章的初衷。&
现在,先记住,此问题不一定是由于在classpath中缺少class的定义。&
java classloader概述&
在深入分析之前,我们必须掌握java classloader的基本原理。class loader是一个java对象,它负责load所有的class,负责查找、加载、生成一个class的基本定义信息。classloader自身采用了委托代理机制来查询class,每一个classloader的实例都有一个父classloader,所以,当一个应用的classloader去加载class A的时候,首先发生的事情是classloader委托其父classloader去加载class A,经过一串链式查找后,最终任务会落在JVM的系统启动classloader上。&
那哪里会出问题?当你期望你的应用classloader能加载class A,但是当class A被其任意一个父classloader查询到并加载,那么就可能会出现java.lang.NoClassDefFoundError。当所有的父classloader都找不到class A的时候,才会由应用自己的classloader尝试加载。&
本文面向的是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&);&&
&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&System.out.println(&\nCurrent&ClassLoader&chain:&&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&#43;&ClassloaderUtil.getCurrentClassloaderDetail());&&
&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&CallerClassA&caller&=&new&CallerClassA();&&
&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&caller.doSomething();&&
&&&&&&&&&&&&&&&&System.out.println(&done!&);&&
&&&&&&&&}&&
Java代码&&
public&class&CallerClassA&{&&
&&&&&&&&private&final&static&String&CLAZZ&=&CallerClassA.class.getName();&&
&&&&&&&&static&{&&
&&&&&&&&&&&&&&&&System.out.println(&Classloading&of&&&&#43;&CLAZZ&&#43;&&&in&progress...&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&#43;&ClassloaderUtil.getCurrentClassloaderDetail());&&
&&&&&&&&}&&
&&&&&&&&public&CallerClassA()&{&&
&&&&&&&&&&&&&&&&System.out.println(&Creating&a&new&instance&of&&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&#43;&CallerClassA.class.getName()&&#43;&&...&);&&
&&&&&&&&}&&
&&&&&&&&public&void&doSomething()&{&&
&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&ReferencingClassA&referencingClass&=&new&ReferencingClassA();&&
&&&&&&&&}&&
Java代码&&
public&class&ReferencingClassA&{&&
&&&&&&&&private&final&static&String&CLAZZ&=&ReferencingClassA.class.getName();&&
&&&&&&&&static&{&&
&&&&&&&&&&&&&&&&System.out.println(&Classloading&of&&&&#43;&CLAZZ&&#43;&&&in&progress...&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&#43;&ClassloaderUtil.getCurrentClassloaderDetail());&&
&&&&&&&&}&&
&&&&&&&&public&ReferencingClassA()&{&&
&&&&&&&&&&&&&&&&System.out.println(&Creating&a&new&instance&of&&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&#43;&ReferencingClassA.class.getName()&&#43;&&...&);&&
&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&Maps.newHashMap();&&
&&&&&&&&}&&
&&&&&&&&public&void&doSomething()&{&&
&&&&&&&&&&&&&&&&&&
&&&&&&&&}&&
打印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&);&&
&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&while&(currentClassLoader&!=&null)&{&&
&&&&&&&&&&&&&&&&&&&&&&&&classLoaderStack.push(currentClassLoader);&&
&&&&&&&&&&&&&&&&&&&&&&&&currentClassLoader&=&currentClassLoader.getParent();&&
&&&&&&&&&&&&&&&&}&&
&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&while&(classLoaderStack.size()&&&0)&{&&
&&&&&&&&&&&&&&&&&&&&&&&&ClassLoader&classLoader&=&classLoaderStack.pop();&&
&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&&&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...&&
异常重现:&
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:&mon.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中验证,确保编译和运行期都能找到此类。
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:654838次
积分:12697
积分:12697
排名:第1119名
原创:658篇
转载:715篇
评论:32条
(66)(119)(136)(80)(30)(57)(17)(106)(99)(119)(56)(260)(3)(84)(19)(37)(60)(28)java java.lang.NoClassDefFoundError 的解决办法 - 通天树 - 博客园
以简单而经典的 “HelloWorld.java” 为例
不含包层次的HelloWorld.  public class HelloWorld
&&&&&&&&public static void main(String[] args)
&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&System.out.println("Hello World!");
&&&&&&&&&&&&&}
&&&&&}  保存在E:\java\src下,命令行下,改变当前路径到:E:\java\src,使用javac命令编译:  E:\java\src&javac HelloWorld.java  运行:  E:\java\src&HelloWorld  屏幕打印出:  Hello World!  初学者常犯的错误  1. 运行时,带了.class后缀  如果你试图使用如下命令:  E:\java\src&java HelloWorld.class   系统会误认为你运行的是HelloWorld包下的名为class的类文件,会到系统的CLASSPATH下(一般都包括当前目录)企图寻找 HelloWorld.class.class这样的类,这样的类当然不存在了;并且也不可能存在,因为class是关键字,不能作为一个类的名字。所以 会报如下错误信息:  Exception in thread "main" java.lang.NoClassDefFoundError: HelloWorld/class  2. 文件名大小写错误  对于像Windows这样的系统,编译时可以不关心大小写。比如编译HelloWorld.java时,也可以使用:  E:\java\src&javac helloworld.java  也可以编译通过,但产生的类文件仍然是和源文件相符的:HelloWorld.class。  但在运行时一定要注意大小写,比如试图使用如下命令运行:  E:\java\src&java helloworld  将报类似于1中的错误:  Exception in thread "main" java.lang.NoClassDefFoundError: helloworld (wrong name: HelloWorld)  包含包层次的HelloWorld.java  比如上面的HelloWorld.java修改如下:   package org.
&&&&&&&&public class HelloWorld
&&&&&&&&&&{
&&&&&&&&&&&&&&public static void main(String[] args)
&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&System.out.println("Hello World!");
&&&&&&&&&&&&&}
&&&&&&&&&}
  编译时有两种方法  1. 直接编译  E:\java\src&javac HelloWorld.java  此时在当前目录下输出HelloWorld.class。此时,运行不能使用上面相同的方法,使用:  E:\java\src&java HelloWorld  运行时,出现如下错误:  Exception in thread "main" java.lang.NoClassDefFoundError: HelloWorld (wrong name: org/javaresearch/HelloWorld)   从上述错误信息你也可以看到,系统可以找到HelloWorld类(因为当前路径包含在CLASSPATH中,具体为什么会提示wrong name,有兴趣的朋友参见Java语言规范),但这个类属于org.javaresearch包。所以,你要做的就是按照上述包层次,相应的创建目录层 次,把上面生成的HelloWorld.class放到E:\java\src\org\javaresearch\目录下。运行(这时候是在包层次的最高层目录下运行的):  E:\java\src &java org.javaresearch.HelloWorld  系统打印出:  Hello World!  这儿要注意的是,不能使用java org\javaresearch\HelloWorld来运行,此时同样会出现如下错误:  Exception in thread "main" java.lang.NoClassDefFoundErrorrg\javaresearch\HelloWorld (wrong name: org/javaresearch/HelloWorld)  因为类名的书写是用句点来分割包名的层次的,引用java类库里面的类也可以这样写:java.util.List&&类的全名就是这样的,我们如果在 import 语句里写上 import java.util.L
那么,就不用写全名了,直接写 List list = new ...;java 编译器就可以知道是 List 什么类.但是,由于,java.util 这个包 和 java.sql 这个包都有一个 Date 类,所以,如果 同时导入这两个包,那么会
导致java 编译器不知道引用那个类,有两种解决办法:
a. 用全名来引用类:java.util.Date date1 = ...;java.sql.Date date2 = ...;
b. 不要导入整个包,只导入所需要的类,如果你同时需要这两个 Date 类,那么只能写全名了,如果
你不是同时需要这两个类,你可以只导入需要的包:
比如:import java.util.L import java.sql.D这样就不会冲突,因为编译器可以十分清楚的区分
这个 Date 类是 java.sql 包中的, java.util 包中的 Date 类根本就没有导入进来。
这一点,可以按照常理来理解,还是比较好理解的。
  2. 使用 -d &directory&编译选项  是不是觉得上面的编译方法有点麻烦,能不能自动在当前路径(或任意指定的路径)下生成包层次呢?有!使用-d &directory&编译选项就能做到。  E:\java\src &javac
  此时,在当前目录下就生成了一个org\javaresearch目录,并且输出的.class文件也在里面。运行:  E:\java\src &java org.javaresearch.HelloWorld  系统打印:Hello World!  如果你想把生成的类文件集中存放在一个目录中,比如:E:\java\classes下,那么你首先创建这个目录,然后编译时:  E:\java\src &javac -d E:\java\classes HelloWorld.java   就可以把生成的类文件放到E:\java\classes目录下,并且按照包层次相应的创建目录路径。你可以在E:\java\classes\org \ javaresearch下找到HelloWorld.class文件。此时使用如下命令可以正确运行(注意如果要用到其它类,请在CLASSPATH中 设好):  E:\java\classes &java org.javaresearch.HelloWorld

我要回帖

更多关于 java.lang 的文章

 

随机推荐