Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Scope зависимостей в Maven
Scope определяет, когда и где зависимость будет доступна в жизненном цикле проекта. Это ключевой механизм для управления classpath и размером артефактов.
1. compile (по умолчанию)
<!-- Доступна на всех класспатах -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>5.3.0</version>
</dependency>
Доступна при компиляции, тестировании и runtime. Включается в артефакт. Транзитивно передаётся потребителям.
2. provided
<!-- Предоставляется контейнером -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.0</version>
<scope>provided</scope>
</dependency>
Доступна при компиляции и тестировании, но НЕ включается в артефакт и НЕ передаётся транзитивно. Используется для Servlet API, которые предоставляет контейнер.
3. runtime
<!-- Нужна только при запуске -->
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.26</version>
<scope>runtime</scope>
</dependency>
НЕ доступна при компиляции, но включается в артефакт и доступна при runtime и тестировании. Используется для JDBC драйверов и реализаций интерфейсов (SLF4J).
4. test
<!-- Только для тестов -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope>
</dependency>
Доступна только при тестировании. НЕ включается в артефакт и НЕ передаётся транзитивно. Используется для JUnit, Mockito, TestNG.
5. system
<!-- Явный путь к файлу (DEPRECATED) -->
<dependency>
<groupId>com.example</groupId>
<artifactId>custom-lib</artifactId>
<version>1.0</version>
<scope>system</scope>
<systemPath>${java.home}/lib/tools.jar</systemPath>
</dependency>
Похож на provided, но путь указывается явно. Не ищется в репозитории. DEPRECATED и должен избегаться.
6. import (для BOM)
<!-- Только в dependencyManagement для импорта версий -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.6.0</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
Используется только в dependencyManagement для импорта управления версиями из другого POM. Не создаёт реальную зависимость.
Матрица видимости
| Scope | Compile | Runtime | Test | Artifact |
|---|---|---|---|---|
| compile | Да | Да | Да | Да |
| provided | Да | Нет | Да | Нет |
| runtime | Нет | Да | Да | Да |
| test | Нет | Нет | Да | Нет |
| system | Да | Нет | Да | Да |
Практический пример
Основные зависимости (compile), контейнерные API (provided), JDBC драйверы (runtime), тесты (test). Это минимизирует размер артефакта и избегает конфликтов версий.
Ключевые выводы
- Правильный выбор scope уменьшает размер артефакта
- compile по умолчанию — используй реже, выбирай точнее
- provided для контейнерных API
- runtime для драйверов и реализаций
- test исключает всё ненужное из production build
- Транзитивные зависимости наследуют scope от parent