2015-01-25 2 views
0

Поэтому у меня есть загрузчик классов выгрузки класса как так:Classloader java.lang.NoClassDefFoundError?

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"); 
} 

Класс Module находится в другом банке во время выполнения. И Test.class был сгенерирован в этой основной банке, после чего я разобрал его, так что зависимость будет там.

Как получить доступ к другим зависимостям из внешнего файла .class, который я загрузил?

Исключение:

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

В файле JAR содержится файл 'modules/Test.class'? – EJP

+0

Да, в моем тесте файл класса остался в основном банке. Но я планирую удалить его после того, как я вытащил сгенерированный Test.class. – ThatGuy343

+0

, пожалуйста, укажите, какое именно исключение – yair

ответ

2

Я думаю, что проблема происходит потому, что ваш modules.Test класс зависит Modules класса, но пользовательский загрузчик классов не может найти этот класс.

Я думаю, это потому, что вы неправильно создали пользовательский загрузчик классов. Вы писали:

ClassLoader cl = new URLClassLoader(urls); 

Это создает загрузчик классов, родительский загрузчик классов которого является загрузчиком системного класса по умолчанию. Но ошибка подразумевает, что загрузчик классов по умолчанию не тот, который знает о Modules. Попробуйте вместо этого:

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

Это должно, по крайней мере дать вам загрузчик классов, который знает о Modules.


Примечание: добавление URL для JAR, содержащего Modules к urls массива не является решением. Вы можете в конечном итоге загрузить класс Modules, и это может привести к другим проблемам. (Например, instanceof не работает.)

Смежные вопросы