2016-02-13 4 views
6

У меня есть веб-приложение, в котором зависимостей тянуть в двух банках под названием:Maven - Multiple версия той же зависимости

  1. Javassist-3.9.0.GA.jar
  2. Javassist-3.20.0-GA .jar

Когда я упаковываю WAR, у меня есть оба из них в каталоге WEB-INF/lib, мой вопрос в том, что приложение работает и почему я не получаю никаких проблем, потому что, видимо, у меня есть те же классы в обеих баночках и должны быть проблемы ??? не так ли?

+1

Если у вас действительно есть две версии одного и того же артефакта в вашей «войне», вы делаете что-то не так ... по умолчанию у Maven и maven-war-plugin никогда не должно быть дублированного файла jar в вашей папке lib. (кажется, вы делаете что-то вручную, что должно покинуть maven) ... – khmarbaise

+0

Спасибо, если я использую цель «package» для создания военного файла, разве это не использование плагина maven war для этого? если нет, то какой другой плагин maven-war-плагин делает, чтобы «упаковать» цель? –

+0

'package' не является целью, это жизненный цикл. Если вы установили правильную' войну 'в вашем файле pom, это должно работать из коробки ... Лучше всего было бы увидеть файл pom, который вы используете. – khmarbaise

ответ

14

Для Java не имеет значения, сколько версий класса вы предоставляете. По умолчанию загрузчик классов просто выбирает первый из найденного пути к классам.

Так как вы можете запустить приложение без ошибок это означает одно из следующих действий:

  • если Javassist-3.9.0.GA.jar является первым на пути к классам: приложение не полагаться на новый API или исправления в javassist-3.20.0-GA.jar. Также API-интерфейсы, которые вы использовали в этой библиотеке, не изменились между этими версиями (которые библиотека не должна делать между младшими версиями)

  • , если javassist-3.20.0-GA .jar является первым в пути к классу: библиотека обратно совместима

Я предлагаю:

  • Если эти зависимости являются прямыми зависимостями в различных частях приложения, убедитесь, что вы используете везде один и тот же вариант. Лучший способ - исправить версию в разделе dependencyManagement родительского POM и затем опустить атрибут версии в разделах зависимостей.
  • Если эти зависимости являются транзитивными зависимостями, то исключайте тот, который вы не хотите использовать, чтобы убедиться, что у вас есть только одна версия библиотеки в вашем конечном приложении. Также рассмотрите вопрос о проблеме для проекта, который все еще использует старую версию, и попросите обновить версию зависимостей.
  • Если вам нужно работать с двумя несовместимыми версиями одной и той же библиотеки, которые имеют одинаковые имена пакетов и классов, рассмотрите возможность использования модульной системы, такой как OSGi, которая в некоторой степени поддерживает различные версии одной и той же библиотеки.
+0

Я понимаю это и его логическое объяснение, но это не значит, что приложение действительно подвержено риску, потому что если у меня есть зависимость, которая зависит от класса от 3.9.0.GA, и этот класс был обновлен в 3.20 .2-GA, а также 3.20.0-GA является первым и в пути к классам И, что зависимости требуется версия этого конкретного класса в 3.9.0.GA? –

+0

Также возникает вопрос, как определить, какой из них является первым в пути к классам? –

+0

Вы не можете узнать, что является первым ... Это большая проблема в вашем приложении ... Вы должны исправить это. В противном случае ваше приложение может работать, а иногда оно терпит неудачу ... – khmarbaise

2

Ответ на вопрос "какие-либо рекомендации по его устранению?" взгляните на Resolving conflicts using the dependency tree. С помощью команды mvn dependency:tree вы сможете узнать, откуда исходит какая-либо зависимость. Когда вы знаете, какие артефакты зависят от javassist, вы можете добавить исключение, чтобы избежать одной из javassist версии.