Maven: как использовать причал: запускать в многомодульном проекте Maven без необходимости установки

Я новичок в Maven. У меня есть многомодульный проект maven 2, который имеет следующую структуру (несколько упрощенную):

Project (POM packaging)
  |
  +-- Module1 (JAR)
  |     |
  |     +-- src
  |          |
  |          +-- main
  |               |
  |               +-- java
  |               +-- resources
  |
  +-- Module2 (JAR)
  |      |
  |     ...
  |
  +-- Web Module (WAR)
         |
        ...

Я настроил веб-модуль для включения подключаемого модуля Maven Jetty. Это отлично подходит для создания производственных артефактов. Для разработки я обнаружил, что мне нужно вызвать mvn install для любого модуля, который я изменяю, после чего следует остановить причал и вызвать причал: запустить снова.
Было бы намного продуктивнее, если бы у плагина был способ напрямую выбирать изменения из целевых каталогов каждого модуля. Согласно документации плагина причала, похоже, такая функция есть, но похоже, что это применимо только к модулю WAR.
Еще важнее для меня иметь возможность вносить изменения в файлы ресурсов без необходимости перезапускать причал . Это связано с тем, что большинство ресурсов представляют собой файлы шаблонов HTML, и гораздо более продуктивно проектировать и обновлять шаблоны во время разработки без необходимости перезапуска, чтобы увидеть изменения.

Итак, есть ли способ установить путь к классам плагина пристани, чтобы включить целевые каталоги / классы и ресурсы каждого модуля JAR вместо фактических JAR в локальном репозитории?

Спасибо!
Янив


person yby    schedule 06.12.2010    source источник
comment
Отличный вопрос! Я тоже не могу понять этого. Пожалуйста, опубликуйте ответ здесь, если догадались.   -  person Ben McCann    schedule 07.12.2010


Ответы (5)


Это невозможно с многомодульным проектом Maven. Основное правило проектов Maven - каждый проект должен работать автономно. Это не препятствует их совместной сборке, но любой проект должен быть собран сам по себе, если удовлетворены все его зависимости.

В этом случае это означает, что проект WAR не может следить за другими проектами, чтобы увидеть, нужно ли их обновлять, POM для этих других проектов является окончательным заявлением о том, что необходимо сделать для создания артефакта. И как только артефакт построен, он помещается в локальный репозиторий. На этом этапе нет никакой связи между исходными файлами и артефактом, поэтому невозможно определить, какие исходные файлы вызовут перестройку артефакта, от которого зависит WAR.

person Brian Topping    schedule 07.12.2010
comment
Это ужасно. Как человек, пришедший из других систем сборки, я действительно ненавижу это ограничение и надеюсь, что это не так. Maven знает, какие модули находятся в файловой системе, потому что они указаны в родительском файле pom.xml. В результате он всегда должен иметь возможность перестраивать эти проекты. Не нужно делать ничего сверхразумного, но вариант всегда перестраивать было бы неплохо. - person Ben McCann; 07.12.2010
comment
Никто не строит с Maven для быстрых итераций. Загрузите свой проект в IDE ... IntelliJ IDEA, Eclipse или Netbeans понимают, как анализировать проекты Maven, и если у вас нет специальных плагинов (или плагины нужно запускать только после изменения определенных файлов), вы никогда не воспринимайте это как проблемы, которые вас особенно волнуют. - person Brian Topping; 07.12.2010
comment
Так как же тогда делать быстрые итерации в веб-приложении? Есть ли что-то, что вы делаете в среде IDE вместо mvn jetty: run? Или я полагаю, что ответ в основном заключается в том, что вы просто не можете выполнять быстрые итерации для веб-приложения, и вам постоянно приходится переустанавливать проект? - person Ben McCann; 07.12.2010
comment
Я очень сильно импортирую проект в свою IDE. Я использую IntelliJ IDEA, который можно создавать и развертывать одним щелчком мыши в полдюжине различных контейнеров, включая Tomcat, Jetty, Glassfish и Spring DM (в IDEA x). Цель причала: запустить отлично подходит для проектов, которые зарегистрированы и должны быть легко запущены загрузчиками, но это совсем не лучший выбор для итеративной разработки. - person Brian Topping; 07.12.2010
comment
Ах, интересно. Похоже, мне нужно установить Jetty локально и найти плагин Eclipse, который можно развернуть на нем. Спасибо за информацию, Брайан! - person Ben McCann; 07.12.2010
comment
Вы должны найти плагин eclipse, который может запускать Jetty из Eclipse, автоматически подключаясь к отладчику как часть итеративного цикла. - person Brian Topping; 07.12.2010
comment
Между прочим, пожалуйста, оцените полезные комментарии и ответы, я как бы новичок в этих частях! :-D Ура - person Brian Topping; 07.12.2010
comment
@Ben спасибо, что повторил мои точные мысли .. @Brian спасибо за отличные комментарии. У меня также сложилось впечатление, что jetty: run следует использовать для быстрых итераций. Спасибо, что разъяснили мне этот вопрос :) - person yby; 07.12.2010

В Eclipse для этого можно использовать плагин «Run Jetty».
В конфигурации запуска IDEA есть опция «Разрешить артефакты рабочей области», отметьте ее.

person Kaibin    schedule 16.07.2013

Если вы используете M2Eclipse (плагин Eclipse для тесной интеграции Maven в Eclipse), вы можете запустить причал: цель запуска в веб-модуле и другие зависимости будут учтены из вашего рабочего пространства, даже если они не доступны в вашем локальном репозитории.

В вашем прогоне есть только возможность указать Maven разрешить ваши модули в самой рабочей области (по умолчанию он просто извлекает то, что развернуто в локальном репозитории).

К сожалению, у меня не может быть такого же поведения в IDEA, и я должен запустить установку перед запуском причала: запустить в веб-модуле.

person Damien Coraboeuf    schedule 10.02.2011
comment
Это правда? Я не могу заставить его работать. См .: stackoverflow.com/questions/5571442/ - person ccleve; 07.04.2011

На основе этого ответа: Передовой опыт по отношению к. `mvn install`, многомодульные проекты и запуск одного подмодуля обходной путь вокруг ужасных ограничений Mavens и ограничений реактора состоит в том, чтобы определить плагин в родительском pom с помощью skip true, а затем повторно включить его в соответствующем подмодуле с помощью skip ложный.

person tkruse    schedule 24.03.2016

Я решил, используя средство запуска maven и настроив Resolve Workspace artifacts, который по умолчанию не проверяется  введите описание изображения здесь

person Gardella Juan    schedule 01.11.2017