Карта / Сборка (Maven/Gradle) / Зависимости

Зависимости

Зависимость — внешняя библиотека, которую использует твой проект. Вместо того чтобы скачивать .jar-файлы вручную, Maven делает это сам по описанию в pom.xml:

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
        <version>3.2.0</version>
    </dependency>
</dependencies>

Указал координаты (те же groupId/artifactId/version, что у pom.xml — тема «pom.xml») — Maven сам скачивает библиотеку и все, что нужно ей самой, из репозитория (по умолчанию — Maven Central, публичное хранилище библиотек).

Копнуть глубже

Транзитивные зависимости. Когда подключаешь библиотеку, она часто тянет за собой свои зависимости — это и есть транзитивность. Если Spring Boot Starter Web использует Jackson для JSON, тебе не нужно подключать Jackson отдельно — он придёт автоматически.

<scope> определяет, где зависимость используется:

<dependency>
    <groupId>org.junit.jupiter</groupId>
    <artifactId>junit-jupiter</artifactId>
    <scope>test</scope>   <!-- только для тестов, не попадёт в финальный jar -->
</dependency>
  • compile (по умолчанию) — нужна везде, попадает в итоговую сборку;
  • test — только для тестов;
  • provided — нужна для компиляции, но на проде уже есть (например, сервлет-контейнер);
  • runtime — не нужна для компиляции, только во время выполнения.

Конфликты версий. Если две библиотеки тянут разные версии одной и той же зависимости — Maven выбирает по правилу “ближайшая по дереву зависимостей” (nearest wins). Посмотреть полное дерево: mvn dependency:tree.

🎤 Закрыл тему, если можешь объяснить:
• что такое зависимость и откуда Maven её берёт;
• что такое транзитивные зависимости и зачем нужен `` (если дошёл до 2-го слоя).