Версия зависимостей Maven от пользователя игнорируется в транзитивных зависимостях
Maven транзитивно тянет в версию 16 guava, хотя у меня есть <dependencyManagement> раздел, который указывает версию 18.
Краткое резюме:
-
gwizard-example
зависит от gwizard-config
-
gwizard-config
имеет родительский pom, gwizard-parent
-
gwizard-parent
имеет <dependencyManagement> который указывает версию 18 guava
К счастью, это проект с открытым исходным кодом, так что вы можете напрямую увидеть poms: gwizard-parent, gwizard-config, gwizard-example. Однако здесь важный бит в gwizard-parent
:
<properties>
<guava.version>18.0</guava.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>${guava.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
... и зависимость от излишеств, объявленная в примере gwizard:
<properties>
<gwizard.version>0.5</gwizard.version>
</properties>
<dependencies>
<dependency>
<groupId>org.gwizard</groupId>
<artifactId>gwizard-config</artifactId>
<version>${gwizard.version}</version>
</dependency>
</dependencies>
Дерево зависимостей для gwizard-config правильно отображает guava 18:
[INFO] --- maven-dependency-plugin:2.8:tree (default-cli) @ gwizard-config ---
[INFO] org.gwizard:gwizard-config:jar:0.5
[INFO] +- com.google.inject:guice:jar:4.0-beta5:compile
[INFO] | \- com.google.guava:guava:jar:18.0:compile
Однако дерево зависимостей для примера gwizard показывает guava 16 (что вызывает проблемы):
[INFO] --- maven-dependency-plugin:2.8:tree (default-cli) @ gwizard-example ---
[INFO] org.gwizard:gwizard-example:jar:1.0-SNAPSHOT
[INFO] +- org.gwizard:gwizard-config:jar:0.5:compile
[INFO] | +- com.google.inject:guice:jar:4.0-beta5:compile
[INFO] | | \- com.google.guava:guava:jar:16.0.1:compile
Это использование Maven v3.2.5. Я сбит с толку. Помощь?
Возможно, связано: зависимость управления в родительском доме игнорируется
ОБНОВЛЕНИЕ. Помпы, связанные с github, меняются; добавляя зависимость от gwizard-services
(которая прямо объявляет depa guava) в gwizard-example
"исправлена" проблема. Здесь все еще есть какое-то плохое основное поведение.
UPDATE: создан этот вопрос JIRA
Ответы
Ответ 1
Простая вещь. A dependencyManagement
не объявляет зависимость, которая действительно используется , она определяет только версии и т.д., Которые могут использоваться .
Если вы определите что-то подобное, это не приведет к изменению.
<properties>
<guava.version>18.0</guava.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>${guava.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
Если вам действительно нравится перезаписывать версию, которая используется в вашем дереве, вам нужно определить реальную зависимость:
Поэтому, основываясь на приведенном выше определении, вам необходимо также добавить следующее:
<dependencies>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
</dependency>
</dependencies>
Если вы добавили это, пожалуйста, проверьте позже mvn dependency:tree
.
Ответ 2
В этом случае Maven не разрешает проблему транзитивной зависимости версии.
Эта проблема может быть использована с использованием концепции maven bom.
Проверьте документацию maven для bom в приведенной ниже ссылке
http://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html#Dependency_Management
Вот еще один блог, в котором объясняется использование
http://howtodoinjava.com/maven/maven-bom-bill-of-materials-dependency/
В вашем случае для решения этой проблемы вам нужно добавить приведенную ниже зависимость в разделе dependencyManagement примера gwizard проекта.
<dependency>
<groupId>org.gwizard</groupId>
<artifactId>gwizard-parent</artifactId>
<version>${gwizard.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>