Ответ
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-файла.