2010-09-03 8 views
34

Ich versuche, ein Maven WAR-Projekt in zwei Module zu teilen, so dass ich eine separate JAR-Datei mit Befehlszeilen-Tools erstellen kann. Das Ergebnis hat die folgende Struktur:Multi-Modul Maven-Projekt und Steg: Lauf

  • pom.xml (Verpackung pom, hat zwei Module)
  • project-jar/
    • pom.xml (Verpackungs jar)
  • project-war/
    • pom.xml (Verpackung war, hängt von project-jar)

Wenn ich mvn Befehle von der Wurzel laufen, funktioniert alles einwandfrei. Ich möchte weiterhin mvn jetty:run verwenden, aber dafür muss ich den Befehl im WAR-Teilprojekt ausführen. Wenn ich das tue, kann das Unterprojekt project-jar nicht gefunden werden, so dass es nicht ausgeführt wird. Auch mvn jetty:run-war mit einer komplett zusammengestellten WAR-Datei im Verzeichnis target schlägt fehl, weil es zuerst versucht, das Projekt zu "bauen". Ich habe es nur geschafft, indem es project-jar in das lokale Maven-Repository installiert hat, was nicht sehr nett ist.

Gibt es eine Möglichkeit, das Jetty-Plugin in einer Maven-Konfiguration mit mehreren Modulen zu verwenden?

Antwort

11

Es gibt keine magische Lösung und die einzige, die ich kenne, ist ein bisschen hacky und verlassen sich auf das extraClasspath Element, das Sie verwenden können, um zusätzliche Klassenverzeichnisse relativ zu deklarieren. Wie dies (von 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, das eigentlich mir nicht hilft, weil es mit einem BUILD-Fehler fehlschlägt "Artefakt konnte nicht aufgelöst werden". (das Geschwister-JAR-Projekt), bevor das Jetty-Plugin ausgeführt wird. Es scheint also, dass ich zuerst eine allgemeine Lösung für Maven brauche. :( –

+1

@ Lukáš Maven verwendet das lokale Repository, um Abhängigkeiten aufzulösen, damit sie ** installiert werden müssen (dh Sie müssen zuerst alle Module "installieren", indem Sie mindestens einmal einen Reaktor bauen, der auf dem Elternknoten aufgebaut ist) funktionieren, selbst wenn die installierten JARs "veraltet" sind. –

+0

Ah, ich hatte gehofft, das zu vermeiden.Eine Alternative, die ich herausgefunden habe, war, das Jetty-Plugin auf das Eltern-Plugin zu setzen und es auf die richtige WAR-Datei zu richten (und dann Jetty: run -war), aber ich werde wahrscheinlich trotzdem installieren müssen, um NetBeans glücklich zu machen –

1

Mit extraClasspath in Anlegesteg Konfiguration funktioniert ... aber aus irgendeinem Grund, wenn abhängig Gläser (von anderen Modulen) sind veraltet einige Dinge wird nicht korrekt funktionieren.

30

Erstellen Sie ein Profil innerhalb des Kriegsmoduls (project-war). Konfigurieren Sie in diesem Profil die Anlegestelle so, dass sie an eine Lebenszyklusphase angefügt wird, und führen Sie das Ziel explizit aus. Wenn jetzt maven aus dem Toplevel-Projekt mit aktiviertem Profil ausgeführt wird, ruft es den Befehl jetty: run auf und verfügt über eine Abhängigkeitsauflösung für das Schwestermodul (wie es bei der Ausführung von maven-Befehlen aus dem Toplevel-Projekt normal ist).

Die Beispielkonfiguration, wenn sie in der Datei pom.xml des Webmoduls (project-war) platziert ist, arrangiert für den Anlegesteg: Ausführen, um während der test Phase ausgeführt zu werden. (Sie können eine andere Phase wählen, aber stellen Sie sicher, dass es nach compile ist.)

Von Toplevel laufen: mvn test -Pjetty-run oder mvn test -DskipTests=true -Pjetty-run. Dies kompiliert Abhängigkeiten nach Bedarf und stellt sie zur Verfügung, ruft aber Jetty auf: Ausführung innerhalb des richtigen Moduls.

<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

Fügen Sie das jetty-Plugin zum root pom hinzu und konfigurieren Sie einen contextHandler, der auf den gewünschten Krieg zeigt. Dies funktioniert für mich in einem Projekt mit mehreren JAR-Modulen und zwei Overlay-Wars.

<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

Ich weiß, Sie für Plugin-Konfiguration sind gefragt, aber man konnte nur das Projekt in der Maven-Befehl definieren:

$ mvn jetty:run --projects project-war