首页 > 编程知识 正文

javalangnoclassdeffounderror,javalangNoClassDefFoundError

时间:2023-12-29 20:31:52 阅读:330836 作者:PWQY

本文目录一览:

怎么解决java.lang.NoClassDefFoundError错误

1、项目依赖的jar包未全部导入;

如:java.lang.NoClassDefFoundError: Could not initialize class com.esms.common.util.XmlUtil,当你去查这个类的时候发现这个类是存在,之所以抱着个错是

因为在这个类里面的方法引用了其他jar包中的类的方法,而这个被引用的这个jar包刚好缺失,所以抛出这个错。

解决办法:一层一层去查找并导入缺失的jar包

2、类中package的地址不对

如:你在com.phome.demo1中有个类test.java,那么这个类的package就是com.phome.demo1

这时候刚好你在com.phome.demo2下面也有一个test.java这个类,而这个类的package也是com.phome.demo1,这种情况下也会抛出这个错。也许你会说这种情况在编写代码的时候会抛出这个错,没错这种情况大多数情况下是可以避免的,但是我确实是遇到了,很诡异。

解决办法:修改好名称呢个重新编译即可

java.lang.NoClassDefFoundError是什么意思

java.lang.NoClassDefFoundError:

找不到相应的类文件,当编译源文件以后都会生成一些类文件:***.class,执行时要用java(main所在的类) ,如果找不到相应的类,执行就会出现NoClassDefFoundError的异常。

1、首先请确认没有错敲成java xxx.class,

2、其次,检查CLASSPATH环境变量,

3、将java文件按包名存放:

比如工作目录是/work,类是package1.class1,那么将它存放为/work/package1/class1.java。如果没有声明包,那么直接放在/work下。

如何解决java.lang.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

*/

public class NoClassDefFoundErrorDueToStaticInitFailure {

public static void main(String args[]){

ListUser users = new ArrayListUser(2);

for(int i=0; i2; i++){

try{

users.add(new User(String.valueOf(i))); //will throw NoClassDefFoundError

}catch(Throwable t){

t.printStackTrace();

}

}

}

}

class User{

private static String USER_ID = getUserId();

public User(String id){

this.USER_ID = id;

}

private static String getUserId() {

throw new RuntimeException("UserId Not found");

}

}

Output

java.lang.ExceptionInInitializerError

at testing.NoClassDefFoundErrorDueToStaticInitFailure.main(NoClassDefFoundErrorDueToStaticInitFailure.java:23)

Caused by: java.lang.RuntimeException: UserId Not found

at testing.User.getUserId(NoClassDefFoundErrorDueToStaticInitFailure.java:41)

at testing.User.clinit(NoClassDefFoundErrorDueToStaticInitFailure.java:35)

... 1 more

java.lang.NoClassDefFoundError: Could not initialize class testing.User

at testing.NoClassDefFoundErrorDueToStaticInitFailure.main(NoClassDefFoundErrorDueToStaticInitFailure.java:23)

java.lang.NoClassDefFoundError怎么解决

NoClassDefFoundError错误的发生,是因为Java虚拟机在编译时能找到合适的类,而在运行时不能找到合适的类导致的错误。

NoClassDefFoundError发生在编译时对应的类可用,而运行时在Java的classpath路径中,对应的类不可用导致的错误。

NoClassDefFoundError的错误是因为在运行时类加载器在classpath下找不到需要加载的类,所以我们需要把对应的类加载到classpath中,或者检查为什么类在classpath中是不可用的

看看是不是缺失jar包,或者jdk安装正不正确

如何解决java.lang.NoClassDefFoundError

NoClassDefFoundError错误的发生,是因为Java虚拟机在编译时能找到合适的类,而在运行时不能找到合适的类导致的错误。简单总结就是,NoClassDefFoundError发生在编译时对应的类可用,而运行时在Java的classpath路径中,对应的类不可用导致的错误。

很明显NoClassDefFoundError的错误是因为在运行时类加载器在classpath下找不到需要加载的类,所以我们需要把对应的类加载到classpath中,或者检查为什么类在classpath中是不可用的,这个发生可能的原因如下:

1、对应的Class在java的classpath中不可用

2、你可能用jar命令运行你的程序,但类并没有在jar文件的manifest文件中的classpath属性中定义

3、可能程序的启动脚本覆盖了原来的classpath环境变量

4、因为NoClassDefFoundError是java因为NoClassDefFoundError是java.lang.LinkageError的一个子类,所以可能由于程序依赖的原生的类库不可用而导致

5、检查日志文件中是否有java.lang.ExceptionInInitializerError这样的错误,NoClassDefFoundError有可能是由于静态初始化失败导致的

6、如果你工作在J2EE的环境,有多个不同的类加载器,也可能导致NoClassDefFoundError

如何解决Java.lang.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();

StackClassLoader classLoaderStack = new StackClassLoader();

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中验证,确保编译和运行期都能找到此类。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。