- Дерево зависимостей Maven — разрешение конфликтов
- Как получить дерево зависимостей Maven проекта
- Исключение зависимости из зависимостей проекта Maven
- Разрешение конфликтов с использованием подробного режима дерева зависимостей Maven
- Фильтрация дерева зависимостей Maven
- -Включает
- -Исключает
- Дерево зависимостей Maven в Eclipse IDE
- Сохранение дерева зависимостей в файл
- Рекомендации
Дерево зависимостей Maven — разрешение конфликтов
Дерево зависимостей Maven очень полезно для понимания зависимостей проекта и разрешения любых конфликтов из-за разных версий зависимости.
Как получить дерево зависимостей Maven проекта
Мы можем запустить команду mvn dependency:tree в терминале, чтобы распечатать дерево зависимостей проекта. В нашем примере я буду использовать репозиторий GitHub. Нас интересуют только зависимости проекта. pom.xml объявил следующие зависимости проекта.
org.junit.platform junit-platform-runner 1.2.0 test org.junit.jupiter junit-jupiter-engine 5.2.0 test org.mockito mockito-junit-jupiter 2.19.0 test org.testng testng 6.14.3 test
Давайте посмотрим на результат, когда мы запустим команду дерева зависимостей maven.
$ mvn dependency:tree [INFO] Scanning for projects. [INFO] [INFO] ----------------------------- [INFO] Building Mockito-Examples 1.0-SNAPSHOT [INFO] --------------------------------[ jar ]--------------------------------- [INFO] [INFO] --- maven-dependency-plugin:2.8:tree (default-cli) @ Mockito-Examples --- [INFO] com.journaldev.mockito:Mockito-Examples:jar:1.0-SNAPSHOT [INFO] +- org.junit.platform:junit-platform-runner:jar:1.2.0:test [INFO] | +- org.apiguardian:apiguardian-api:jar:1.0.0:test [INFO] | +- org.junit.platform:junit-platform-launcher:jar:1.2.0:test [INFO] | +- org.junit.platform:junit-platform-suite-api:jar:1.2.0:test [INFO] | | \- org.junit.platform:junit-platform-commons:jar:1.2.0:test [INFO] | \- junit:junit:jar:4.12:test [INFO] | \- org.hamcrest:hamcrest-core:jar:1.3:test [INFO] +- org.junit.jupiter:junit-jupiter-engine:jar:5.2.0:test [INFO] | +- org.junit.platform:junit-platform-engine:jar:1.2.0:test [INFO] | | \- org.opentest4j:opentest4j:jar:1.1.0:test [INFO] | \- org.junit.jupiter:junit-jupiter-api:jar:5.2.0:test [INFO] +- org.mockito:mockito-junit-jupiter:jar:2.19.0:test [INFO] | \- org.mockito:mockito-core:jar:2.19.0:test [INFO] | +- net.bytebuddy:byte-buddy:jar:1.8.10:test [INFO] | +- net.bytebuddy:byte-buddy-agent:jar:1.8.10:test [INFO] | \- org.objenesis:objenesis:jar:2.6:test [INFO] \- org.testng:testng:jar:6.14.3:test [INFO] +- com.beust:jcommander:jar:1.72:test [INFO] \- org.apache-extras.beanshell:bsh:jar:2.0b6:test [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 0.871 s [INFO] Finished at: 2019-12-13T12:24:11+05:30 [INFO] ------------------------------------------------------------------------ $
Вывод показывает все JAR-файлы, используемые для запуска этого приложения. В выходных данных показаны идентификатор группы зависимостей, идентификатор артефакта, упаковка, версия и область действия.
Исключение зависимости из зависимостей проекта Maven
Если вы посмотрите на приведенный выше вывод дерева зависимостей, JAR JUnit 4 извлекается как транзитивная зависимость junit-platform-runner . Если вы планируете использовать JUnit 5 для написания тестовых случаев, рекомендуется исключить JUnit 4 из зависимости, чтобы избежать конфликтов. Мы можем исключить JUnit 4 JAR из зависимостей проекта, используя тег исключения. Его нужно добавить в зависимость, которая отвечает за его вытягивание.
org.junit.platform junit-platform-runner 1.2.0 test junit junit
Давайте снова запустим команду дерева зависимостей. Теперь он не должен показывать JAR-файлы JUnit 4.
Разрешение конфликтов с использованием подробного режима дерева зависимостей Maven
Когда мы создаем проект maven, выбирается версия зависимости, которая ближе к проекту. Это может вызвать проблемы, когда вам нужна конкретная версия, но maven выбирает другую версию. Мы можем использовать команду mvn dependency:tree -Dverbose для вывода конфликтов зависимостей. Это может помочь нам определить, есть ли какие-либо проблемы несовместимости с JAR.
$ mvn dependency:tree -Dverbose [INFO] Scanning for projects. [INFO] [INFO] ----------------------------- [INFO] Building Mockito-Examples 1.0-SNAPSHOT [INFO] --------------------------------[ jar ]--------------------------------- [INFO] [INFO] --- maven-dependency-plugin:2.8:tree (default-cli) @ Mockito-Examples --- [INFO] com.journaldev.mockito:Mockito-Examples:jar:1.0-SNAPSHOT [INFO] +- org.junit.platform:junit-platform-runner:jar:1.2.0:test [INFO] | +- org.apiguardian:apiguardian-api:jar:1.0.0:test [INFO] | +- org.junit.platform:junit-platform-launcher:jar:1.2.0:test [INFO] | | +- (org.apiguardian:apiguardian-api:jar:1.0.0:test - omitted for duplicate) [INFO] | | \- (org.junit.platform:junit-platform-engine:jar:1.2.0:test - omitted for duplicate) [INFO] | \- org.junit.platform:junit-platform-suite-api:jar:1.2.0:test [INFO] | +- (org.apiguardian:apiguardian-api:jar:1.0.0:test - omitted for duplicate) [INFO] | \- org.junit.platform:junit-platform-commons:jar:1.2.0:test [INFO] | \- (org.apiguardian:apiguardian-api:jar:1.0.0:test - omitted for duplicate) [INFO] +- org.junit.jupiter:junit-jupiter-engine:jar:5.2.0:test [INFO] | +- (org.apiguardian:apiguardian-api:jar:1.0.0:test - omitted for duplicate) [INFO] | +- org.junit.platform:junit-platform-engine:jar:1.2.0:test [INFO] | | +- (org.apiguardian:apiguardian-api:jar:1.0.0:test - omitted for duplicate) [INFO] | | +- (org.junit.platform:junit-platform-commons:jar:1.2.0:test - omitted for duplicate) [INFO] | | \- org.opentest4j:opentest4j:jar:1.1.0:test [INFO] | \- org.junit.jupiter:junit-jupiter-api:jar:5.2.0:test [INFO] | +- (org.apiguardian:apiguardian-api:jar:1.0.0:test - omitted for duplicate) [INFO] | +- (org.opentest4j:opentest4j:jar:1.1.0:test - omitted for duplicate) [INFO] | \- (org.junit.platform:junit-platform-commons:jar:1.2.0:test - omitted for duplicate) [INFO] +- org.mockito:mockito-junit-jupiter:jar:2.19.0:test [INFO] | +- org.mockito:mockito-core:jar:2.19.0:test [INFO] | | +- net.bytebuddy:byte-buddy:jar:1.8.10:test [INFO] | | +- net.bytebuddy:byte-buddy-agent:jar:1.8.10:test [INFO] | | \- org.objenesis:objenesis:jar:2.6:test [INFO] | \- (org.junit.jupiter:junit-jupiter-api:jar:5.1.0:test - omitted for conflict with 5.2.0) [INFO] \- org.testng:testng:jar:6.14.3:test [INFO] +- com.beust:jcommander:jar:1.72:test [INFO] \- org.apache-extras.beanshell:bsh:jar:2.0b6:test [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 1.018 s [INFO] Finished at: 2019-12-13T12:58:07+05:30 [INFO] ------------------------------------------------------------------------ $
Строка вывода (org.junit.jupiter:junit-jupiter-api:jar:5.1.0:test — опущена из-за конфликта с 5.2.0) говорит нам, что эта версия JAR отброшена в пользу другой версии. Если вы хотите использовать junit-jupiter-api версии 5.1.0, просто добавьте его в зависимости проекта maven. Поскольку Maven разрешает конфликты версий с помощью стратегии ближайшего выигрыша, прямые зависимости всегда включаются в проект.
Фильтрация дерева зависимостей Maven
Если в проекте maven много зависимостей, становится сложно искать конкретный артефакт.
-Включает
Мы можем использовать параметр -Dincludes , чтобы включить в вывод только определенные зависимости. Синтаксис шаблона фильтрации: [groupId]:[artifactId]:[type]:[version] . Каждый сегмент шаблона является необязательным и поддерживает полные и частичные подстановочные знаки *.
$ mvn dependency:tree -Dverbose -Dincludes=org.junit.jupiter:junit-jupiter-api [INFO] Scanning for projects. [INFO] [INFO] ----------------------------- [INFO] Building Mockito-Examples 1.0-SNAPSHOT [INFO] --------------------------------[ jar ]--------------------------------- [INFO] [INFO] --- maven-dependency-plugin:2.8:tree (default-cli) @ Mockito-Examples --- [INFO] com.journaldev.mockito:Mockito-Examples:jar:1.0-SNAPSHOT [INFO] +- org.junit.jupiter:junit-jupiter-engine:jar:5.2.0:test [INFO] | \- org.junit.jupiter:junit-jupiter-api:jar:5.2.0:test [INFO] \- org.mockito:mockito-junit-jupiter:jar:2.19.0:test [INFO] \- (org.junit.jupiter:junit-jupiter-api:jar:5.1.0:test - omitted for conflict with 5.2.0) [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 0.981 s [INFO] Finished at: 2019-12-13T13:04:04+05:30 [INFO] ------------------------------------------------------------------------ $
-Исключает
Это используется для удаления заданных зависимостей из вывода дерева зависимостей. Шаблон аналогичен параметру -Dincludes . Мы можем использовать запятую, чтобы указать несколько шаблонов для включения или исключения из дерева зависимостей.
$ mvn dependency:tree -Dexcludes=org.junit.jupiter:junit-jupiter-api [INFO] Scanning for projects. [INFO] [INFO] ----------------------------- [INFO] Building Mockito-Examples 1.0-SNAPSHOT [INFO] --------------------------------[ jar ]--------------------------------- [INFO] [INFO] --- maven-dependency-plugin:2.8:tree (default-cli) @ Mockito-Examples --- [INFO] com.journaldev.mockito:Mockito-Examples:jar:1.0-SNAPSHOT [INFO] +- org.junit.platform:junit-platform-runner:jar:1.2.0:test [INFO] | +- org.apiguardian:apiguardian-api:jar:1.0.0:test [INFO] | +- org.junit.platform:junit-platform-launcher:jar:1.2.0:test [INFO] | \- org.junit.platform:junit-platform-suite-api:jar:1.2.0:test [INFO] | \- org.junit.platform:junit-platform-commons:jar:1.2.0:test [INFO] +- org.junit.jupiter:junit-jupiter-engine:jar:5.2.0:test [INFO] | \- org.junit.platform:junit-platform-engine:jar:1.2.0:test [INFO] | \- org.opentest4j:opentest4j:jar:1.1.0:test [INFO] +- org.mockito:mockito-junit-jupiter:jar:2.19.0:test [INFO] | \- org.mockito:mockito-core:jar:2.19.0:test [INFO] | +- net.bytebuddy:byte-buddy:jar:1.8.10:test [INFO] | +- net.bytebuddy:byte-buddy-agent:jar:1.8.10:test [INFO] | \- org.objenesis:objenesis:jar:2.6:test [INFO] \- org.testng:testng:jar:6.14.3:test [INFO] +- com.beust:jcommander:jar:1.72:test [INFO] \- org.apache-extras.beanshell:bsh:jar:2.0b6:test [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 0.925 s [INFO] Finished at: 2019-12-13T13:55:22+05:30 [INFO] ------------------------------------------------------------------------ $
Дерево зависимостей Maven в Eclipse IDE
Eclipse pom.xml Вкладка «Иерархия зависимостей» показывает дерево зависимостей проекта. Оно имеет две стороны — левая сторона показывает подробный вывод, а правая сторона показывает разрешенные зависимости. Мы можем использовать параметр «Фильтр» для поиска конкретная зависимость.
Дополнительная литература: Использование Maven в Eclipse IDE
Сохранение дерева зависимостей в файл
Мы можем использовать параметр -DoutputFile, чтобы указать файл для сохранения вывода дерева зависимостей.
$ mvn dependency:tree -DoutputFile=dependency-tree.txt [INFO] Scanning for projects. [INFO] [INFO] ----------------------------- [INFO] Building Mockito-Examples 1.0-SNAPSHOT [INFO] --------------------------------[ jar ]--------------------------------- [INFO] [INFO] --- maven-dependency-plugin:2.8:tree (default-cli) @ Mockito-Examples --- [INFO] Wrote dependency tree to: /Users/pankaj/Desktop/maven-examples/Mockito-Examples/dependency-tree.txt [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 0.862 s [INFO] Finished at: 2019-12-13T15:27:51+05:30 [INFO] ------------------------------------------------------------------------ $ $ cat dependency-tree.txt com.journaldev.mockito:Mockito-Examples:jar:1.0-SNAPSHOT +- org.junit.platform:junit-platform-runner:jar:1.2.0:test | +- org.apiguardian:apiguardian-api:jar:1.0.0:test | +- org.junit.platform:junit-platform-launcher:jar:1.2.0:test | \- org.junit.platform:junit-platform-suite-api:jar:1.2.0:test | \- org.junit.platform:junit-platform-commons:jar:1.2.0:test +- org.junit.jupiter:junit-jupiter-engine:jar:5.2.0:test | +- org.junit.platform:junit-platform-engine:jar:1.2.0:test | | \- org.opentest4j:opentest4j:jar:1.1.0:test | \- org.junit.jupiter:junit-jupiter-api:jar:5.2.0:test +- org.mockito:mockito-junit-jupiter:jar:2.19.0:test | \- org.mockito:mockito-core:jar:2.19.0:test | +- net.bytebuddy:byte-buddy:jar:1.8.10:test | +- net.bytebuddy:byte-buddy-agent:jar:1.8.10:test | \- org.objenesis:objenesis:jar:2.6:test \- org.testng:testng:jar:6.14.3:test +- com.beust:jcommander:jar:1.72:test \- org.apache-extras.beanshell:bsh:jar:2.0b6:test $
Рекомендации
- Подключаемый модуль зависимостей Maven
- Разрешение конфликтов с помощью дерева зависимостей
- Фильтрация дерева зависимостей
Источник