Версия зависимостей 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>