Как разрешить конфликт зависимостей для файла 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.


person user139386    schedule 22.07.2016    source источник
comment
Вы и ваши товарищи по команде должны использовать maven и POM. В этом случае ваши зависимости будут автоматически управляться для вас, и эта ситуация не возникнет. Если вы используете IDE для управления зависимостями, вы должны использовать графический интерфейс, чтобы удалить зависимость javax.ws.rs-api и добавить зависимость от jersey-core.   -  person Software Engineer    schedule 22.07.2016
comment
Мы используем maven и POM. База кода размещена во внутреннем репозитории github компании, поэтому мне интересно, почему это работает для всех остальных, а не для меня. Бьюсь об заклад, мне не хватает некоторых настроек IntelliJ, которые я не могу понять. Если кто-то использует Eclipse и не видит этой проблемы, почему это может произойти, когда я использую IntelliJ?   -  person user139386    schedule 22.07.2016


Ответы (3)


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

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

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

person user139386    schedule 23.07.2016
comment
это не работает таким образом, вам нужно изменить зависимость в файле pom. поместите библиотеку, которую вы хотите, в более высокое положение. та работа - person uncle bob; 15.02.2020

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

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

person Vincent F    schedule 08.09.2016
comment
у меня это работает, нужно только изменить зависимость, которую я хочу занять более высокую позицию в файле pom. большое спасибо - person uncle bob; 15.02.2020

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

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

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

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

mvn dependency:tree -Dverbose | grep "conflict"

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

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

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

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

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

Пример :

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
            <version>3.7</version>
        </dependency>
    <dependencies>
</dependencyManagement>
  1. Изменить порядок зависимости в pom
  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?

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

person Sébastien Temprado    schedule 14.05.2020