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


Автор: Се ля ви 11.4.2007, 15:17
Существуют какие-то правила, регламентирующие подгрузку классов из Jar-ников в дерритктории, в которой сразу лежат две версии одной и той же библиотеки, и естественно содержат классы в одинаковых пакетах и с одинаковыми именами?

Добавлено через 1 минуту и 10 секунд
То есть как мне чётко указать из какого Jar-ника из нескольких импортированных надо взять нужный мне класс?

Автор: LSD 11.4.2007, 15:34
Стандартный class-loader ищет файлы почередно просматривая все элементы CLASSPATH, но гарантий такого поведения нет.

Автор: kkorsakoff 11.4.2007, 15:38
1. Регламента четкого нет насколько мне известно, но есть вполне известная логика работы "стандартного" класслоадера (URLClassLoader).

...
 * Finds the first occurrence of a resource that can be found. The locations
 * are searched in the order they were added to the URLClassLoader.
 *
 * @param resourceName the resource name to look for
 * @return the URLResource for the resource if found, null otherwise
...


2. Такое можно реализовать либо написав свой класслоадер, либо создав URLClassLoader, передав ему нужные джары и загрузить им нужный класс. Но пользоваться созданными объектами будет не очень удобно, ведь прийдется манипулировать при помощи рефлекшена, ведь если ты будешь использовать имя класса типа Logger l=..., то класс Logger будет загружен тем же самым "стандартным" класслоадером при загрузке ссылающегося класса. Немного сумбурно, но вроде бы такsmile

Автор: chief39 11.4.2007, 16:35
Лучше до такого не доводить... Может вручную и можно временно перехитрить... Но что делать с джибоссом, например, который в либе видит этот класс + в еарке и, ессно, ругается.... ?

Автор: _Y_ 11.4.2007, 17:59
Цитата(Се ля ви @ 11.4.2007,  15:17)
как мне чётко указать из какого Jar-ника из нескольких импортированных надо взять нужный мне класс?

Так может просто делать это при обьявлении переменных? Т.е. явно указывать пакет. Например при обьявлении переменных variable1 и variable2:
Код

com.sun.xml.internal.bind.v2.model.core.Element variable1;
javax.swing.text.Element variable2;

И можно пользоваться одноименными классами из разных пакетов

Автор: Се ля ви 11.4.2007, 18:15
_Y_, да в том-то и дело, что пакет-то один smile Просто разные версии либы подключены к приложению одновременно...

Так получается из-за того, что кто-то допустим напишет библиотеку mylib1.jar . Первую версию, ессно. Потом кто-то напишет ещё одну библиотеку butthisismylib.jar, классы в которой будут использовать mylib1.jar . А потом первый парень напишет версию 2: mylib2.jar . И мы заложим её как базовую при разработке какого-то проекта. И потом нам понадобится и библиотека butthisismylib.jar и выясняется, что второй парень для новой версии либы mylib свою либу не переписал и нам приодится присоединять к проекту и mylib1.jar, что бы работала butthisismylib.jar.

А потом начинаются догадайся какие чудеса...

Добавлено через 7 минут и 45 секунд
Цитата(chief39 @  11.4.2007,  16:35 Найти цитируемый пост)
Лучше до такого не доводить... Может вручную и можно временно перехитрить... Но что делать с джибоссом, например, который в либе видит этот класс + в еарке и, ессно, ругается.... ?

Ну тут хотя бы теоретически понятно, что приоритет должен быть у либ твоего аппликейшна, затем JBoss`а, затем - JVM и общего CLASSPATH`а...

Автор: chief39 11.4.2007, 19:39
Цитата(Се ля ви @  11.4.2007,  18:15 Найти цитируемый пост)
Ну тут хотя бы теоретически понятно, что приоритет должен быть у либ твоего аппликейшна, затем JBoss`а, затем - JVM и общего CLASSPATH`а...

Без приоритетов. Два варианта класса - "трахайся, хозяин, я с таким не работаю".
И он, в принципе, прав.
Java для замены своих классов как бы endorsed предполагает...

А в данной ситуации...
Цитата(Се ля ви @  11.4.2007,  18:15 Найти цитируемый пост)
А потом начинаются догадайся какие чудеса...

а что начнётся когда ты вручную обойдёшь нестыковки и "покажешь" куда класслоадеру глядеть?

Если парень не может написать либу 2 с поддержкой фич либы 1 - тогда кто будет следить за правильным(!) автовыбором нужного джарника?
Только усугубите кашу...
Имхо - боретесь со следствием, а не с причиной... и оно далеко заведёт...

Можно, конечно, как kkorsakoff показал. но ведь и сам понимаешь что новые бока далеко переплюнут нынешние....

Автор: nornad 11.4.2007, 21:14
Цитата(Се ля ви @  11.4.2007,  21:15 Найти цитируемый пост)
Так получается из-за того, что кто-то допустим напишет библиотеку mylib1.jar . Первую версию, ессно. Потом кто-то напишет ещё одну библиотеку butthisismylib.jar, классы в которой будут использовать mylib1.jar . А потом первый парень напишет версию 2: mylib2.jar . И мы заложим её как базовую при разработке какого-то проекта. И потом нам понадобится и библиотека butthisismylib.jar и выясняется, что второй парень для новой версии либы mylib свою либу не переписал и нам приходится присоединять к проекту и mylib1.jar, что бы работала butthisismylib.jar.

Я так понимаю, что в данном случае проблема больше в правильной проектировке интерфейса либы. Наиболее умный вариант - делать либу так, чтобы она не изменяла свой интерфейс от версии к версии. Точнее, чтобы все старые вещи были доступны и дальше. Новое - добавляйте. Старое - менять только внутри, но так, чтобы никакие закулисные действия не изменялись (лучше чтобы их вообще не было).
А любой способ, который вы сейчас отыщете, будет чреват жуткими последствиями в недалёком будущем (думаю, вторая версия либы - это не предел и будут и последующие  smile ).

Автор: LSD 11.4.2007, 21:57
Цитата(Се ля ви @  11.4.2007,  18:15 Найти цитируемый пост)
Ну тут хотя бы теоретически понятно, что приоритет должен быть у либ твоего аппликейшна, затем JBoss`а, затем - JVM и общего CLASSPATH`а...

Ну конечно, JVM не даст тебе грузить классы из пакетов java и javax. Вообщем это неправильное проектирование.

Хотя я и сам с такими проблемами сталкивался и именно с JBoss smile

Автор: chief39 11.4.2007, 23:49
Цитата(LSD @  11.4.2007,  21:57 Найти цитируемый пост)
Вообщем это неправильное проектирование.

Имхо, это таки так. :(

Цитата(LSD @  11.4.2007,  21:57 Найти цитируемый пост)

Хотя я и сам с такими проблемами сталкивался и именно с JBoss smile 

Джибосс - это у мну ;) У Селяви, кажется, сановский сервер и, кажется, веблогик

Почти единогласно выходит что дело не в лоадерах а в проектировании либы.

И хотя звучит как "вместо нужной настройки апача советуют пересесть на IIS", но всё-таки пересмотреть подход к разработке либ было бы лучше...

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

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