Что такое Scope у зависимости в Maven?

«Что такое Scope у зависимости в Maven?» — вопрос из категории DevOps, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Scope в Maven определяет жизненный цикл зависимости и её видимость (включается ли она в classpath) для различных этапов сборки, тестирования и выполнения проекта.

Основные значения scope:

Scope Описание Включается в classpath для... Пример использования
compile (По умолчанию) Зависимость доступна на всех этапах. Компиляции, тестов, выполнения. spring-core, lombok.
provided Зависимость предоставляется средой выполнения (JDK, контейнер сервлетов). Компиляции и тестов, но не для сборки исполняемого артефакта (WAR/JAR). servlet-api, javax.annotation-api.
runtime Зависимость не нужна для компиляции, но требуется во время выполнения. Тестов и выполнения, но не для компиляции. JDBC-драйвер базы данных (например, mysql-connector-java).
test Зависимость нужна только для фазы тестирования. Только для компиляции и запуска тестов (src/test/java). junit, mockito.
system Аналогичен provided, но требует явного указания пути к JAR-файлу в системе. Компиляции и тестов. Используется редко, так как делает сборку непереносимой. Внутренние, неопубликованные библиотеки.
import Используется только в секции <dependencyManagement> для импорта зависимостей из другого POM (обычно BOM). Не определяет classpath. Управляет версиями. Импорт Spring Boot BOM: spring-boot-dependencies.

Пример объявления в pom.xml:

<dependencies>
    <!-- Зависимость только для тестов -->
    <dependency>
        <groupId>org.junit.jupiter</groupId>
        <artifactId>junit-jupiter-engine</artifactId>
        <version>5.9.2</version>
        <scope>test</scope>
    </dependency>

    <!-- Зависимость, предоставляемая контейнером (Tomcat) -->
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>javax.servlet-api</artifactId>
        <version>4.0.1</version>
        <scope>provided</scope>
    </dependency>
</dependencies>

Практическое влияние: Scope влияет на содержимое итоговых артефактов (JAR/WAR). Например, зависимости с provided и test не будут включены в WEB-INF/lib WAR-файла.