Плагин Maven Jetty - автоматическая перезагрузка с использованием многомодульного проекта
Я занимаюсь разработкой веб-приложения на Java с использованием многомодульного проекта Maven. Настройка проекта следующая:
pom.xml
Основной проект Maven, который включает в себя следующие модули:persistence:
Классы сущностей и DAObusiness:
Определение и внедрение сервисаwebapp:
Веб-приложение Apache Wicket
Иерархия зависимостей следующая: webapp
зависит от business
, который зависит от persistence
,
Я также использую плагин Jetty Maven для локального запуска веб-приложения, используя mvn -pl webapp jetty:run
внутри каталога с основным pom.xml
, При разработке приложения, при внесении изменений в код, я хочу, чтобы сервер Jetty перезагружался и автоматически загружал измененные файлы кода. Это прекрасно работает, когда я изменяю файлы внутри webapp
модуль, но не работает, когда я изменяю файл внутри другого модуля, например persistence
или же business
,
Плагин Maven Jetty настроен внутри webapp/pom.xml
следующее:
<plugin>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-maven-plugin</artifactId>
<version>9.2.2.v20140723</version>
<configuration>
<reload>automatic</reload>
<scanIntervalSeconds>1</scanIntervalSeconds>
<webApp>
<extraClasspath>../business/target/classes/;../persistence/target/classes/</extraClasspath>
</webApp>
<scanTargets>
<scanTarget>../business/target/classes</scanTarget>
<scanTarget>../persistence/target/classes</scanTarget>
</scanTargets>
</plugin>
Я следовал инструкциям этого ответа. <scanTarget>
теги работают нормально, так как Jetty перезапускается, когда я изменяю файл внутри business
или же persistence
, Тем не менее <extraClasspath>
не работает, так как измененные файлы не загружаются на причале. Связанный ответ использует <webAppConfig>
тег. Тем не менее, я использую <webApp>
тег, как указано в документации к плагину (я также попробовал старый <webAppConfig>
тег, который приводит к тем же результатам).
Мой вопрос: как настроить плагин Jetty Maven для многомодульного проекта, чтобы он перезагружал измененные файлы из других модулей?
3 ответа
Используя метод проб и ошибок, я нашел решение. Проблема в том, что причал выполняется с помощью родительского пом
mvn -pl webapp jetty:run
Команда вызывается из каталога основного модуля, поэтому Jetty не может разрешить относительные пути внутри extraClasspath
правильно. При выполнении jetty:run
цель внутри webapp
каталог, все измененные классы загружаются правильно.
Я предполагаю scanTargets
работают правильно даже при использовании mvn -pl webapp jetty:run
, потому что относительные пути разрешаются во время выполнения плагина (с правильным рабочим каталогом). Jetty выводит цели сканирования при запуске:
[INFO] Added extra scan target:C:\PathToProject\business\target\classes
[INFO] Added extra scan target:C:\PathToProject\persistence\target\classes
Тем не менее <extraClasspath>
собственность является частью <webApp>
свойство, которое является экземпляром класса org.eclipse.jetty.webapp.WebAppContext. Я предполагаю, что этот экземпляр передается непосредственно в jetty и что свойство extraClasspath доступно через jetty, когда оно уже запущено.
Для принудительной перезагрузки при каждом изменении подмодуля вы можете использовать следующие опции
1 - Имена статических модулей и цели сканирования
Вы можете определить в качестве целей сканирования целевой каталог для каждого модуля
<plugin>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-maven-plugin</artifactId>
<version>${jetty.plugin.version}</version>
<configuration>
<scanIntervalSeconds>${jetty.scanInterval}</scanIntervalSeconds>
<scanTargets>
<scanTarget>module-name/target/classes</scanTarget>
<scanTarget>module-name2/target/classes</scanTarget>
</scanTargets>
</configuration>
</plugin>
2 - Имена модулей Dinamic и цели сканирования (рекомендуется). Использует RegEx для поиска цели компиляции для других модулей. В следующем примере мы перезагружаем приложение каждый раз, когда класс компилируется в любом модуле.
<plugin>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-maven-plugin</artifactId>
<version>${jetty.plugin.version}</version>
<configuration>
<scanIntervalSeconds>${jetty.scanInterval}</scanIntervalSeconds>
<scanTargetPatterns>
<scanTargetPattern>
<directory>${project.basedir}</directory>
<includes>
<include>**/target/classes/**/*.class</include>
</includes>
</scanTargetPattern>
</scanTargetPatterns>
</configuration>
</plugin>
Следующая конфигурация работает для меня
<!-- To launch embded jetty server -->
<plugin>
<groupId>org.mortbay.jetty</groupId>
<artifactId>jetty-maven-plugin</artifactId>
<version>7.4.2.v20110526</version>
<configuration>
<scanIntervalSeconds>3</scanIntervalSeconds>
<webAppConfig>
<contextPath>/${project.name}</contextPath>
<extraClasspath>target/classes;../services/target/classes;../util/target/classes</extraClasspath>
</webAppConfig>
<scanTargets>
<scanTarget>target/classes</scanTarget>
<scanTarget>../services/target/classes</scanTarget>
<scanTarget>../util/target/classes</scanTarget>
</scanTargets>
</configuration>
</plugin>