Проблема с транзитивной зависимостью при использовании спецификации

Допустим, у меня есть
1. проект bom (с именем bom)
2. проект jar (с именем A)
3. проект war (с именем B)

У проекта bom есть версия jackson-data 2.8.5 и 2.8.1 в свойствах и в разделе управления зависимостями 2.8.5 для jackson-data.

проект A, который наследует bom, объявляет в нем зависимость jackson-data с версией 2.8.1.

проект B зависит от проекта A и наследует bom. он не объявляет jackson-data в своей зависимости

теперь, когда я смотрю на каталог lib проекта B, версия jackson-data — 2.8.5, тогда как проект A объявляет ее как 2.8.1.

независимо от того, что объявлено в зависимости, он принимает версию, объявленную в bom. Есть ли способ разрешить транзитивную зависимость jackson-data в проекте B, поскольку она объявлена ​​​​в проекте A, означает версию 2.8.1, а не 2.8.5 при использовании bom?

Ниже представлены помпоны


BOM PROJECT

  <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema- 
    instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
   http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<groupId>com.test</groupId>
<artifactId>bom</artifactId>
<version>1.1</version>
<packaging>pom</packaging>

<properties>
    <jackson-databind.version>2.8.5</jackson-databind.version>
    <jackson-databind.version.A>2.8.1</jackson-databind.version.A>
</properties>

<dependencyManagement>
   <dependencies>
        <dependency>
            <groupId>com.test</groupId>
            <artifactId>A</artifactId>
            <version>1.0</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>${jackson-databind.version}</version>
        </dependency>
   </dependencies>
</dependencyManagement>

пом проекта А

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>com.test</groupId>
        <artifactId>bom</artifactId>
        <version>1.1</version>
    </parent>
    <groupId>com.test</groupId>
    <artifactId>A</artifactId>
    <version>1.0</version>

    <dependencies>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.8.1</version>
        </dependency>

    </dependencies>
</project>

Проект Б

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

<parent>
    <groupId>com.emirates.ibe</groupId>
    <artifactId>bom</artifactId>
    <version>1.1</version>
</parent>
    <groupId>com.test</groupId>
    <artifactId>B</artifactId>
    <version>1.0</version>
    <packaging>war</packaging>

    <dependencies>

        <dependency>
            <groupId>com.test</groupId>
            <artifactId>A</artifactId>
        </dependency>

    </dependencies>
    <build>
        <sourceDirectory>src</sourceDirectory>
        <plugins>

            <plugin>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.1</version>
                <configuration>
                    <source>1.7</source>
                    <target>1.7</target>
                </configuration>
            </plugin>
            <plugin>
                <artifactId>maven-war-plugin</artifactId>
                <version>2.6</version>
                <configuration>
                    <warName>B</warName>
                    <warSourceDirectory>WebContent</warSourceDirectory>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>


person Shuvadip    schedule 02.06.2020    source источник


Ответы (1)


DependencyManagement переопределяет транзитивные зависимости. Вот что здесь происходит (и так должно быть).

Если вам нужна другая версия, либо измените dependencyManagement, либо переопределите в проекте, в котором вы используете A.

person J Fabian Meier    schedule 03.06.2020
comment
понимаю, как был реализован maven. но есть ли другой способ переопределить эту функцию? - person Shuvadip; 03.06.2020
comment
Я предложил вам два. Что вам в них не нравится? - person J Fabian Meier; 03.06.2020
comment
Мы работаем над разделением большого монолитного приложения на небольшие автономные проекты (в настоящее время существует более 200 проектов). все они имеют общую бомбу. и все эти проекты взаимозависимы(сейчас мы решаем через нексус). поскольку это устаревшее приложение, в разных проектах используются разные версии одних и тех же сторонних библиотек, и они отлично работают. ‹br› теперь, если изменить dependencyManagement на i.e, я заставляю проекты использовать ту же версию стороннего приложения (с этим они могут потерпеть неудачу). если мы переопределяем pom, мне придется проверить все переходные deps и изменить pom. - person Shuvadip; 03.06.2020
comment
Итак, я искал способ, который позволит мне переопределить поведение maven по умолчанию, а транзитивные зависимости не будут переопределены bom. Это гарантирует, что мы не нарушим существующий код, и в то же время мы разделим проект как часть первой фазы. Ваш ответ идеально подходит для нашей инициативы второго этапа, когда мы заставим разработчиков использовать ту же версию или переопределить в своих проектах в соответствии с потребностями. - person Shuvadip; 03.06.2020
comment
Это невозможно. Если вы не хотите, чтобы dependencyManagement был на месте, вам нужно удалить его из com.test:bom родительского POM. Ваш родительский POM по сути говорит: переопределите переходные версии, поэтому, если вы этого не хотите, удалите его из родительского POM. - person J Fabian Meier; 03.06.2020
comment
Я понимаю. Спасибо, что нашли время, чтобы просмотреть и ответить на вопрос. ваше здоровье - person Shuvadip; 03.06.2020