В чем разница тегов dependency и dependencyManagement в pom.xml
Что проверяют
Понимаете ли вы, что одно подключает библиотеку, а другое только фиксирует версию.
Как отвечать
<dependencies> объявляет реальные зависимости: они попадают в classpath, скачиваются и участвуют в сборке.
<dependencyManagement> ничего не подключает. Он только задаёт версии и настройки (область видимости, исключения) для зависимостей на случай, если их объявят. Сам по себе он не добавляет в проект ни одного файла.
Зачем это нужно: в многомодульном проекте версии разъезжаются. В родительском pom.xml версии перечисляются один раз в dependencyManagement, а в модулях зависимость объявляется без версии:
<!-- родитель -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.14.0</version>
</dependency>
</dependencies>
</dependencyManagement>
<!-- модуль -->
<dependencies>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
</dependency>
</dependencies>Обновление версии в одном месте расходится по всем модулям, и разные части проекта не тянут разные версии одной библиотеки.
Вторая, не менее важная роль это импорт спецификации версий (BOM):
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>3.2.0</version>
<type>pom</type>
<scope>import</scope>
</dependency>Так подключается согласованный набор версий всей экосистемы Spring, проверенный на совместимость, и вы перестаёте подбирать их вручную.
Дополнительно dependencyManagement управляет версиями транзитивных зависимостей, что помогает подавить конфликт версий, притянутый чужой библиотекой.
Где спотыкаются
Объявляют библиотеку только в dependencyManagement и удивляются, что её нет в проекте.
Дублируют версию и в управлении, и в самой зависимости, теряя смысл централизации.
Не знают про импорт спецификации и прописывают версии Spring руками.
Путают с pluginManagement, который делает то же самое для плагинов.