Плагин Maven Jetty - автоматическая перезагрузка с использованием многомодульного проекта

Я занимаюсь разработкой веб-приложения на Java с использованием многомодульного проекта Maven. Настройка проекта следующая:

  • pom.xml Основной проект Maven, который включает в себя следующие модули:
    • persistence: Классы сущностей и DAO
    • business: Определение и внедрение сервиса
    • 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>
Другие вопросы по тегам