Wie erstelle ich ein leeres Maven-Projekt mit mehreren Modulen?

75

Im Moment finde ich normalerweise eine pom.xmlDatei im Web, die eine pomVerpackung enthält, und kopiere sie und füge sie ein, um mein übergeordnetes Projekt zu erstellen. Dann habe ich archetype:createim übergeordneten Verzeichnis ausgeführt, um Untermodule zu erstellen, aber archetype:createseitdem ist es veraltet.

Irgendwelche Empfehlungen zum Erstellen neuer Maven-Projekte mit mehreren Modulen?


quelle

Antworten:

125

Der einfachste Weg, dies zu tun, besteht darin, den pom-rootArchetyp zu verwenden, um den Pom der obersten Ebene archetype:generatezu erstellen, und ihn dann wiederholt zu verwenden , um jedes Modul einzeln zu erstellen. Dadurch werden die Module automatisch zum Root-Pom (Aggregator) hinzugefügt und das Root-Pom als übergeordnetes Pom für jedes Modul festgelegt (Bearbeiten: Anscheinend können einige Archetypen ein fest codiertes übergeordnetes Element haben, aber es funktioniert für maven-archetype-quickstart).

Hier ist die Aufschlüsselung:

  1. Erstellen Sie den Stamm der obersten Ebene:

    mvn archetype:generate \
    -DarchetypeGroupId=org.codehaus.mojo.archetypes \
    -DarchetypeArtifactId=pom-root \
    -DarchetypeVersion=RELEASE
    
  2. cd in Ihr neu erstelltes Root-Verzeichnis.

  3. Für jedes Modul:

    mvn archetype:generate \
    -DarchetypeGroupId=org.apache.maven.archetypes \
    -DarchetypeArtifactId=maven-archetype-quickstart \
    -DarchetypeVersion=RELEASE
    

Beachten Sie, dass -DarchetypeVersion=RELEASEoben automatisch die neueste Version des Archetyps verwendet wird. Möglicherweise möchten Sie -DgroupId=...jedem dieser Befehle etwas hinzufügen , um zu vermeiden, dass Sie sich wiederholen.

Chris H.
quelle
3
Wenn Sie -Dfilter = pom-root verwenden, haben Sie eine Auswahl, ohne die Archetypgruppe und die Artefakt-ID auswählen zu müssen. Wenn Sie die archetypeVersion löschen, stehen nur einige Optionen zur Auswahl. Könnte ein einfacher Weg für diejenigen sein, die das Tippen ablehnen. :-)
Spencer Kormos
Ich dachte, Kopieren / Einfügen sei das Beste für diejenigen, die das Tippen ablehnen;) Deshalb habe ich die Befehle mehrzeilig gemacht, um das Kopieren / Einfügen zu vereinfachen.
Chris H.
Stimmt, aber ich habe nur zur Zukunftssicherung hinzugefügt. :-D
Spencer Kormos
7
Es ist traurig, dass ich immer noch zu SO komme, um dies zu kopieren und einzufügen, anstatt mich einfach nur auf das Dienstprogramm mvn verlassen zu können.
Daniel Gerson
1
Toll! Danke für den Tipp.
Asgs
46

Hier ist ein Screencast, wie Sie dies mit Intellij Idea tun können. Starten Sie zuerst ein neues Projekt (Datei -> Neues Projekt) und wählen Sie 'Maven Module':

Geben Sie hier die Bildbeschreibung ein

Geben Sie einen Namen ein, klicken Sie auf Weiter, ändern Sie in den folgenden Schritten nichts anderes, klicken Sie auf Fertig stellen.

Geben Sie nun Ihren pom.xmlTyp ein <packaging>und aktivieren Sie automatische Updates:

Geben Sie hier die Bildbeschreibung ein

Module eingeben:

Geben Sie hier die Bildbeschreibung ein

Platzieren Sie den Cursor auf m1und drücken Sie Alt+Enter.

Geben Sie hier die Bildbeschreibung ein

Das Modul m1wird automatisch zu Ihrem Projekt hinzugefügt. Jetzt können Sie tun Alt+Enterfür m2und das ist es.

Geben Sie hier die Bildbeschreibung ein

Sie können auch damit beginnen, pom.xmlein vorhandenes Modul Ihres Projekts hinzuzufügen : Klicken Sie in der Projektstruktur mit der rechten Maustaste darauf, "Framework-Unterstützung hinzufügen ...", und wählen Sie "Maven". Dadurch wird ein erstellt pom.xml.

Andrey Chaschev
quelle
Mann, das war eine erstaunliche und hilfreiche Antwort. Kann ich dir in Twitter / Stackoverflow-Antworten usw. folgen?
Rinor
Stellen Sie sicher, dass Sie diese <module>m1</module>in das <modules>Tag einwickeln . Ich bin neu in der POM-Datei und habe viel Zeit damit verbracht, warum alt + enterkeine der genannten Optionen angezeigt werden.
Unbekannter Fehler
21

mvn archetype:createwurde zugunsten von abgelehnt mvn archetype:generate, daher wurde nur der Name geändert. In den offiziellen Repositorys gibt es einen Archetyp für Projekte mit mehreren Modulen. Wenn Sie diesen Befehl ausführen, erhalten Sie das (minimalistische) Ergebnis:

[axe@gromp test]$ mvn archetype:generate
..
<num>: remote -> pom-root (Root project archetype for creating multi module projects)
..
Choose a number: 109: <num>
.. 

[axe@gromp test]$ tree 
.
└── modules.test
    └── pom.xml

1 directory, 1 file

[axe@gromp test]$ cat modules.test/pom.xml 
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.example</groupId>
  <artifactId>modules.test</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>pom</packaging>
  <name>modules.test</name>
</project>

Grundsätzlich müssen Sie die Ordnerstruktur und die Moduldeskriptoren (pom.xml-Dateien) selbst erstellen. Die Verwendung eines einfachen Shell-Skripts oder einer Batch-Datei ist problemlos möglich, wenn Sie es mehrmals benötigen.

Axel Knauf
quelle
Zu Ihrer Information, die Nummer für Pom-Root hat sich geändert. Derzeit ist es 449.
Mwoodman
@ Woodman Danke für den Hinweis. Ich habe meine Antwort bearbeitet, um sie für zukünftige Änderungen generisch zu gestalten.
Axel Knauf
2
Zu Ihrer Information, die Nummer ändert sich abhängig von dem Repository, aus dem Sie sie erhalten.
2
Die Verwendung von -Dfilter = pom-root macht das Dokumentieren von Nummern überflüssig und sollte die Ergebnisse auf eins reduzieren.
Spencer Kormos
9

Ich bin mir nicht sicher, ob ich Ihre Frage richtig verstehe, aber zum Erstellen eines Multi-Modul-Projekts verwende ich normalerweise einen einfachen Pom (auf der Root-Ebene):

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.vijaykiran</groupId>
  <artifactId>myproject-parent</artifactId>
  <version>1.0</version>
  <packaging>pom</packaging>

  <modules>
    <module>m1</module>
    <module>m2</module>
  </modules>
</project>

Dies ist wahrscheinlich der einfachste übergeordnete POM mit mehreren Modulen, den Sie verwenden können. Das Projekt, das Sie erstellen möchten, verfügt möglicherweise bereits über einen Archetyp, der Ihnen beim Erstellen der Struktur helfen kann. Obwohl Sie Hilfe von einer IDE erhalten können, um den POM selbst zu schreiben, ist es normalerweise einfacher, diesen zu verwenden, wenn für den Typ des Projekts, das Sie erstellen möchten, ein Archetyp verfügbar ist.

Vijay Kiran
quelle
6
Was ich damit sagen will ist, dass es schwierig ist, sich das Format der POM-Datei zu merken, und es jedes Mal von Grund auf neu zu schreiben, ist Zeitverschwendung. Jedes Mal, wenn ich ein neues Projekt erstellen möchte, kopiere ich den Inhalt der POM-Datei, füge ihn ein und speichere ihn in der pom.xml meines neuen Projekts. Ich suche nach einer disziplinierteren und effizienteren Möglichkeit, Projekte mit mehreren Modulen zu erstellen. Ein solcher interaktiver Befehl archetype:generatefragt mich beispielsweise, ob ich ein Projekt mit mehreren Modulen erstellen möchte und wenn ja, welche Module es enthält, und erstellt dann die pom.xmlDateien für mich.
6

Wenn Sie mit der Eclipse-IDE arbeiten, sollten Sie das Plug-In m2eclipse verwenden . Dies ist eine der einfachsten Möglichkeiten, Projekte mit mehreren Modulen zu erstellen. Sie können jedem Maven-Projekt ein Modul hinzufügen, indem Sie in Eclipse ein 'Maven-Modul-Projekt' erstellen. Dabei haben Sie die Möglichkeit, ein übergeordnetes Projekt auszuwählen. Das Plug-In erledigt alles, dh es kopiert das neue Modul in das übergeordnete Modul und ändert die Datei pom.xml.

Thomas
quelle
5

Gleiche Antwort wie Chris H. Ich habe gerade Optionen für Gruppen-ID, Artefakt-ID und Version hinzugefügt und den interaktiven Modus deaktiviert.

mvn archetype:generate -DarchetypeGroupId=org.codehaus.mojo.archetypes \
    -DarchetypeArtifactId=pom-root \
    -DarchetypeVersion=RELEASE \
    -DinteractiveMode=false \
    -DgroupId=com.mycompany.app \
    -DartifactId=my-app \
    -Dversion=1.0.0-SNAPSHOT  \
Mohamed EL HABIB
quelle
4

Betrachten Sie ein übergeordnetes Projekt Lesezeichen und 3 Untermodule Rest, Sicherheit und Modell, unter Bezugnahme auf Spring-Dokumente . Es hat nicht die Abhängigkeiten wie im Spring-Dokument, sondern nur die Grundeinstellung aus Sicht mehrerer Module.

So erstellen Sie ein übergeordnetes Maven-Projekt im nicht interaktiven Modus / Stapelmodus

mvn archetype:generate \
-DarchetypeGroupId=org.codehaus.mojo.archetypes \
-DarchetypeArtifactId=pom-root \
-DarchetypeVersion=RELEASE \
-DgroupId=bookmarks \
-DartifactId=bookmarks \
-Dversion=0.0.1-SNAPSHOT \
-DinteractiveMode=false

So erstellen Sie Submodule im nicht interaktiven Modus / Batch-Modus.

CD in Ihr neu erstelltes Root-Verzeichnis. Bezugnehmend auf die Antwort von @ Chris.H

-Dpackage ist die Paketstruktur. Hier sind es Lesezeichen. Wenn nicht angegeben, wird die Artefakt-ID als Standardpaket betrachtet

mvn archetype:generate \
-DarchetypeGroupId=org.apache.maven.archetypes \
-DarchetypeArtifactId=maven-archetype-quickstart \
-DarchetypeVersion=RELEASE \
-DgroupId=model \
-DartifactId=model \
-Dversion=0.0.1-SNAPSHOT \
-Dpackage=bookmarks \
-DinteractiveMode=false 

Um ein neues Modul in Eclipse zu erstellen, gehen Sie zu Datei-> Neu-> Andere-> Maven-> Maven-Modul. Dies wird sofort im Eclipse Workspace Package Explorer angezeigt.

Oder von cli, cd im übergeordneten Ordner, hier Lesezeichen und führen Sie Folgendes aus, es wird das Projekt erstellt und dann müssen Sie als Maven-Projekt in Eclipse importieren oder können von übergeordneten, hier Lesezeichenprojekt arbeiten

mvn archetype:generate \
-DarchetypeGroupId=org.apache.maven.archetypes \
-DarchetypeArtifactId=maven-archetype-quickstart \
-DarchetypeVersion=RELEASE \
-DgroupId=security \
-DartifactId=security \
-Dversion=0.0.1-SNAPSHOT \
-Dpackage=bookmarks \
-DinteractiveMode=false 
Anfänger
quelle
1

Einfache 4 Schritte, wenn Sie das Kopieren und Einfügen von XML vermeiden möchten.

  1. Erstellen Sie ein 284 (Standard) Archetyp-Projekt. Öffnen Sie die erstellte POM-Datei und ändern Sie die Verpackung von JAR zu POM

  2. Löschen des src-Ordners aus dem Projekt - Dies ist jetzt das übergeordnete Projekt ohne src, da die Verpackung pom ist. Erstellen Sie im obigen Ordner ein weiteres neues Projekt (284 Standard). Ändern Sie die Verpackung in Krieg oder EJB oder Ohr. Dies wird zum Untermodul.

  3. Führen Sie mvn eclipse: eclipse auf jedem Modul aus. Jetzt sollte das Projekt bereit sein, als Eclipse-Projekt importiert zu werden.

  4. Beim Importieren des Projekts beschwert sich Eclipse, dass die folgende Projektkonfiguration mit pom.xml nicht auf dem neuesten Stand ist. Führen Sie Maven-> Update Project aus oder verwenden Sie Quick Fix. Um den obigen Fehler zu vermeiden, klicken Sie mit der rechten Maustaste und wählen Sie Schnellkorrektur. Dadurch wird das POMS aktualisiert. Eine andere Möglichkeit, diesen Fehler zu vermeiden, besteht darin, die Untermodule im übergeordneten POM zu deklarieren

Weitere Informationen finden Sie unter dem folgenden Link. http://maven.apache.org/guides/introduction/introduction-to-the-pom.html#Example_1

Padmini Mandal
quelle