Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > ClassLoader


Автор: APXEOLOG 29.11.2011, 07:53
Существует необходимость не включать часть классов в jar файл. Причем именно на этапе сборки jar'a, при компиляции они присутствуют, как и ссылки на них по всему коду. Затем в программе я пробую загрузить нехватающие классы из другого источника с помощью своего ClassLoader'a, что успешно происходит. Однако когда программа пытается обратиться к этим классам из кода, вылетает NoDefClassExceprtion. Я пробовал ставить свой лоадер дефолтным для потока (проблема в том что в приложении много потоков), но это не помогло... В чем может быть проблема, может быть кто-то знает решение? И еще вопрос, есть ли вариант назначить лоадер для всех потоков создающихся в программе?

Автор: Skipy 29.11.2011, 11:35
А чем вызвана необходимость?

Автор: math64 29.11.2011, 12:51
Если эти классы должны находиться в другом jar, и путь до этого jar известен при компиляции, добавь в манифест
Код

Class-Path: path/to/mylib/mylib.jar

Если не известен - указывай путь из командной строки.

Автор: APXEOLOG 29.11.2011, 16:44
Цитата(Skipy @  29.11.2011,  11:35 Найти цитируемый пост)
А чем вызвана необходимость?


Это механизм защиты добавленного в программу кода. Эти классы подгружаются по интернету после аутентификации пользователя. Так как защита навешивается на уже готовую программу мне бы хотелось минимизировать изменения в коде.


Цитата(math64 @  29.11.2011,  12:51 Найти цитируемый пост)
Если не известен - указывай путь из командной строки. 

Классы запакованы в специальном бинарном формате который парсится внутри программы.

Автор: aleksandy 30.11.2011, 05:44
Цитата(APXEOLOG @  29.11.2011,  16:44 Найти цитируемый пост)
Классы запакованы в специальном бинарном формате который парсится внутри программы. 

Распаковывай классы во временные файлы и грузи обыкновенным http://docs.oracle.com/javase/1.5.0/docs/api/java/net/URLClassLoader.html-ом

Автор: APXEOLOG 30.11.2011, 11:37
Насколько я понял документацию, лоадеры не смотрят по нисходящей, только по восходящей иерархии. А так как jar файл загружается системным загрузчиком, даже наследуя от него кастомный лоадер и загружая в него классы, я все равно буду получать NoDefClassException в моем коде...

Автор: COVD 30.11.2011, 18:33
Цитата

Эти классы подгружаются по интернету после аутентификации пользователя.

Приложения на модульной, плагинной архитектуре (OSGi, Netbeans Platform) примерно так работают. Сначала стартует контейнер плагинов. Потом он в рантайме загружает-выгружает необходимые плагины. Плагины в виде jar-ов доступны из сети по известным контейнеру адресам. Контейнер сам управляется с класслоадерами.  

Очевидно, готовую программу можно перевести на плагинную архитектуру постепенно. Начать можно с того, чтобы готовая программа по отношению к контейнеру стала плагином. Пользователь будет запускать контейнер, контейнер будет запускать единственный плагин. Ничего пока не изменилось. Преимущества появятся, когда мы начнем делать добавки, которые должны быть оформлены как отдельные плагины. Главная программы может общаться с плагинами только через контейнер, поэтому ее тоже придется менять, но это будут постепенные изменения, по мере добавления плагинов. Не требуется сразу разбивать всю главную программу на плагины.  

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)