Рубрики
Без рубрики

Решите проблемы с зависимостями в Java

Введение Когда мы работаем с проектами, использующими Java, первое, что мы делаем, – это добавляем… Помеченный java, maven, gradle, зависимостями.

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

Каждая зависимость, которую мы добавляем для нашего проекта, содержит другие зависимости; большинство разработчиков знают эту концепцию под названием переходных зависимостей. Во многих случаях эта ситуация не представляет никакой проблемы, потому что наш менеджер зависимостей хорошо разрешает конфликты версий между различными библиотеками. Тем не менее, есть и другие случаи, когда эти конфликты приводят к некоторым ошибкам, когда мы используем наш API/библиотеку.

Пожалуйста, позвольте мне разъяснить вышеизложенное следующими примерами:

Рисунок 1 — Наш API/библиотека импортирует некоторые библиотеки, которые используют определенную библиотеку с той же версией.

Рисунок 2 — Наш API/библиотека импортирует некоторые библиотеки, которые используют определенную библиотеку с разными версиями.

В случае с рисунком 1 проблемы нет, потому что все библиотеки используют одну и ту же версию, поэтому нашему менеджеру зависимостей не нужно ничего делать для ее решения. Проблема показана на рисунке 2, поскольку библиотеки используют разные версии одной и той же библиотеки, поэтому Maven/Gradle пытается наилучшим образом разрешить конфликт между версиями. В некоторых случаях разрешение конфликта с версией приводит к ошибке, наиболее распространенными являются: “ClassNotFoundException”“MethodNotSupportedException”“NoClassDefNotFound” , которая появляется, когда наш инструмент управления зависимостями принимает версию без этого конкретного класса или способ.

Чтобы решить эту проблему, у вас есть различные альтернативы, чтобы найти и устранить ее. Вот шаги, которые я выполняю, чтобы найти решение:

  1. Нам нужно найти, какие библиотеки выдают ошибку. В большинстве случаев ошибка в консоли или IDE (Eclipse/IntelliJ) показывает весь пакет класса, чтобы вы могли найти jar, содержащий этот класс. Например: java.lang. Ошибка NoClassDefFoundError: ch/qos/logback/core/status/WarnStatus

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

  3. С помощью имени зависимости, содержащей класс, вы можете найти все импортные файлы этой библиотеки. Для этого есть несколько вариантов в зависимости от вашего инструмента управления зависимостями: Maven Чтобы просмотреть все дерево зависимостей в вашем проекте, вы можете выполнить следующую команду: mvn dependency:tree Если вы хотите найти только библиотеки, которые включают определенную зависимость, вы можете запустить: mvn dependency:tree Gradle Чтобы просмотреть все дерево зависимостей в вашем проекте, вы можете выполнить следующую команду: gradle dependencies — сканировать

  4. Когда вы обнаружите, какие библиотеки содержат зависимость, вызывающую проблему, вам необходимо исключить ее из нашего файла управления зависимостями (pom.xml или build.gradle) все библиотеки, которые содержат другую версию зависимости. В некоторых случаях библиотека, вызывающая ошибку, не существует в дереве зависимостей, потому что некоторые из добавленных вами библиотек имеют метки зависимостей как “предоставленные”, поэтому вам необходимо иметь эту библиотеку в вашем pom, чтобы устранить проблему.

Вы можете использовать это решение, когда вы запускаете свое приложение/библиотеку и появляется проблема, но у вас есть другой способ обнаружить эту проблему до того, как это произойдет. Существует плагин, который мы можем использовать в нашем диспетчере зависимостей (Maven или Gradle) для проверки проблемы с зависимостями; ниже приведена реализация для каждого менеджера зависимостей:

Эти плагины имеют множество функций для использования, но в нашем случае важным является Конвергенция зависимостей , которая показывает все возможные проблемы с библиотеками.

Когда вы добавляете в свой проект один из этих плагинов и запускаете проверку, если что-то не так, сообщение, которое появится в консоли, выглядит следующим образом:

Этот вывод означает, что проект имеет две зависимости “junit-jupiter-engine”, но с разными версиями. Как я упоминал ранее, вы можете решить проблему, исключив зависимость в “spring-boot-start-test” или указав инструменту управления зависимостями, какую версию необходимо использовать.

Если у вас очень старый проект и вы добавляете плагин enforce, возможно, вы обнаружите много конфликтов, которые в некоторых случаях невозможно разрешить за очень короткий период, но если вы создаете новый проект, вы можете добавить плагин с самого начала и предотвратить возможные проблемы в будущем. Вы можете видеть, что существуют различные альтернативы для решения этой проблемы. Теперь вам решать, какое решение является лучшим.

Оригинал: “https://dev.to/andressacco/solve-the-problems-with-dependencies-in-java-352i”