2010-09-03 19 views
34

Próbuję podzielić projekt Maven WAR na dwa moduły, dzięki czemu mogę zbudować oddzielny plik JAR z narzędziami wiersza poleceń. W rezultacie ma następującą strukturę:Wielomodułowy projekt Maven i pomost: uruchom

  • pom.xml (opakowanie pom posiada dwa moduły)
  • project-jar/
    • pom.xml (opakowanie jar)
  • project-war/
    • pom.xml (opakowanie war zależy project-jar)

Jeśli biegnę mvn polecenia z cebulkami, wszystko działa bez zarzutu. Chciałbym nadal używać mvn jetty:run, ale do tego potrzebuję wykonać polecenie w podprojekcie WAR. Jeśli to zrobię, nie uda się znaleźć podprojektu project-jar, więc nie będzie działać. Nawet mvn jetty:run-war z całkowicie zmontowanym plikiem WAR w katalogu target kończy się niepowodzeniem, ponieważ najpierw próbuje "zbudować" projekt. Udało mi się to tylko dzięki zainstalowaniu project-jar w lokalnym repozytorium Maven, co nie jest zbyt miłe.

Czy istnieje sposób na wykorzystanie wtyczki Jetty w wielomodułowej konfiguracji Maven?

Odpowiedz

11

Nie ma żadnego magicznego rozwiązania, a jedyne, co znam, jest nieco zhakowskie i polegać na elemencie extraClasspath, który można wykorzystać do zadeklarowania względnie dodatkowych katalogów klas. Tak (z 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

Hm, to faktycznie nie może mi pomóc, ponieważ nie powiedzie się z błędem BUILD "Nie udało się rozwiązać artefaktu." (projekt JAR dla rodzeństwa) zanim wtyczka Jetty zostanie nawet wykonana. Wydaje mi się więc, że najpierw potrzebuję ogólnego rozwiązania dla Mavena. :( –

+1

@ Lukáš Maven używa lokalnego repozytorium do rozwiązywania zależności, więc ** muszą ** być zainstalowane (tzn. Musisz najpierw zainstalować wszystkie moduły, uruchamiając co najmniej jeden proces budowy reaktora na obiekcie nadrzędnym). działa, nawet jeśli zainstalowane JAR-y są "nieaktualne" –

+0

Ach, miałem nadzieję tego uniknąć.Jedną alternatywą okazało się ustawienie wtyczki do mola na rodzica i wskazanie jej na prawidłowy plik wojenny (a następnie skorzystanie z przystani: uruchom -war), ale prawdopodobnie i tak będę musiał uruchomić instalację, aby uczynić NetBeans szczęśliwymi –

1

Korzystanie extraClasspath w konfiguracji molo działa ... ale z jakiegoś powodu, jeśli słoiki zależnych (z innych modułów) są przestarzałe niektóre rzeczy nie będzie działać prawidłowo.

30

Utwórz profil wewnątrz modułu wojny (project-war). W ramach tego profilu skonfiguruj pomost do dołączenia do fazy cyklu życia i jawnie wykonaj cel gola run. Teraz, gdy program maven działa z poziomu projektu z włączonym tym profilem, wywoła on pomost: uruchom i będzie miał zależność od modułu siostrzanego (co jest normalne przy wykonywaniu poleceń z programu tweenvel).

Konfiguracja przykładowa, umieszczona w pom.xml modułu web (project-war), organizuje pomost: uruchom, aby wykonać fazę test. (Możesz wybrać inną fazę, ale upewnij się, że jest po compile.)

Uruchom z poziomu: mvn test -Pjetty-run lub mvn test -DskipTests=true -Pjetty-run. Spowoduje to skompilowanie zależności zgodnie z wymaganiami i udostępnienie ich, ale wywołaj pomost: uruchom w odpowiednim module.

<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

Dodaj wtyczkę jetty do pom-pom i skonfiguruj contextHandler wskazując na żądaną wojnę. Działa to dla mnie w projekcie z wieloma modułami słoików i dwiema nakładającymi się wojnami.

<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

wiem pytasz o konfiguracji wtyczki, ale można po prostu zdefiniować projekt w komendzie maven:

$ mvn jetty:run --projects project-war 
Powiązane problemy