简体   繁体   中英

Classloader java.lang.NoClassDefFoundError?

So I have a classloader loading a class like so:

ClassLoader cl = new URLClassLoader(urls);
Class cls = cl.loadClass("modules.Test");
Method method = cls.getDeclaredMethod("getModule", noparams);
Class<?> type = method.getReturnType();

if(type.newInstance() instanceof Module){
    System.out.println("Accessed field with type: Module");
}

The class Module is in another jar at runtime. And the Test.class was generated within that main jar then i unarchived it, so the dependency would be there.

How can I access other dependencies from the external .class file I have loaded?

The exception:

java.lang.NoClassDefFoundError: com/xxxxxxx/xxxx/objects/Module
Caused by: java.lang.ClassNotFoundException: com.xxxxxxx.xxxx.objects.Module

I think that the problem is happening because your modules.Test class depends the Modules class, but your custom class loader can't find that class.

I think that is because you have instantiated the custom classloader incorrectly. You wrote:

ClassLoader cl = new URLClassLoader(urls);

That creates a classloader whose parent classloader is the default system classloader. But the error implies that the default classloader is not the one that knows about Modules . Try this instead:

Classloader cl = new URLClassLoader(
        urls, this.getClass().getClassLoader());

This should at least give you a classloader that knows about Modules .


Note: adding the URL for the JAR containing Modules to the urls array is a non-solution. You are liable to end up loading the Modules class twice, and that is liable to lead to other problems. (The instanceof won't work, for example.)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM