Зависимости на URLClassloader

В предишния си въпрос попитах как да заредя отдалечени 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