#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