1. Въведение
Maven е един от най-популярните инструменти за изграждане в екосистемата на Java и една от основните му характеристики е управлението на зависимостите.
В тази статия ще опишем и изследваме механизма, който помага при управлението на преходни зависимости в проекти на Maven - обхвати на зависимости.
2. Преходна зависимост
Просто казано, в Maven има два вида зависимости, преки и преходни.
Пряките зависимости са тези, които са изрично включени в проекта. Те могат да бъдат включени в проекта с помощта на тагове:
junit junit 4.12
Преходните зависимости, от друга страна, са зависимости, изисквани от нашите преки зависимости. Необходимите преходни зависимости автоматично се включват в нашия проект от Maven.
Можем да изброим всички зависимости, включително преходни зависимости в проекта, като използваме командата mvn зависимост: дърво .
3. Обхват на зависимостта
Обхватите на зависимостите могат да помогнат за ограничаване на транзитивността на зависимостите и те модифицират пътя на класа за различни вградени задачи. Maven има 6 обхвата на зависимост по подразбиране .
И е важно да се разбере, че всеки обхват - с изключение на импортирането - има влияние върху преходните зависимости.
3.1. Компилирайте
Това е обхватът по подразбиране, когато не е предвиден друг обхват.
Зависимостите с този обхват са налични по пътя на класа на проекта във всички задачи за изграждане и те се разпространяват в зависимите проекти.
По-важното е, че тези зависимости също са преходни:
commons-lang commons-lang 2.6
3.2. Осигурено
Този обхват се използва за маркиране на зависимости, които трябва да бъдат предоставени по време на изпълнение от JDK или контейнер , откъдето идва и името.
Добър случай за използване на този обхват би било уеб приложение, внедрено в някакъв контейнер, където контейнерът вече предоставя някои библиотеки сам.
Например уеб сървър, който вече предоставя API на Servlet по време на изпълнение, така че в нашия проект тези зависимости могат да бъдат дефинирани с предоставения обхват:
javax.servlet servlet-api 2.5 provided
На предвидени зависимости са достъпни само време на компилация и в тест CLASSPATH на проекта; нещо повече, те не са преходни.
3.3. Времетраене
Зависимостите с този обхват се изискват по време на изпълнение , но не са необходими за компилиране на кода на проекта. Поради това, зависимостите, маркирани с обхвата на изпълнение, ще присъстват в средата на изпълнение и тест classpath, но те ще липсват в компилирането на classpath.
Добър пример за зависимости, които трябва да използват обхвата на изпълнение, е JDBC драйвер:
mysql mysql-connector-java 6.0.6 runtime
3.4. Тест
Този обхват се използва, за да покаже, че зависимостта не се изисква при стандартно изпълнение на приложението, а се използва само за целите на теста. Тестовите зависимости не са преходни и присъстват само за пътеките за тестове и изпълнение.
Стандартният случай на използване за този обхват е добавяне на тестова библиотека като JUnit към нашето приложение:
junit junit 4.12 test
3.5. Система
Обхватът на системата е много подобен на предоставения обхват. Основната разлика между тези два обхвата е, че системата изисква да насочваме директно към конкретен буркан в системата.
Важното нещо, което трябва да запомните, е, че изграждането на проекта със зависимости от системния обхват може да се провали на различни машини, ако зависимостите не са налице или се намират на различно място от посоченото в systemPath :
com.baeldung custom-dependency 1.3.2 system ${project.basedir}/libs/custom-dependency-1.3.2.jar
3.6. Внос
Този обхват е добавен в Maven 2.0.9 и е достъпен само за типа зависимост pom . Ще говорим повече за вида на зависимостта в бъдещи статии.
Импортирането показва, че тази зависимост трябва да бъде заменена с всички ефективни зависимости, декларирани в нейния POM:
com.baeldung custom-project 1.3.2 pom import
4. Обхват и преходност
Всеки обхват на зависимостите засяга преходните зависимости по свой начин. Това означава, че различни преходни зависимости могат да се окажат в проекта с различен обхват.
Зависимостите с предоставени обхвати и тест никога няма да бъдат включени в основния проект.
Тогава:
- За обхвата на компилиране , всички зависимости с обхват на изпълнение ще бъдат изтеглени с обхвата на изпълнение , в проекта и всички зависимости с обхвата на компилиране ще бъдат изтеглени с обхвата на компилиране , в проекта
- За предоставения обхват, зависимостите от изпълнението и обхвата на компилиране ще бъдат включени в предоставения обхват в проекта
- За обхвата на теста , преходните зависимости за изпълнение и обхват на компилиране ще бъдат изтеглени с обхвата на теста в проекта
- За обхвата на изпълнение , преходните зависимости на обхвата на изпълнение и обхвата на компилиране ще бъдат изтеглени с обхвата на изпълнение в проекта
5. Заключение
В този бърз урок се фокусирахме върху обхвата на зависимостите на Maven, тяхното предназначение и подробностите за това как функционират.
Ако искате да се задълбочите в Maven, документацията е чудесно място да започнете.