2015-01-23 2 views
2

Скажет, у вас есть проект (веб-приложение), который использует 2 сторонних библиотеки - A и B.
Say А зависят от версии 1.10 другой библиотеки третьей стороны C.
Say B зависит от версии 1.15 той же сторонней библиотеки C.версия JAR зависимость конфликт - Java

Какую версию C вы должны поместить в папку lib вашего проекта веб-приложения ?!

Предположим, что вы не знаете C хорошо, вы не уверены, совместим ли C 1.15 с 1.10 или что-то в этом роде.

Есть ли способ поместить A.jar и B.jar, и оба контейнера C в папке lib вашего проекта, но во время выполнения (под Tomcat или JBoss, например) есть нагрузка C 1.10 jar, но есть B нагрузка C 1.15 банок.

Я не думаю, что это возможно, поскольку они используют один и тот же загрузчик классов для веб-приложений (и поэтому он будет загружать классы C от 1.10 или из 1.15 в значительной степени непредсказуемо, какой бы из двух JARs не был первым на classpath) ... но я не уверен.

Если это действительно невозможно, то в чем лучшая практика для борьбы с подобными конфликтами?

+0

Вы не должны кодировать то, что требует 2 версии одной и той же библиотеки. Это просто соответствует низким стандартам кодирования. Я предлагаю вам обновить до последней версии библиотеки, а затем обновить код по мере необходимости, чтобы быть совместимым. –

+0

@MikeElofson Обратите внимание, что я не кодировал его. Я просто хочу использовать A и B, которые являются двумя несвязанными сторонними библиотеками. Они полагаются на разные версии C. –

+0

И библиотеки, которые вы используете, не упаковывают свои необходимые банки в саму библиотеку? –

ответ

0

Может предлагать два решения: 1) напишите свои загрузчики классов как для A, так и для B, используя различные версии банкомата. Вы можете разместить файлы C jar в двух разных папках в lib, в веб-приложении. и создавать объекты для A и B с помощью разных загрузчиков классов. Это немного осязаемый подход, но он будет работать.

2) хотя и не уверен, но OSGI может быть вам полезна.

Смежные вопросы