Области зависимости Maven

Области зависимости Maven

1. Вступление

Maven является одним из самых популярных инструментов сборки в экосистеме Java, и одной из его основных функций является управление зависимостями.

В этой статье мы собираемся описать и изучить механизм, который помогает в управлении транзитивными зависимостями в проектах Maven - области зависимостей.

2. Транзитивная зависимость

Проще говоря, в Mavendirect иtransitive. есть два типа зависимостей.

Прямые зависимости - это те, которые явно включены в проект. Их можно включить в проект с помощью тегов<dependency>:


    junit
    junit
    4.12

Transitive dependencies, on the other hand, are dependencies required by our direct dependencies. Требуемые транзитивные зависимости автоматически включаются в наш проект Maven.

Мы можем перечислить все зависимости, включая транзитивные, в проекте, используя команду:mvn dependency:tree.

3. Области зависимости

Области зависимостей могут помочь ограничить транзитивность зависимостей, и они изменяют путь к классам для различных встроенных задач. Maven has 6 default dependency scopes.

И важно понимать, что каждая область действия - за исключениемimport - действительно влияет на транзитивные зависимости.

3.1. компилировать

Это область действия по умолчанию, если не предусмотрена другая область.

Зависимости с этой областью видимости доступны в пути к классам проекта во всех задачах сборки, и они распространяются на зависимые проекты.

Что еще более важно, эти зависимости также являются переходными:


    commons-lang
    commons-lang
    2.6

3.2. При условии

Эта область используется для обозначенияdependencies that should be provided at runtime by JDK or a container, отсюда и название.

Хорошим вариантом использования этой области будет веб-приложение, развернутое в каком-либо контейнере, где контейнер уже предоставляет некоторые библиотеки.

Например, веб-сервер, который уже предоставляет API сервлетов во время выполнения, поэтому в нашем проекте эти зависимости могут быть определены в областиprovided:


    javax.servlet
    servlet-api
    2.5
    provided

Зависимостиprovided доступны только во время компиляции и в тестовом пути к классам проекта; более того, они не транзитивны.

3.3. время выполнения

The dependencies with this scope are required at runtime, но они не нужны для компиляции кода проекта. Из-за этого зависимости, отмеченные областьюruntime, будут присутствовать во время выполнения и в пути к тестовым классам, но они будут отсутствовать в пути к классам компиляции.

Хорошим примером зависимостей, которые должны использовать область выполнения, является драйвер JDBC:


    mysql
    mysql-connector-java
    6.0.6
    runtime

3.4. Test

Эта область используется, чтобы указать, что зависимость не требуется во время стандартного выполнения приложения, а используется только в целях тестирования. Test dependencies aren’t transitive and are only present for test and execution classpaths.с

Стандартный вариант использования для этой области - добавление тестовой библиотеки, такой как JUnit, в наше приложение:


    junit
    junit
    4.12
    test

3.5. система

System scope is much similar to the provided scope. Основное различие между этими двумя областями видимости состоит в том, чтоsystem требует, чтобы мы указывали непосредственно на конкретный файл jar в системе.

Важно помнить, что сборка проекта с зависимостями области действияsystem может завершиться ошибкой на разных машинах, если зависимости отсутствуют или расположены в другом месте, чем указываетsystemPath:


    com.example
    custom-dependency
    1.3.2
    system
    ${project.basedir}/libs/custom-dependency-1.3.2.jar

3.6. Импортировать

Эта область видимости была добавлена ​​в Maven 2.0.9 иit’s only available for the dependency type pom.. Подробнее о типе зависимости мы поговорим в следующих статьях.

Import указывает, что эта зависимость должна быть заменена всеми действующими зависимостями, объявленными в ее POM:


    com.example
    custom-project
    1.3.2
    pom
    import

4. Объем и транзитивность

Каждая область зависимостей влияет на транзитивные зависимости по-своему. Это означает, что разные переходные зависимости могут оказаться в проекте с разными областями действия.

Однако зависимости с областями действияprovided иtest никогда не будут включены в основной проект.

Затем:

  • Для областиcompile все зависимости сruntime scope будут включены в область действияruntime в проект, а все зависимости с областью действияcompile будут включены с областью compile в проекте

  • Для областиprovided зависимости областейruntime иcompile будут включены в область действияprovided в проекте.

  • Для областиtest транзитивные зависимости областиruntime иcompile будут включены в область действияtest в проекте.

  • Для областиruntime транзитивные зависимости областиruntime иcompile будут включены в область действияruntime в проекте.

5. Заключение

В этом кратком руководстве мы сфокусировались на областях зависимостей Maven, их назначении и деталях их работы.

Если вы хотите глубже изучить Maven,documentation - отличное место для начала.