← Назад к вопросам

Какие знаешь Scope у зависимостей в Maven?

2.3 Middle🔥 141 комментариев
#Другое

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

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. Не создаёт реальную зависимость.

Матрица видимости

ScopeCompileRuntimeTestArtifact
compileДаДаДаДа
providedДаНетДаНет
runtimeНетДаДаДа
testНетНетДаНет
systemДаНетДаДа

Практический пример

Основные зависимости (compile), контейнерные API (provided), JDBC драйверы (runtime), тесты (test). Это минимизирует размер артефакта и избегает конфликтов версий.

Ключевые выводы

  1. Правильный выбор scope уменьшает размер артефакта
  2. compile по умолчанию — используй реже, выбирай точнее
  3. provided для контейнерных API
  4. runtime для драйверов и реализаций
  5. test исключает всё ненужное из production build
  6. Транзитивные зависимости наследуют scope от parent