2013-06-27 3 views
3

Проект maven, состоящий из некоторых модулей. Один из моих модулей использует зависимость guava от версии google 11.0.2. Теперь я интегрирую другой модуль в свой проект, который также использует guava, но версию 14.Конфликт зависимости Maven

Так что я хочу, чтобы этот новый модуль использовал версию guava 14, но оставшаяся часть проекта использовалась для версии guava 11.0.2. Я попытался добавить <exclusion></exclusion> из guava в новый модуль, но он не сработал.

Любые советы для решения этой проблемы.

Обновление: ответ @Guillaume Darmont решает проблему для разных модулей. но теперь моя проблема в том, что новые модули имеют 2 зависимости, одна из них использует guava 11.0.2, а другая использует 14.0. как управлять этим. мы можем отдельно указать в моду pom, какую версию guava использовать.

+0

Я не совсем понял ваш вопрос. Вы пытаетесь использовать Guava '14' на обоих модулях? Кроме того, вы используете общий родительский POM? –

+0

Я хочу использовать guava 14 на новом модуле, который я интегрирую. Старые модули будут использовать только guava 11.0.2. И да, у меня есть родительский ПОМ. –

+0

Вы уверены, что оба 11.0.2 и 14 могут сосуществовать? В нормальных условиях будет использоваться только одна из библиотек (появляющихся сначала в пути к классам). –

ответ

4

Как я понимаю ваш вопрос, вы можете добавить <dependencyManagement> для guava в новом модуле pom.xml:

<dependencyManagement> 
    <dependencies> 
     <dependency> 
      <groupId>com.google.guava</groupId> 
      <artifactId>guava</artifactId> 
      <version>14.0.1</version> 
     </dependency> 
    </dependencies> 
</dependencyManagement> 
+0

Оцените ответ. он работает для упомянутой ситуации. возможно ли использовать другую версию зависимости в одном модуле. я имею в виду, что новый модуль имеет 2 зависимости, один из которых использует guava '11.0.2' и' 14.0'. как управлять этим. –

+0

Нет, это невозможно. Все классы в модуле Maven имеют один и тот же путь к классам. Кстати, просто для ваших зависимостей, у вас должна быть только одна версия guava для всех модулей вашего проекта. Guava 14 должен быть в основном (если не полностью) обратно совместимым с версией 11. –

5

mvn dependency:tree команда поможет определить, какой модуль приносит файл Guava 14 jar.

+2

Более конкретно: зависимость mvn: tree -Dverbose -Dincludes = com.google.guava' будет отображать _just_ части интересующего вас дерева зависимостей и включать сведения о том, почему зависимость была опущена (конфликт/дубликат) в каждом дело. [Проект Apache Maven - разрешение конфликтов с использованием дерева зависимостей] (http://maven.apache.org/plugins/maven-dependency-plugin/examples/resolving-conflicts-using-the-dependency-tree.html) –

0

Во-первых, попробуйте mvn dependency tree и проверьте вывод, что возможно, что 11.0.2 было транзитивно ссылки из более чем одна из ваших зависимостей между проектами, и вам нужно будет добавить исключение ко всем зависимостям, прямо/косвенно вытаскивающим конкретную версию guava, которую вы пытаетесь исключить.

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

Если изменение версии несовместимо с вашим приложением, у вас практически нет опции, кроме как использовать что-то вроде OSGi, чтобы гарантировать, что вы можете запускать разные версии одной и той же библиотеки в проекте.

+0

... или плагин maven shade с перемещением пакета –