Как разрешить конфликт зависимостей для файла 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?
- добавлять
dependencyManagement
тег в помпе, чтобы сообщить Maven, какую зависимость вы хотите
Пример:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.7</version>
</dependency>
<dependencies>
</dependencyManagement>
- Измените порядок зависимости в помпе
- Добавить исключение зависимости
Пример:
<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, у вас должен быть последовательный результат.
Я мог бы решить эту проблему, выполнив следующие шаги -
- Перейти к "Открыть настройки модуля" Команда + клавиша со стрелкой вниз
- Выберите вкладку Зависимости
- Найдите две вышеуказанные зависимости в списке
- Переместите зависимость "javax.ws.rs-api-2.0" вверх, чтобы она была выше зависимости "jersey-core-1.8".
Я не думаю, что это постоянное решение, но, похоже, оно сработало. если у кого-то с глубокими знаниями Java/Mave/IntelliJ есть ответ на этот вопрос, это было бы здорово!