Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Java: Общие вопросы > Проблема с ClassLoader-ом |
Автор: 3,14 3.3.2013, 21:49 | ||
Есть у меня некий Launcher, который запускает основное приложение, подгружая его моим же ClassLoader-ом (AppLoader):
AppLoader является наследником URLCLassLoader-а, и в конструкторе тупо передает ему аргументы. Проблема в следующем, приложение запускается, делаем в нем: App.class.getClassLoader() //подгруженный класс или getClass().getClassLoader() и возвращается системный ClassLoader, а не объявленный мной. Соответственно классы из подключенных Jar-ов он не видит... |
Автор: jk1 4.3.2013, 07:31 |
А Ваш собственный загрузчик выполняет делегацию к родительскому загрузчику? Есть подозрение, что искомый класс уже загружен родительским CLassLoader'ом, потому Ваш собственный и не пытается его грузить сам. |
Автор: 3,14 4.3.2013, 07:51 |
Выполняет. А как это обойти? Не уж то добавлять загрузку классов еще? |
Автор: jk1 4.3.2013, 09:22 | ||
Тут есть два принципиально разных способа: 1. Исключить parent delegation для конкретных классов. Работать скорее всего будет, но это похоже на костыль и чревато jar hell 2. Понять, почему system classloader ухитрился загрузить целевой класс первым и сделать так, чтобы этого не происходило. Я бы выбрал второй способ. Если приаттачите побольше исходников я даже смогу указать где именно у Вас проблема. |
Автор: 3,14 4.3.2013, 10:32 | ||
Код загрузчика:
К другим файлам проекта Launcher и Loader вроде как не обращаются, так что странно, что загрузка класса App идет. |
Автор: 3,14 6.3.2013, 21:29 | ||||
Проверил, класс ранее загружен не был, и загружался именно через делегирование при вызове:
В консоль падало: [Loading class: org.mc.main.App], а вот что класс был ранее загружен нет, не падало, тем не менее, когда после загрузки вызывал тип ClassLoader-а, возвращался совсем не мой ClassLoader, а системный:
В консоль валилось: [App ClassLoader is: sun.misc.Launcher$AppClassLoader] а не org.mc.main.AppLoader |
Автор: jk1 7.3.2013, 23:09 |
Раз загружал системный, значит библиотеки оказались в ClassPath. Если их оттуда убрать, то системный загрузить не сможет и мы получим искомое. |