Загрузка двух классов в разные JAR-файлы - PullRequest
4 голосов
/ 28 апреля 2011

Я получил два класса с одинаковым пакетом в разных JAR-файлах.До предыдущей версии оба класса были идентичны, поэтому у меня не было проблем с их загрузкой.Теперь к одному из них добавлен новый метод, и если я хочу получить к нему доступ, я должен не только импортировать класс с этим пакетом, но также должен убедиться, что jar с правильным классом стоит первым в classpath.

то есть javac -classpath "%classpath%;a.jar;b.jar" MyClasses..

, где a.jar имеет класс с моим новым методом.

Теперь, как мне обеспечить это, когда мое приложение отправляется в производство, где оно развертывается какEAR-файл со всеми библиотеками в WEB-INF / lib?

Как узнать, какой jar-файл имеет преимущество перед другим?Это в алфавитном порядке, как a.jar отдается первое предпочтение перед b.jar?

Я прочитал этот поток safe-class-import-from-jar-files и получилзнать о написании собственного загрузчика классов, но есть ли более простое решение?Потому что я просто собираюсь получить доступ к этому методу во всем этом JAR в этом текущем проекте, и написание загрузчика классов кажется немного излишним.

И, пожалуйста, не спрашивайте меня "Почему, черт возьми, тот же класс с тем же пакетомразные банки? "Это абсолютно вне моего контроля и потребуется некоторое время, чтобы исправить это.

Подробности среды: IBM WAS 6.1 на их 1.5 Java.

Пожалуйста, спросите менябольше вопросов, если у меня нет особого смысла.Заранее спасибо!

Ответы [ 6 ]

3 голосов
/ 28 апреля 2011

Вы можете попытаться изменить сценарий запуска вашего сервера и указать jar с правильным классом в пути начальной загрузки, используя java -Xbootclasspath .... В противном случае нет гарантии, какой из двух jar загрузится первым.

3 голосов
/ 28 апреля 2011

Насколько я знаю, порядок загрузки jar-файлов из WEB-INF / lib произвольный - я задал похожий вопрос о JBOSS и получил ответ (от RedHat), что это зависит от порядка, возвращаемого java.io.File.listFiles()их в (и это не гарантированный порядок).

Можно использовать пользовательский загрузчик классов, но рассматривали ли вы переупаковку jar - удаление дублированных классов?

2 голосов
/ 28 апреля 2011

Websphere позволяет вам указать порядок, в котором запрашиваются загрузчики классов конкретного приложения при поиске класса (загрузчики классов иерархически структурированы, от самого верхнего уровня, который загружает классы JRE, до классов загрузки загрузчика классов в вашем WAR).

Во время развертывания приложения вы можете указать порядок запроса загрузчиков классов при поиске класса.Существует два режима: «Родитель первым» (т. Е. Запрос самого верхнего загрузчика классов) и «Родитель последним» (сначала запрос приложения «Загрузчик классов»).Это может быть указано как на уровне EAR, так и на уровне WAR.

Упаковка дублированных банок в разные места приложения (например, один для пути к классам EAR, другой для WEB-INF / lib WAR) и соответствующая настройка порядка загрузки загрузчика классовможет решить вашу проблему.Однако, если оба ваших JAR-файла должны быть на одном уровне (например, WEB-INF / lib), тогда невозможно указать, какой из них будет использоваться при загрузке дублированного класса.

1 голос
/ 28 апреля 2011

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

или просто удалите классы dupe из банок перед развертыванием.

1 голос
/ 28 апреля 2011

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

1 голос
/ 28 апреля 2011

Порядок файлов JAR в одном приложении может быть алфавитным, а порядок приложений - нет.Кроме того, это зависит от того, как сервер обрабатывает загрузку классов, то есть заменяет ли он существующие классы или пропускает новые.

Несмотря на то, что вы уже заявили об этом, я все же хотел бы дать такой совет: иметь тот же класс внесколько JAR, развернутых в одном приложении (что может случиться, например, с версионными банками), всегда плохая идея.Лучше потратить время на то, чтобы это исправить, а не пытаться возиться с загрузкой классов.

...