Подумайте о следующем pom.xml
, используя maven 3.6.2
<?xml version="1.0" encoding="UTF-8"?>
<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>
<artifactId>foo</artifactId>
<groupId>bar</groupId>
<version>1.0.0</version>
<dependencies>
<!-- #1
<dependency>
<groupId>org.jdbi</groupId>
<artifactId>jdbi3-jackson2</artifactId>
<version>3.12.0</version>
</dependency>
-->
<dependency>
<groupId>org.apache.kafka</groupId>
<artifactId>kafka_2.12</artifactId>
<version>2.4.0</version>
<scope>compile</scope>
</dependency>
<!-- #2
<dependency>
<groupId>org.jdbi</groupId>
<artifactId>jdbi3-jackson2</artifactId>
<version>3.12.0</version>
</dependency>
-->
</dependencies>
<!-- #3
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.jdbi</groupId>
<artifactId>jdbi3-bom</artifactId>
<type>pom</type>
<version>3.12.0</version>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
-->
<properties>
<maven.compiler.target>11</maven.compiler.target>
<maven.compiler.source>11</maven.compiler.source>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
</properties>
</project>
Если вы запустите mvn dependency:tree | grep databind
, вы должны увидеть:
[INFO] +- com.fasterxml.jackson.core:jackson-databind:jar:2.10.0:compile
Это базовая линия и устанавливается kafka_2.12
использует jackson-databind:2.10.0
Если вы раскомментируете только комментарий # 1 и повторно запускаете, вы должны увидеть:
[INFO] | +- com.fasterxml.jackson.core:jackson-databind:jar:2.9.9.3:compile
Это имеет смысл для меня и говорит мне jdbi3-jackson2
использует jackson-databind:2.9.9.3
и эта версия используется, потому что она появляется до kafka_2.12
Если вы раскомментируете только комментарий № 2 и повторите его, вы должны увидеть:
[INFO] | +- com.fasterxml.jackson.core:jackson-databind:jar:2.10.0:compile
Это также имеет смысл для меня, потому что jdbi3-jackson2
теперь появляется после kafka_2.12
Если вы раскомментируете только комментарий № 3 и повторите его, вы должны увидеть:
[INFO] +- com.fasterxml.jackson.core:jackson-databind:jar:2.9.9.3:compile
Я ожидал 2.10.0
, потому что я ничего не использую от бомбы (в частности, jdbi3-jackson2
)
На основании почти всего, что все говорят о бомбах, я бы подумал, что информация о их версии будет только будет использоваться при применении зависимости в BOM
Далее, если я добавлю следующее в любом месте i n dependencyManagement
затем возвращается к 2.10.0
:
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.10.0</version>
</dependency>
- как я могу обнаружить эту проблему (я обнаружил это только потому, что kafka завершится ошибкой и сообщит, что для этого требуется указать c Джексон). Моя мысль - написать скрипт / плагин, который сравнивает зависимости: дерево с «золотой» копией и терпит неудачу, если они различаются, чтобы заставить людей хотя бы дважды проверить свои изменения при изменении
dependencyManagement
- как мне исключить зависимость от
dependencyManagement
? Я сделал это с нормальными зависимостями, и такой же тег исключения существует для dependencyManagement
, но все, что я пробую, работает. Я бы предположил, что исключение вступает в силу, когда вы фактически используете зависимость, но я также думал, что версия вступит в силу только тогда, когда вы действительно используете зависимость, но это предположение кажется неправильным. - , потому что я не могу исключить это, я могу форсировать версию с помощью метода, описанного выше, но почему он работает независимо от порядка, когда он находится в
dependencyManagement
, в отличие от того, где порядок имеет значение в обычном теге dependencies
?