2015-03-04 2 views
0

В моем проекте у меня есть зависимости displaytag и birt-runtime. И здесь нужно отображать теги тегов itext-2.0.1.jar и birt-runtimeitext-2.1.7.jar так как я могу объявить это в своем pom.xml, чтобы использовать itext-2.0.1.jar только через displaytag и использовать itext-2.1.7.jar только по birt-runtime. мог ли кто-нибудь дать мне знать, как этого добиться? Спасибо заранее.Как использовать два ведра jext-файлов itext в pom.xml?

ответ

1

В обычном java-приложении это невозможно, потому что в приложении itext 2.1 и 2.0 будет использовать один и тот же загрузчик классов. Но, как правило, java-apis заботится о обратной совместимости, поэтому должно быть возможно включить только 2.1.

Если нет, вам нужно несколько загрузчиков классов, и тогда это осложнится.

Существующие решения:

  • Вы могли бы попытаться добавить контейнер OSGi в приложение и запустить как зависимостей в виде отдельного OSGi расслоения.
  • Если вы запустите сервер приложений jboss , вы можете создать один модуль с displaytag и еще один с birt-runtime.

DIY:

  • Я никогда не делал этого, но вы могли бы попытаться создать для управления собственных загрузчиков классов в вашем приложении и загрузить зависимые банки в каждый собственный загрузчик классов. Это article, кажется, охватывает тему.
+0

Невозможно достичь этого с помощью dependencyManagement in maven? –

+0

Нет, вы не можете, потому что Maven является инструментом сборки и не влияет на среду выполнения. –

0

Короткий ответ: вы не можете.

Длинный ответ: Maven - это инструмент построения и не влияет на загрузку класса времени выполнения в вашем приложении. Обычно он генерирует один (или более) артефакт (ы), типично банку или военные файлы, которые могут содержать или не содержать зависимости вашего проекта (в зависимости от ваших файлов POM).

То, что вы хотите достичь, выполняется во время выполнения загрузчиками классов, но при нормальных обстоятельствах вы не хотите вмешиваться в загрузку классов.

Что вы можете сделать, это:

  1. Исключить излишние переходные зависимости от зависимости в вашем ПОМ путем определения exclusions, будет использоваться таким образом, только одна версия IText. Конечно, это работает только в том случае, если ваши зависимости не зависят от внутренних компонентов itext, а их общедоступный API совместимы, но это может быть самым простым и простым решением.

  2. Используйте каркас/контейнер, который имеет более сильный контроль над загрузкой классов, например, контейнер OSGi. Эти контейнеры предоставляют пакеты (несколько эквивалентные артефактам) с «частными» загрузчиками классов, позволяя вашему приложению иметь несколько версий одной и той же загруженной библиотеки, которые не мешают друг другу. Однако это решение имеет и другие недостатки, и я бы рекомендовал это, только если вы уже знакомы с OSGi.

+0

Невозможно добиться этого с помощью dependencyManagement в maven? –

+0

no, dependencyManagement просто делегирует задание деталей зависимостей другим модулям (обычно к родительскому POM), но это не меняет самого способа работы Maven. – xea