Невозможно динамически загрузить класс Java из общей папки lib

У меня есть файл jar, который я хочу поместить в общую библиотеку моего сервера приложений (WebLogic). JAR содержит несколько классов, которые реализуют интерфейсы, расположенные внутри военного развертывания. И в развертывании есть синглтон Spring, который инициализирует класс, содержащийся в общем банке.

Итак, я предполагаю, что класс не может загружаться, потому что интерфейсы еще не загружены (они находятся в развертывании), и когда загрузчик классов пытается загрузить этот класс, он, вероятно, получает некоторую ошибку компиляции (я не вижу этого в любом месте) и не загружает его, а когда развертывание пытается создать экземпляр чего-то, что не было загружено (общий jar-файл), возникает ошибка.

Так что вопрос, что мне здесь делать? Как настроить, чтобы все это работало? Я действительно не хочу дублировать банку, содержащую все интерфейсы в общей папке. (требуется один целый файл .war).

Спасибо.

P.S. к сожалению, у меня нет ошибок/исключений при загрузке класса папки lib домена (общая). У меня есть только java.lang.NoClassDefFoundError, когда я пытаюсь его создать.


person nisenish    schedule 26.06.2012    source источник
comment
Я не думаю, что у тебя есть выбор. Переместите интерфейсы в каталог lib. По крайней мере, попробуйте и посмотрите, работает ли это. Почему вы согласны с реализациями в общей библиотеке, но не с интерфейсами?   -  person John Watts    schedule 26.06.2012
comment
Я пробовал, собственно так я и реализовал изначально, но люди на работе не хотят разделять военный архив, они говорят, что все должно лежать в одном документе. Сейчас я пробую .ear с папкой APP-INF/lib, я обновлю ленту здесь, если она сработает. Также относительно реализаций - это реализации клиента и не являются обязательными; это не наша поставка как продукт.   -  person nisenish    schedule 26.06.2012


Ответы (1)


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

  1. Я не помню, работает ли это, но вы должны иметь возможность поместить банку в WEB-INF/lib веб-приложения, в которой есть META-INF/MANIFEST.MF, путь к классам которого указывает вне войны. Это должно быть известное, жестко закодированное местоположение. Это может быть относительный путь, который будет относиться к текущему рабочему каталогу. Часто это домашний каталог сервера приложений или домашний каталог вашего домена.

  2. Создайте свой собственный экземпляр ClassLoader. Вероятно, это должен быть URLClassLoader, чтобы ваш клиент мог предоставить либо каталог, либо один файл jar. Установите родителей этого загрузчика классов в качестве загрузчика классов веб-приложения. Он может указывать на местоположение, определенное во время выполнения. Проблема здесь в использовании этого загрузчика классов во всех нужных местах. Я не знаю какого-либо общего способа сделать это, поэтому я бы рекомендовал первый вариант.

person John Watts    schedule 26.06.2012
comment
вау, это сработало! большое спасибо! он работал с относительным URL-адресом, но не с абсолютным, хотя я все еще пытаюсь. - person nisenish; 26.06.2012