2010-12-06 2 views
23

Ich bin neu in Maven. Ich habe ein Multi-Modul Maven 2-Projekt, das die folgende Struktur hat (etwas vereinfacht):Maven: Wie Anlegesteg zu verwenden: Führen Sie in einem Multi-Modul Maven-Projekt, ohne zu installieren

Project (POM packaging) 
    | 
    +-- Module1 (JAR) 
    |  | 
    |  +-- src 
    |   | 
    |   +-- main 
    |    | 
    |    +-- java 
    |    +-- resources 
    | 
    +-- Module2 (JAR) 
    |  | 
    |  ... 
    | 
    +-- Web Module (WAR) 
     | 
     ... 

ich das Web-Modul so konfiguriert haben, die Maven Jetty plugin aufzunehmen. Dies funktioniert hervorragend zum Erstellen der Produktionsartefakte. Für die Entwicklung, entdeckte ich, dass ich mvn install auf jedem Modul aufrufen müssen, die ich ändern, gefolgt von Anlegesteg stoping und ruft Anlegestelle: wieder laufen.
Es wäre viel produktiver sein, wenn es eine Möglichkeit für das Plugin wird direkt von jedem Zielverzeichnissen Änderungen in Kraft des Moduls. Laut der Jetty-Plugin-Dokumentation scheint es ein solches Feature zu geben, aber es scheint, dass dies nur für das WAR-Modul gilt.
Noch wichtiger ist für mich die Lage sein, Änderungen vorzunehmen, Dateien zu Ressourcen, ohne die Notwendigkeit, Anlegestelle neu zu starten. Das liegt daran, dass es sich bei den meisten Ressourcen um HTML-Schablonendateien handelt und dass die Erstellung und Aktualisierung der Vorlagen während der Entwicklung enorm erleichtert wird, ohne dass ein Neustart erforderlich ist, um die Änderungen zu sehen.

Gibt es also eine Möglichkeit, den Klassenpfad des Jetty-Plugins so festzulegen, dass die Ziel-/Klassen- und Ressourcenverzeichnisse jedes JAR-Moduls anstelle der eigentlichen JARs im lokalen Repository enthalten sind?

Danke!
Yaniv

+2

Ausgezeichnete Frage nicht geprüft! Ich kann das auch nicht herausfinden. Bitte posten Sie die Antwort hier, wenn Sie es herausfinden. –

Antwort

7

Dies ist mit einem Maven-Projekt mit mehreren Modulen nicht möglich. Eine Grundregel von Maven-Projekten ist, dass jedes Projekt alleine stehen kann. Das schließt nicht aus, dass sie zusammen gebaut werden, aber jedes Projekt sollte in der Lage sein, sich selbst zu erstellen, solange alle Abhängigkeiten erfüllt sind.

In diesem Fall bedeutet es, dass das WAR-Projekt nicht auf die anderen Projekte schauen kann, um zu sehen, ob sie aktualisiert werden müssen. Die POM für diese anderen Projekte sind die definitive Erklärung, was getan werden muss, um das Artefakt zu erstellen . Sobald das Artefakt erstellt wurde, wird es in das lokale Repository gestellt. Zu diesem Zeitpunkt gibt es keine Verbindung zwischen den Quelldateien und dem Artefakt. Daher gibt es keine Möglichkeit zu sagen, welche Quelldateien eine Wiederherstellung des Artefakts auslösen würden, von dem die WAR abhängt.

+5

Das ist ziemlich schrecklich. Als jemand, der von anderen Build-Systemen kommt, hasse ich wirklich diese Einschränkung und hoffe, dass es nicht wahr ist. Maven weiß, welche Module sich im Dateisystem befinden, da sie in der pom.xml der Eltern angegeben sind. Daher sollte es in der Lage sein, diese Projekte immer wieder neu zu erstellen. Es muss nichts Superintelligentes tun, aber eine Option, immer wieder neu aufzubauen, wäre nett. –

+3

Niemand baut mit Maven für schnelle Iterationen. Laden Sie Ihr Projekt in eine IDE ... IntelliJ IDEA, Eclipse oder Netbeans alle verstehen, wie Maven-Projekte zu parsen, und wenn Sie keine speziellen Plugins haben (oder die Plugins müssen nur ausgeführt werden, nachdem bestimmte Dateien ändern), werden Sie Erleben Sie diese niemals als Probleme, die Ihnen besonders wichtig sind. –

+0

Wie machen Sie dann schnelle Iterationen in einer Web-App? Gibt es etwas, was Sie in der IDE tun anstatt "mvn jetty: run"? Oder ich denke, die Antwort ist im Grunde, dass Sie keine schnellen Iterationen für eine Web-App durchführen können und durch die Neuinstallation Ihres Projekts die ganze Zeit leiden müssen? –

2

Wenn Sie M2Eclipse (Eclipse-Plugin für eine enge Integration von Maven in Eclipse) verwenden, können Sie Ihr Ziel im Webmodul ausführen und andere Abhängigkeiten werden in Ihrem Arbeitsbereich berücksichtigt, selbst wenn sie dies tun sind in Ihrem lokalen Repository überhaupt nicht verfügbar.

Es gibt nur eine Option in Ihrem Lauf, um Maven zu sagen, dass er Ihre Module im Arbeitsbereich selbst auflösen soll (standardmäßig wird nur das abgerufen, was im lokalen Repository bereitgestellt wird).

Leider kann ich nicht das gleiche Verhalten in IDEA haben und ich muss eine Installation ausführen, bevor Sie die Anlegestelle ausführen: auf dem Webmodul ausführen.

+2

Ist das wahr? Ich kann es nicht zur Arbeit bringen. Siehe: http://stackoverflow.com/questions/5571442/how-to-get-maven-plugin-to-use-eclipse-workspace-resolution – ccleve

3

In Eclipse können Sie das Plugin "Run Jetty" verwenden, um dies zu erreichen.
In der IDEA Run-Konfiguration, gibt es eine Option 'Resolve Workspace Artefakte', es zu überprüfen.

1

ich gelöst, indem ein Maven-Launcher mit und Resolve Workspace Artefakte, Konfiguration, die standardmäßig enter image description here