Области зависимости 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 - отличное место для начала.