Зависимости загрузчика URL-классов

В моем предыдущем вопросе я спросил, как загрузить удаленные файлы jar. Мой текущий код таков:

//f is the path to the jar
URLClassLoader loader = new URLClassLoader(new URL[]{f.toURI().toURL()});
Class<?> jarClass = Class.forName(main, true, loader);
Class<? extends Module> module = jarClass.asSubclass(Module.class);

Constructor<? extends Module> constructor = module.getConstructor();
System.out.println(constructor);

Module module = constructor.newInstance();

Это работает хорошо, но удаленно загруженные модули расширяют класс, который находится в банке, который их загружает, что дает эту ошибку:

Вызвано: java.lang.ClassNotFoundException: package.whatever.Module, который, как я полагаю, связан с тем, что он использует URLClassLoader вместо getClass().getClassLoader().. как я могу заставить его использовать URLClassLoader, а затем вернуться к стандартному ?

Спасибо,
Барт


person Bart    schedule 06.05.2013    source источник


Ответы (2)


Вы можете установить загрузчик класса приложения в качестве родителя загрузчика класса URL:

URLClassLoader loader = new URLClassLoader(
       new URL[]{f.toURI().toURL()}, Module.class.getClassLoader());

Из учебника Oracle Java (механизм загрузки классов):

Платформа Java использует модель делегирования для загрузки классов. Основная идея заключается в том, что у каждого загрузчика классов есть «родительский» загрузчик классов. При загрузке класса загрузчик класса сначала «делегирует» поиск класса его родительскому загрузчику классов, прежде чем пытаться найти сам класс.

person dcernahoschi    schedule 06.05.2013

Я столкнулся с той же проблемой, и я использовал Java 9, понижение версии до Java 8 решило мою проблему.

person Nagesh Singh Chauhan    schedule 13.03.2018