Перейти к основному содержимому

Удалите повторяющиеся зависимости с помощью Maven

· 4 мин. чтения

1. Обзор

В этом руководстве мы узнаем, как обнаруживать повторяющиеся зависимости в pom.xml с помощью команд Maven. Мы также увидим, как завершить сборку при наличии повторяющихся зависимостей с помощью подключаемого модуля Maven Enforcer.

2. Зачем обнаруживать повторяющиеся зависимости?

Риск дублирования зависимостей в pom.xml заключается в том, что последняя версия целевой библиотеки может не применяться к пути сборки нашего проекта. Например, рассмотрим следующий файл pom.xml :

<project>
[...]
<dependencies>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.12.0</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.11</version>
</dependency>
</dependencies>
[...]
</project>

Как мы видим, есть две зависимости для одной и той же библиотеки, commons-lang3 , хотя версия в обеих этих зависимостях разная.

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

3. Команда дерева зависимостей

Давайте запустим команду mvn dependency:tree из нашего терминала и посмотрим на результат.

$ mvn dependency:tree
[INFO] Scanning for projects...
[WARNING]
[WARNING] Some problems were encountered while building the effective model for com.foreach:maven-duplicate-dependencies:jar:0
.0.1-SNAPSHOT
[WARNING] 'dependencies.dependency.(groupId:artifactId:type:classifier)' must be unique: org.apache.commons:commons-lang3:jar -
> version 3.12.0 vs 3.11 @ line 14, column 15
[WARNING]
[WARNING] It is highly recommended to fix these problems because they threaten the stability of your build.
[WARNING]
[WARNING] For this reason, future Maven versions might no longer support building such malformed projects.
[WARNING]
[INFO]
[INFO] -------------< com.foreach:maven-duplicate-dependencies >--------------
[INFO] Building maven-duplicate-dependencies 0.0.1-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- maven-dependency-plugin:2.8:tree (default-cli) @ maven-duplicate-dependencies ---
[WARNING] The artifact xml-apis:xml-apis:jar:2.0.2 has been relocated to xml-apis:xml-apis:jar:1.0.b2
[INFO] com.foreach:maven-duplicate-dependencies:jar:0.0.1-SNAPSHOT
[INFO] \- org.apache.commons:commons-lang3:jar:3.11:compile
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 1.136 s
[INFO] Finished at: 2021-12-20T09:45:20+05:30
[INFO] ------------------------------------------------------------------------

Здесь мы получаем предупреждение о наличии повторяющихся зависимостей в pom.xml. Мы также заметили, что в проект добавлена версия 3.11 файла commons-lang3.jar , хотя присутствует более поздняя версия, 3.12.0 . Это произошло потому, что Maven выбрал зависимость, появившуюся позже в pom.xml .

4. Команда анализа -дубликата зависимостей

Теперь давайте запустим команду mvn dependency:analyze-duplicate и проверим вывод.

$ mvn dependency:analyze-duplicate
[INFO] Scanning for projects...
[WARNING]
[WARNING] Some problems were encountered while building the effective model for com.foreach:maven-duplicate-dependencies:jar:0
.0.1-SNAPSHOT
[WARNING] 'dependencies.dependency.(groupId:artifactId:type:classifier)' must be unique: org.apache.commons:commons-lang3:jar -
> version 3.12.0 vs 3.11 @ line 14, column 15
[WARNING]
[WARNING] It is highly recommended to fix these problems because they threaten the stability of your build.
[WARNING]
[WARNING] For this reason, future Maven versions might no longer support building such malformed projects.
[WARNING]
[INFO]
[INFO] -------------< com.foreach:maven-duplicate-dependencies >--------------
[INFO] Building maven-duplicate-dependencies 0.0.1-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- maven-dependency-plugin:2.8:analyze-duplicate (default-cli) @ maven-duplicate-dependencies ---
[WARNING] The artifact xml-apis:xml-apis:jar:2.0.2 has been relocated to xml-apis:xml-apis:jar:1.0.b2
[INFO] List of duplicate dependencies defined in <dependencies/> in your pom.xml:
o org.apache.commons:commons-lang3:jar
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 0.835 s
[INFO] Finished at: 2021-12-20T09:54:02+05:30
[INFO] ------------------------------------------------------------------------

Здесь мы замечаем, что в операторах журнала WARNING и INFO упоминается наличие повторяющихся зависимостей.

5. Сбой сборки при наличии повторяющихся зависимостей

В приведенных выше примерах мы видели, как обнаруживать повторяющиеся зависимости, но BUILD по-прежнему выполняется успешно. Это может привести к использованию неправильной версии jar .

Используя подключаемый модуль Maven Enforcer , мы можем гарантировать, что сборка будет неудачной, если присутствуют повторяющиеся зависимости.

Для этого нам нужно добавить этот плагин Maven в наш pom.xml и добавить правило banDuplicatePomDependencyVersions :

<project>
[...]
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-enforcer-plugin</artifactId>
<version>3.0.0</version>
<executions>
<execution>
<id>no-duplicate-declared-dependencies</id>
<goals>
<goal>enforce</goal>
</goals>
<configuration>
<rules>
<banDuplicatePomDependencyVersions/>
</rules>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
[...]
</project>

Теперь правило связывает нашу сборку Maven:

$ mvn verify
[INFO] Scanning for projects...
[WARNING]
[WARNING] Some problems were encountered while building the effective model for com.foreach:maven-duplicate-dependencies:jar:0
.0.1-SNAPSHOT
[WARNING] 'dependencies.dependency.(groupId:artifactId:type:classifier)' must be unique: org.apache.commons:commons-lang3:jar -
> version 3.12.0 vs 3.11 @ line 14, column 14
[WARNING]
[INFO] -------------< com.foreach:maven-duplicate-dependencies >--------------
[INFO] Building maven-duplicate-dependencies 0.0.1-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- maven-enforcer-plugin:3.0.0:enforce (no-duplicate-declared-dependencies) @ maven-duplicate-dependencies ---
[WARNING] Rule 0: org.apache.maven.plugins.enforcer.BanDuplicatePomDependencyVersions failed with message:
Found 1 duplicate dependency declaration in this project:
- dependencies.dependency[org.apache.commons:commons-lang3:jar] ( 2 times )

[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 0.537 s
[INFO] Finished at: 2021-12-20T09:55:46+05:30
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-enforcer-plugin:3.0.0:enforce (no-duplicate-declared-dependencies) on project maven-duplicate-dependencie
s: Some Enforcer rules have failed. Look above for specific messages explaining why the rule failed.

6. Удаление повторяющихся зависимостей

После того, как мы определили наши повторяющиеся зависимости, самый простой способ удалить их — удалить их из pom.xml и оставить только те уникальные зависимости, которые используются нашим проектом.

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

В этой статье мы узнали, как обнаруживать повторяющиеся зависимости в Maven с помощью команд mvn dependency:tree и mvn dependency:analyze-duplicate . Мы также увидели, как можно использовать подключаемый модуль Maven Enforcer для сбоя сборки, содержащей повторяющиеся зависимости, путем применения встроенного правила.