2010-09-03 5 views
34

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

  • 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?

ответ

11

Нет волшебного решения, и единственный, кого я знаю, немного взломан и полагается на элемент 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> 
+2

Хм, это на самом деле не поможет мне, потому что он терпит неудачу с ошибкой BUILD «Не удалось разрешить артефакт». (проект JAR-сиблинга), прежде чем плагин Jetty даже будет выполнен. Похоже, мне нужно общее решение для Maven в первую очередь. :( –

+1

@ Lukáš Maven использует локальный репозиторий для разрешения зависимостей, поэтому ** необходимо установить ** (т. Е. Вам нужно «установить» все модули сначала, если хотя бы один раз запустите реактор, построенный на родительском элементе). работа, даже если установленные JAR «устарели». –

+0

Ах, я надеялся избежать этого. Одна из альтернатив, которую я обнаружил, - это установить плагин для причала на родителя и указать его в правый файл войны (а затем использовать причал: запустите -war), но мне, вероятно, понадобится запустить install так или иначе, чтобы сделать NetBeans счастливым. –

1

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

30

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

Пример конфигурации, размещенной в pom.xml веб-модуля (project-war), устраивает причал: выполняется для выполнения во время фазы 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> 
1

Добавить плагин причала к корневой помпе и настроить контекстHandler, указывающий на желаемую войну. Это работает для меня в проекте с несколькими модулями 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

0

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

$ mvn jetty:run --projects project-war 
Смежные вопросы