Как разрешить конфликт зависимостей для файла Java в IntelliJ IDEA?

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

Я использую IntelliJ IDEA для своего многомодульного проекта. Для одного из моих модулей один из файлов класса использует статический импорт -

import static javax.ws.rs.core.Response.Status.Family.familyOf;

Будучи крупным проектом, из внутреннего репозитория загружается много зависимостей, но по какой-то причине IntelliJ отказывается использовать зависимость "javax.ws.rs-api-2.0", вместо этого она использует "jersey-core-1.8". Из-за этого он выдает ошибку компиляции, говорящую, что не может найти символ "familyof".

Я посмотрел в Response.java из обеих зависимостей и обнаружил, что у зависимости джерси нет метода familyof, в то время как у javax.ws.rs-api-2.0 он есть, но IntelliJ не использует эту зависимость. Как мне исправить эту проблему. Большинство разработчиков в моей команде используют Eclipse, и у них нет этой проблемы. Я пытаюсь привыкнуть к IntelliJ IDE, но не могу найти выход из этого. Любая помощь в этом отношении высоко ценится.

PS - Эта проблема не возникает в Eclipse IDE.

2 ответа

Как Maven выбирает между двумя версиями одной и той же зависимости?

Как объясняется здесь, Maven выбирает первую встреченную зависимость, поэтому она работает, когда вы меняете порядок зависимости в файле pom.

Как найти конфликты зависимостей Maven?

В терминале в папке pom:

mvn dependency:tree -Dverbose | grep "conflict"

предоставит вам все зависимости, конфликтующие в вашем проекте.

В среде Eclipse IDE щелкните помпой и Dependency hierarchyтаб. Затем заполните поле "Фильтр" зависимостью. Слева вы увидите конфликты (например, сmvn dependendy:tree, с отфильтрованными результатами), а справа - выбранные зависимости.

С IntelliJ документация IntelliJ может вам помочь. Для поиска конфликтов есть диаграмма.

Как разрешить конфликты зависимостей Maven?

  1. добавлять dependencyManagement тег в помпе, чтобы сообщить Maven, какую зависимость вы хотите

Пример:

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
            <version>3.7</version>
        </dependency>
    <dependencies>
</dependencyManagement>
  1. Измените порядок зависимости в помпе
  2. Добавить исключение зависимости

Пример:

    <dependency>
        <groupId>com.my.groupid</groupId>
        <artifactId>my-artifact-id</artifactId>
        <version>1.2.2</version>
        <exclusions>
            <exclusion>
                <groupId>org.apache.commons</groupId>
                <artifactId>commons-lang3</artifactId>
            </exclusion>
        </exclusions>
    </dependency>

В чем разница между IntelliJ и Eclipse?

  • Вы можете добавить зависимость к модулю, не добавляя его к pom, как описано в документации IntelliJ. Вероятно, это возможно с другой IDE.

    IntelliJ IDEA позволяет добавить в проект зависимость Maven. Мы рекомендуем указать зависимость внутри вашего POM. Зависимости, которые вы установили вручную в настройках модуля IntelliJ IDEA, будут отброшены при следующем импорте проекта Maven.

  • Плагин Maven в Eclipse (M2Eclipse) может загружать зависимости иначе, чем mvn

Пожалуйста, прочтите документацию IntelliJ, чтобы легко настроить зависимости проекта.

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

Затем, если вы все используете одну и ту же версию Maven, у вас должен быть последовательный результат.

Я мог бы решить эту проблему, выполнив следующие шаги -

  1. Перейти к "Открыть настройки модуля" Команда + клавиша со стрелкой вниз
  2. Выберите вкладку Зависимости
  3. Найдите две вышеуказанные зависимости в списке
  4. Переместите зависимость "javax.ws.rs-api-2.0" вверх, чтобы она была выше зависимости "jersey-core-1.8".

Я не думаю, что это постоянное решение, но, похоже, оно сработало. если у кого-то с глубокими знаниями Java/Mave/IntelliJ есть ответ на этот вопрос, это было бы здорово!

Другие вопросы по тегам