Ответ
Scope (область видимости) зависимости в Maven определяет, на каких этапах жизненного цикла сборки проекта эта зависимость доступна, и влияет на транзитивность зависимостей.
Основные scopes и их назначение:
| Scope | Доступность | Транзитивность | Типичный пример использования |
|---|---|---|---|
compile (по умолчанию) |
Во всех фазах: компиляция, тестирование, выполнение. | Да | Основные библиотеки проекта (Spring Core, Apache Commons). |
provided |
Для компиляции и тестов, но ожидается, что среда выполнения (контейнер) предоставит ее. | Нет | Сервлет-API (предоставляется Tomcat), аннотации Java EE. |
runtime |
Не для компиляции, но для тестов и выполнения. | Да | JDBC-драйверы (например, mysql-connector-java). |
test |
Только для фазы компиляции и выполнения тестов (src/test/java). |
Нет | JUnit, Mockito, Testcontainers. |
system |
Аналогичен provided, но требует явного указания пути к JAR-файлу через <systemPath>. |
Нет | Устаревшие или внутренние библиотеки, не размещенные в репозитории. |
import |
Используется только в секции <dependencyManagement> для импорта BOM (Bill of Materials). |
Нет | Управление версиями через Spring Boot Dependencies BOM. |
Пример объявления зависимости с scope test:
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>5.9.2</version>
<scope>test</scope>
</dependency>
Почему это важно: Правильное указание scope предотвращает:
- Загрязнение classpath: Зависимости для тестов (
test) не попадут в итоговый WAR/JAR. - Конфликты версий: Зависимости, предоставляемые контейнером (
provided), не будут упакованы, избегая конфликтов. - Избыточный размер артефакта: Убираются ненужные для runtime библиотеки.