Мультимодульный проект Maven и пристань: запустить

Я пытаюсь разделить проект Maven WAR на два модуля, чтобы я мог создать отдельный файл JAR с инструментами командной строки. Результат имеет следующую структуру:

  • pom.xml (упаковка pom, имеет два модуля)
  • project-jar/
    • pom.xml (packaging jar)
  • project-war/
    • pom.xml (packaging war, depends on project-jar)

Если я запускаю mvn команд из корня, все работает нормально. Я хотел бы продолжать использовать mvn jetty:run, но для этого мне нужно выполнить команду в подпроекте WAR. Если я это сделаю, не смогу найти подпроект project-jar, поэтому он не запустится. Даже mvn jetty:run-war с полностью собранным файлом WAR в каталоге target не работает, потому что сначала он пытается «построить» проект. Мне удалось заставить его работать, только установив project-jar в локальный репозиторий Maven, что не очень хорошо.

Есть ли способ использовать плагин Jetty в многомодульной конфигурации Maven?


person Lukáš Lalinský    schedule 03.09.2010    source источник


Ответы (6)


Нет никакого волшебного решения, и единственное, что я знаю, немного взломано и полагается на элемент extraClasspath, который вы можете использовать для объявления дополнительных каталогов классов, относительно. Вот так (из JETTY-662):

<plugin>
  <groupId>org.mortbay.jetty</groupId>
  <artifactId>jetty-maven-plugin</artifactId>
  <version>7.0.1.v20091125</version>
  <configuration>
    <scanIntervalSeconds>10</scanIntervalSeconds>
    <webAppConfig>
      <contextPath>/my-context</contextPath>
      <extraClasspath>target/classes;../my-jar-dependency/target/classes</extraClasspath>
    </webAppConfig>
    <scanTargets>
      <scanTarget>../my-jar-dependency/target/classes</scanTarget>
    </scanTargets>
  </configuration>
</plugin>
person Pascal Thivent    schedule 03.09.2010
comment
Хм, это на самом деле мне не помогает, потому что происходит сбой с ошибкой BUILD Не удалось разрешить артефакт. (родственный проект JAR) еще до того, как плагин Jetty будет запущен. Так что, похоже, мне в первую очередь нужно общее решение для Maven. :( - person Lukáš Lalinský; 04.09.2010
comment
@ Lukáš Maven использует локальный репозиторий для разрешения зависимостей, поэтому они должны быть установлены (т. Е. Сначала нужно install все модули, запустив сборку реактора на родительском сервере хотя бы один раз). Тогда вышеуказанное будет работать, даже если установленные JAR-файлы устарели. - person Pascal Thivent; 04.09.2010
comment
Ах, я надеялся этого избежать. Одна из альтернатив, которую я обнаружил, заключалась в установке подключаемого модуля jetty для родительского элемента и указании его на правильный файл war (а затем использование jetty: run-war), но мне, вероятно, все равно придется запустить установку, чтобы сделать NetBeans счастливым. - person Lukáš Lalinský; 04.09.2010
comment
Можете ли вы написать, как вам удалось определить причал, где находится файл войны модулей? - person Patrick Cornelissen; 19.08.2011

Создайте профиль внутри военного модуля (project-war). В этом профиле настройте причал для присоединения к фазе жизненного цикла и явного выполнения цели run. Теперь, когда maven запускается из проекта верхнего уровня с включенным этим профилем, он будет вызывать причал: запуск и иметь разрешение зависимостей дочернего модуля (как обычно при выполнении команд maven из проекта верхнего уровня).

Конфигурация примера, помещенная в pom.xml веб-модуля (project-war), обеспечивает выполнение jetty: run на этапе test. (Вы можете выбрать другую фазу, но убедитесь, что она будет после compile.)

Запуск с верхнего уровня: mvn test -Pjetty-run или mvn test -DskipTests=true -Pjetty-run. Это скомпилирует зависимости по мере необходимости и сделает их доступными, но вызовет jetty: run в правильном модуле.

<profiles>
  ...
  <!-- With this profile, jetty will run during the "test" phase -->
  <profile>
    <id>jetty-run</id>
    <build>
      <plugins>
        <plugin>
          <groupId>org.mortbay.jetty</groupId>
          <artifactId>jetty-maven-plugin</artifactId>
          <version>7.1.6.v20100715</version>
          <configuration>
            ...
            <webAppSourceDirectory>
              ${project.build.directory}/${project.build.finalName}
            </webAppSourceDirectory>
            ...
          </configuration>
          <executions>
            <execution>
              <id>jetty-run</id>
              <phase>test</phase>
              <goals>
                <goal>run</goal>
              </goals>
            </execution>
          </executions>
        </plugin>
      </plugins>
    </build>
  </profile>
...
</profiles>
person Patrick    schedule 09.05.2011

Использование extraClasspath в конфигурации причала работает ... но по какой-то причине, если зависимые jar-файлы (из других модулей) устарели, некоторые вещи не будут работать правильно.

person Jaime Hablutzel    schedule 14.10.2010

Добавьте плагин jetty в корневой pom и настройте contextHandler, указывающий на желаемую войну. Это работает для меня в проекте с несколькими модулями jar и двумя оверлейными войнами.

<plugin>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-maven-plugin</artifactId>
<version>9.3.0.M2</version>
<configuration>
        <scanIntervalSeconds>10</scanIntervalSeconds>
        <contextHandlers>
            <contextHandler
                implementation="org.eclipse.jetty.maven.plugin.JettyWebAppContext">
                <war>${project.basedir}/project-war/target/project-war-${project.version}.war</war>
                <contextPath>/</contextPath>
            </contextHandler>
        </contextHandlers>
    </configuration>
</plugin>

http://eclipse.org/jetty/documentation/current/jetty-maven-plugin.html#running-more-than-one-webapp

person Serge    schedule 21.05.2015

Я знаю, что вы запрашиваете конфигурацию плагина, но вы можете просто определить проект в команде maven:

$ mvn jetty:run --projects project-war
person Andrew Grover    schedule 07.03.2016

Документация для jetty:run отмечает, что

Начиная с Jetty 9.4.7, при использовании jetty: run в многомодульной сборке больше нет необходимости сначала создавать каждый из модулей, которые формируют зависимости веб-приложения. Таким образом, если ваше веб-приложение зависит от других модулей в вашем проекте и они присутствуют в реакторе одновременно, jetty будет использовать их скомпилированные классы, а не файлы jar из вашего локального репозитория maven.

Таким образом, добавьте jetty-maven-plugin в корневой проект Maven и запустите mvn jetty:run

person simon04    schedule 31.07.2020