Мультимодульный проект Maven и причал: запустить - PullRequest
36 голосов
/ 03 сентября 2010

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

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

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

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

Ответы [ 5 ]

29 голосов
/ 09 мая 2011

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

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

Запуск с верхнего уровня: mvn test -Pjetty-run или mvn test -DskipTests=true -Pjetty-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>
11 голосов
/ 03 сентября 2010

Волшебного решения не существует, и единственное, что я знаю, немного хакерское и полагается на элемент 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>
1 голос
/ 21 мая 2015

Добавьте джет плагин к корневому пом и настройте 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

1 голос
/ 14 октября 2010

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

0 голосов
/ 08 марта 2016

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

$ mvn jetty:run --projects project-war
...