Выберите одну зависимость в качестве прецедента над другой для произвольного списка пакетов в IntelliJ Builder

#java #maven #intellij-idea #intellij-plugin

#java #maven #intellij-идея #intellij-плагин

Вопрос:

Цель

Я пытаюсь заставить свой проект maven использовать IntelliJ builder при редактировании кода, потому что IDE предлагает функции быстрой перестройки и быстрого развертывания, которые могут ускорить мою работу. Однако я сталкиваюсь с препятствием из-за того, как настроен мой проект maven.

Ограничения

Я должен использовать maven так, как он используется. Решение должно быть в IntelliJ

Обратите внимание, что создание IntelliJ плагина является опцией. Я понимаю, что это может быть необходимо из-за ограничений IntelliJ конфигурации сборки.

Проблема

Мой проект зависит от 2 библиотек, SharedLibA и SharedLibB , которые содержат пакет com.shared. SharedLibA это новая библиотека, а sharedLibB также старая устаревшая. SharedLibA и SharedLibB содержат пакеты, которые не содержатся в другом, которые необходимы моему проекту. Пакет, который у них обоих есть, com.shared, также необходим проекту. Однако SharedLibB это устаревший / старый, поэтому мы всегда хотим, чтобы Tomcat отдавал приоритет реализации классов в com.shared from SharedLibA , а не реализации этих классов SharedLibB . Мы достигаем этого, имея цель maven, которая извлекает классы из пакета com.shared из SharedLibA в WEB-INF/classes, когда WAR упакован.

Когда я пытаюсь встроить свой проект IntelliJ , он обнаруживает неправильную реализацию классов в com.shared. * и выдает ошибки компиляции, несмотря на то, что компиляция отлично работает через maven. Я застрял с этим негибким maven hackjob , но я все еще хочу найти способ дать IntelliJ понять, что я хочу SharedLibA's , чтобы классы com.shared. * не использовались при компиляции SharedLibB's . Я не могу исключить SharedLibB из рассмотрения, потому что мне нужны другие классы SharedLibB для компиляции моего проекта.

Желаемое решение

Я ищу какую-то логику типа «когда рассматриваются классы com.shared. *, выберите SharedLibA » или «когда при разрешении пути к классу возникает какой-либо конфликт пакетов, расставьте приоритеты ShareLibA «, потому что я почти уверен, что при любом конфликте пакетов приоритет SharedLibA должен быть приоритетным.

Спасибо

Я надеюсь, что это объясняет это достаточно хорошо, заранее благодарю всех, кто вмешивается здесь.

Комментарии:

1. Лучшим решением было бы внести изменения в проект Maven или его зависимости. Почему вы это исключаете?

Ответ №1:

IDE строит classpath и buildpath на основе зависимостей, которые настроены для модуля. Он также учитывает их порядок — будет использоваться 1-я зависимость, соответствующая данному классу.

Для проектов на основе Maven список зависимостей и их порядок IDE берутся из Maven pom.xml файл модуля. Таким образом, вы можете установить порядок в pom.xml досье.

Другой упомянутый вариант — исключить элементы библиотеки. Но лучшим решением было бы правильно настроить сборку Maven.

Ответ №2:

Вы должны попытаться перейти к файлу вашего проекта «.IML» и там: вы можете создать или изменить модуль.

Там вы можете включать или исключать библиотеки или определять их приоритет использования. вы можете использовать этот фрагмент для вдохновения

 <module org.jetbrains.idea.maven.project.MavenProjectsManager.isMavenModule="true" type="JAVA_MODULE" version="8">
  <component name="SharedB" LANGUAGE_LEVEL="JDK_1_8">
    <output url="file://$MODULE_DIR$/target/classes" />
    <output-test url="file://$MODULE_DIR$/target/test-classes" />
    <content url="file://$MODULE_DIR$">
      <sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" />
...
    <excludeFolder url="file://$MODULE_DIR$/target" />
    </content>
...
    <orderEntry type="inheritedJdk" />
    <orderEntry type="sourceFolder" forTests="false" />
...
  </component>
</module>  

если вас не устраивает это решение, вы можете использовать настройки модуля Intellij

https://www.jetbrains.com/help/idea/library.html#excluded_lib_items