Отстраняване на конфликти на зависимости в Maven с dependency:tree


Публикувано:

Актуализирано:


Статии › Отстраняване на конфликти на зависимости в Maven с dependency:tree

Състояние през 2026 г. и безопасна употреба

Заключение: Изпълнете mvn dependency:tree, прегледайте разрешения граф и установете по кой път е дошла неочакваната версия. След това коригирайте декларацията целенасочено чрез обновена пряка зависимост, dependencyManagement или тясно обосновано изключване.

Какво ще научите

  • Как правилото „най-близката дефиниция“ може да скрие поисканата транзитивна версия.
  • Как подробният и филтриран изход на дървото на зависимостите помага да ограничите конфликта.
  • Защо изтриването на файлове от местното хранилище или добавянето на случайни изключения не е трайно решение.

За кого е статията: Java разработчиците разследват грешки в свързването, неочаквани класове или уязвими транзитни версии.

Актуално към 2026 г.: Опциите на плъгина зависят от версията, затова проверявайте актуалната документация на Maven Dependency Plugin. Съчетавайте прегледа на графа с одобрен от организацията анализ на състава на софтуера; чистото дърво само по себе си не доказва, че зависимостта е безопасна.

Бележка за безопасност: Командите и конфигурационните примери в първоначалната статия не са изпълнявани повторно в съвременна производствена среда. Преди прилагане проверете поддържаните версии, направете резервно копие и подгответе план за връщане в отделна тестова среда.

Официални източници

Преглед

Как да проверяваме за конфликти на библиотеки в Maven. Maven автоматично разрешава зависимостите за библиотеката jar, но конфигурацията по подразбиране не ви информира за конфликти. Ето как да проверите за конфликти на библиотеки в Maven в такива случаи.

Съдържание

  1. При възникване на конфликти на библиотеки в Maven
  2. Как да проверите
  3. Обобщение

1. При възникване на конфликти на библиотеки в Maven

Maven автоматично разрешава зависимостите на библиотеките на Java. Автоматичното разрешаване на зависимостите означава, че ако имате файл Jar, от който се нуждаете, той автоматично ще получи Jar, необходим за стартирането на този Jar. За повече информация относно начина на разрешаване на зависимостите на конкретни библиотеки вижте следната статия.

Как Maven автоматично разрешава зависимостите на JAR библиотеките.

Когато обаче възникнат библиотечни конфликти, те не се разрешават автоматично. Нещо повече, ако не разполагате с необходимите настройки, дори не можете да откриете конфликт. Бихме искали да опишем как да проверим за конфликти в библиотеката.

2. Как да проверите

Има два основни начина да проверите за конфликти в библиотеката

  • Въвеждане на плъгини
  • Потвърждаване на предварителното изграждане чрез команда.

"Инсталиране на плъгини" е метод за добавяне на настройки в pom.xml. "Проверка с команда преди сглобяване" буквално означава ръчна проверка с команда преди сглобяване. По-долу е обяснено как да направя това конкретно.

2-1. Въвеждане на плъгини

Следните уебсайтове на Maven могат да бъдат полезни.

http://maven.apache.org/enforcer/enforcer-rules/dependencyConvergence.html

Добавете следните настройки в pom.xml.

pom.xml


<project>
  ...
  <build>
    <plugins>
      ...
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-enforcer-plugin</artifactId>
        <version>3.0.0-M3</version>
        <executions>
          <execution>
            <id>enforce</id>
            <configuration>
              <rules>
                <dependencyConvergence/>
              </rules>
            </configuration>
            <goals>
              <goal>enforce</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
      ...
    </plugins>
  </build>
  ...
</project>

Ако са въведени горните настройки, се появява следната грешка и сглобяването се проваля, ако по време на сглобяването има конфликти на библиотеки.

[WARNING] 
Dependency convergence error for org.apache.commons:commons-collections4:4.1 paths to dependency are:
+-com.example.todo:todo-web:1.0.0-SNAPSHOT
  +-org.apache.poi:poi:3.17
    +-org.apache.commons:commons-collections4:4.1
and
+-com.example.todo:todo-web:1.0.0-SNAPSHOT
  +-org.apache.commons:commons-collections4:4.0

[WARNING] Rule 0: org.apache.maven.plugins.enforcer.DependencyConvergence failed with message:
Failed while enforcing releasability. See above detailed error message.

Ако се приложи компилация без приставки, не се появяват грешки и компилацията завършва нормално. Ако искате да откривате конфликти, не забравяйте да настроите това.

2-2. Потвърждаване на предварителното изграждане чрез команда.

Зависимостите се проверяват със следните команди

mvn dependency:tree -Dverbose

и ако има конфликт, се показва "пропуснато за конфликт". Възможно е също така да ограничите изхода само до областите, в които има конфликти, както в следната команда. Бележка:'find' е командата за Windows. За Linux това е 'grep'.

mvn dependency:tree -Dverbose | find "omitted for conflict"

Конфликтите в библиотеките могат да бъдат проверени, като се видят резултатите от горните команди.

3. резюме

Ако искате надеждно да откривате конфликти на библиотеки, препоръчваме "Инсталиране на приставки". Въвеждането на плъгини гарантира, че всички конфликти ще бъдат забелязани, тъй като компилацията ще се провали.

Това са основните стъпки и ограничения, които трябва да имате предвид.