Не удается запустить код из-за java.lang.NoClassDefFoundError: com/quickxml/jackson/annotation/JsonMerge

У меня есть тестовый код в сообществе сообщества Intellij Idea 2018, в котором есть несколько файлов pom. Когда я запускаю любой тестовый тест testng, я получаю сообщение об ошибке "Нет тестов". Похоже, проблема связана с этой частью трассы стека исключений:

java.lang.NoClassDefFoundError: com/quickxml/jackson/annotation/JsonMerge

Я googled для решения и нашел это - https://github.com/FasterXML/jackson-annotations/issues/119 и это qaru.site/info/385568/.... Похоже, эта проблема возникает, когда у нас нет той же версии этих банок в проекте.

1) jackson-core (2.8.8)

2) jackson-databind (2.9.2)

3) джоксон-аннотации (2.8.5)

Как вы можете видеть, у меня нет такой же версии для всех банок. Я посмотрел на всех попов в моем проекте и не нашел места, где добавляются все эти зависимости. Я надеялся просто установить номер версии там. Должен ли я просто добавлять все зависимости в мой родительский файл pom или делать что-то еще?

Как решить эту проблему без ущерба для проекта? Как узнать, почему эти банки не имеют одинаковой версии?

Ответ 1

Вы, скорее всего, имеете разные версии, импортированные через разные зависимости в качестве субзависимых.

Вы можете получить maven, чтобы показать вам так называемый "эффективный pom", который даст вам полное дерево зависимостей, из которого вы сможете увидеть, где именно.

Некоторые IDE (например, IntelliJ) имеют возможность показать это графически, что облегчает поиск конфликтов таким образом.

Исключить более низкие версии и при необходимости явно добавить зависимости к более новым версиям.

Ответ 2

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

Вы можете перенаправить вывод в файл и проанализировать его подробно, выполнив поиск "jackson" в файле tree.txt, созданный следующим образом:

mvn dependency:tree -Dverbose > tree.txt

Следующий шаг будет заключаться в том, сможете ли вы обновить некоторые из ваших библиотек, чтобы они автоматически использовали для вас правильную версию Jackson-библиотек.

Наконец, если вы явно хотите исключить транзитивные зависимости, вы можете использовать <exclusions> внутри определенной <dependency> чтобы исключить определенные зависимости сторонних разработчиков, добавленные в ваш путь к классам. См. Этот вопрос, например.