Java: использовать две версии одной и той же библиотеки в одном веб-приложении - PullRequest
6 голосов
/ 30 августа 2011

Я сталкиваюсь со следующей проблемой: у меня есть один модуль в моем веб-приложении, которому нужен jaxb 1.x, а другому модулю нужен jaxb 2.x. Первый модуль не работает с новой версией jaxb, и наоборот. Как я могу использовать эти две банки в одном проекте? Спасибо.

Ответы [ 4 ]

5 голосов
/ 30 августа 2011

Для обычного приложения, как правило, очень разные версии используют разные имена пакетов.Если это так, вы можете использовать их одновременно без проблем.Однако, если они совпадают, вы можете использовать jarjar для переименования пакета.

Однако, поскольку вы используете веб-контейнер, каждое приложение должно использовать развернутую версию, а не другую версию.т. е. веб-контейнер работает для вас.

OSGi - это еще один контейнер, который намного более четко управляет версиями и дает вам больший контроль над этими проблемами (однако я считаю, что вам это нужно только для этого)

2 голосов
/ 30 августа 2011

У вас проблема с адской кровью.Вообще говоря, в обычной среде Java эту проблему невозможно решить.Вы должны использовать модульность в своем проекте, используя OSGI.Начальная точка: http://www.osgi.org/About/HowOSGi

1 голос
/ 30 августа 2011

Если вы используете эталонную реализацию JAXB, то вы можете использовать свои модели JAXB 1 с JAXB 2 средой выполнения, включая jaxb1-impl.jar .

1 голос
/ 30 августа 2011

Как сказал Шаман, решить эту проблему невозможно.

Давайте посмотрим: у контейнера сервлетов JRE есть только один загрузчик классов, и этот загрузчик классов может загружать и использовать один класс из jaxb или другого, но не оба, что даст вам исключение classdefnotfound или нечто подобное.

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

Лучше, если вы перенесете код для использования самого современного API (jaxb 2)

...