Eclipse Best Practice: Multi-Projekt mit Eclipse + EGit (Git) + m2e (Maven)

Gregorrr

Bekanntes Mitglied
Hallo,
ich würde gerne ein Multi-Projekt mit Eclipse + EGit (Git) + m2e (Maven) erstellen.

Projektstruktur:

Code:
top-level/
|-- .git/
|-- module-1/
|   `-- pom.xml
|-- module-2/
    `-- pom.xml

Jetzt habe ich das Problem, wenn ich das Top-Level Projekt in EGit unter Versionkontrolle stelle, die Submodule in Eclipse nicht dargestellt werden mit den Auszeichnungen für EGit, nur im Top-level Projekt. Naja, eigentlich ist das kein großes Problem, nur ein bisschen unschön, weil ich immer im top-level Projekt schauen muss, was geändert wurde, etc.

Was ich eigentlich wissen will ist: Benutzt ihr obige Kombination, und wenn ja, wie?
 

kama

Top Contributor
Hallo,

Hallo,
Code:
top-level/
|-- .git/
|-- module-1/
|   `-- pom.xml
|-- module-2/
    `-- pom.xml
Ich habe viele solcher Projekte...


Code:
top-level/
|-- pom.xml (!!! NICHT VERGESSEN)
|-- .git/
...
Bei mir habe ich noch mehr Ebenen ....und mit EGIT auch....

Gruß
Karl Heinz
 
G

Guest2

Gast
Moin,

Du kannst auf den einzelnen Modulen auch:

Team > Share Project > Git > Use or create Repository in parent folder of project > Finish

EGit findet dann Dein übergeordnetes .git und nutzt das entsprechend (auch wenn es über noch mehr Ebenen verschachtelt ist). Die einzelnen Git- Symbole / Marker / Funktionen werden dann auch auf den Dateien des Modules dargestellt / nutzbar.

Viele Grüße,
Fancy
 

TheDarkRose

Gesperrter Benutzer
Hey ho, genau damit hab ich mich heute Nach mal intensiv auseinander gesetzt :oops:

Also mal grundlegend, EGit ist bei Maven Multi-Modul Projekten Schrott, da es die Projekte in einer Flat-Struktur ins Repo abspeichert, wobei Maven im Gegensatz eine hierarchische Struktur verwendet. Also nimm lieber Git auf der Kommandozeile (Windows oder Linux User?). Geht auch schneller mal
Code:
git commit -a
zu tippen, als dich bis zum Commitdialog durchzuklicken. Vorallem wirst du wahrscheinlich auch maven häufig auf der Kommandozeile bedienen. Das mal zum Vorwort. Du hast halt überhaupt keine Git-Auszeichnungen in Eclipse, aber das hat mich jetzt eigentlich nicht gestört.

So, als erstes brauchst du mal einen leeren Workspace. Dort erstellst du dann dein Maven Parent Project. Also New -> Project... -> Maven -> Maven Project. Als Archetype wählst du dann pom-root aus, gibst deine Daten für Group und Artifact Id an und erstellst es. Dies ist dann dein Elternprojekt in dem dann deine Module erstellt werden. Dort verwaltest du auch die Versionen deiner Abhängigkeiten.

Nun kannst du deine Module erstellen. Unter New -> Project... -> Maven -> Maven Module oder Rechtsklick auf dein Parent Project -> Maven -> Add New Maven Module erstellst du deine Maven Module. Der Modulname am Anfang ist gleich der ArtifactId deines Modul. Als Parent wählst du eben dein Elternprojekt aus. In dem Fall brauchst du für das Modul wahrscheinlich keinen Archetype also, das Skip Archetpye Selection anhaken. Schon fast fertig dein Modul. Das Problem was m2eclipse mitbringt, ist, dass das Modul mit JavaSE 5 als Runtime initialisiert wird. Also fügst du folgendes zu der pom.xml des Moduls hinzu. Danach ein Rechtsklick aufs Modul -> Maven -> Project Configuration Update...
[XML]<project>
[...]
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.3.2</version>
<configuration>
<source>1.6</source>
<target>1.6</target>
</configuration>
</plugin>
</plugins>
</build>
[...]
</project>[/XML]

Schlussendlich müsste deine Verzeichnissstrukur (nicht in Eclipse sondern in einen Dateimanager betrachtet) wie folgt aussehen. In Eclipse werden sie trotzdem in einer Flat-Struktur angezeigt.
Code:
workspace
|---.gitignore
|
|---projects                     -> dein Parent Project
    |---pom.xml                  -> die sogenannte Super-POM
    |
    |---module1
    |   |---pom.xml
    |   |---src
    |   |   |---main
    |   |   |   |---java         -> Hier kommt dein Sourcecode rein.
    |   |   |   |---resources    -> Bilder und so Sachen, auch der META-INF Ordner sollte hier liegen.
    |   |   |---test
    |   |   |   |---java         -> Hier platzierst du deine JUnit Testklassen.
    |   |   |   |---resources    -> Ressourcen die du bei deinen Tests benötigst, aber nicht im normalen Projekt.
    |   |---[...]
    |
    |---module2
    |   |---pom.xml
    |   |---src
    |   |   |---main
    |   |   |   |---java
    |   |   |   |---resources
    |   |   |---test
    |   |   |   |---java
    |   |   |   |---resources
    |   |---[...]
    |
    |---module3
    |   |---pom.xml
    |   |---src
    |   |   |---main
    |   |   |   |---java
    |   |   |   |---resources
    |   |   |---test
    |   |   |   |---java
    |   |   |   |---resources
    |   |---[...]

In der .gitignore sollte folgendes stehen:
Code:
.classpath
.project
.settings/
.metadata/
target/

Nun kannst du auf der Ebene wo auch deine .gitignore ist, also auf deiner Workspace Ebene eine
Code:
git init
und ein anschließendes
Code:
git commit -a -m "initial project configuration"
Fertig ist dein Maven Multimodulprojekt mit git.

Edit: Wegen dem Dependency Management. In deinem Parent Project fügst du alle (wirklich alle, auch die Module selbst) Dependency's die du in deinen Modulen verwendest, mit der entsprechenden Version unter DependencyManagement ein. Dann brauchst du in deinen Modulen nur mehr deine gewünschten Abhängigkeiten nur mehr unter Dependency hinzufügen, aber ohne Versionsangabe. Den die Verwaltung der Version übernimmt dadurch deine Super-POM. Wenn du die Version änderst, machst du das im Elternprojekt und deine Module übernehmen automatisch die Versionen.

P.S.: Handelt es sich um ein normales Java Projekt oder um Java EE Module?
 
Zuletzt bearbeitet:

kama

Top Contributor
Hallo,

Also mal grundlegend, EGit ist bei Maven Multi-Modul Projekten Schrott, da es die Projekte in einer Flat-Struktur ins Repo abspeichert, wobei Maven im Gegensatz eine hierarchische Struktur verwendet.
Das verstehe ich nicht? Ich habe hier verschiedenste Projekte in Git (Multi-Module Projekt mit mehreren Ebenen) und in Eclipse (EGit) krieg ich die auch OHNE Probleme rein und mit eGit gehandhabt...Klar die Baumstruktur wird von Eclipse platt geklopft....das hat aber nichts mit EGit/Git zu tun sondern mit Eclipse...

Die Verzeichnisstruktur im Git Repository hat damit auch nichts zu tuen, da das einfach Verzeichnisse sind....***Am Kopf Kraz...***

Ich verstehe nicht warum Du in dem Baum noch ein zusätzliches Verzeichniss "projects" reinlegst (paralell zu .gitignore bzw. .git) ...bei mir

Code:
ProjektOrdner
    +--- .git
    +--- .gitignore
    +--- pom.xml
    +--- module1
    !        +--- pom.xml
    +--- module2
    !        +--- pom.xml
    !        +--- module21
    !                   +--- pom.xml
    +--- module3
             +--- pom.xml

Gruß
Karl Heinz Marbaise
 

TheDarkRose

Gesperrter Benutzer
Das ist kein zusätzliches Verzeichnis, sondern das Maven Parent Project. Ich hab halt nur noch den Workspace Ordner aufgezeigt. Aber hast schon recht. .git und .gitignore gehört parallel zur Super-POM. Gerade selbst ausprobiert. Das was einen die Baumstruktur zerhaut, ist der Import Wizard von EGit. Wenn man aber den "Checkout Maven Projects from SCM" Import Wizard nutzt, dann bleibt auch die Baumstruktur vorhanden. Dann muss man nurmehr noch (wie schon gesagt wurde) Team -> Share Projects um EGit zu verklickern, das dies Project im Repo ist.

Also war ein Bedienfehler von mir, und wenn man weiß, welchen Importwizard man benutzt, dann ruiniert Eclipse/EGit auch nicht die Baumstruktur.
 

Gregorrr

Bekanntes Mitglied
WOW, ihr seid der HAMMER. VIELEN DANK!!!! für die ausführlichen Erklärungen und Meinungen!!!

@Fancy: Genau das wars, ich dachte, EGit würde da ein neues Projekt unter Versionskontrolle stellen, etc., aber zum Glück nicht. Passt perfekt!

@Kama: Danke für deine Erfahrungswerte und Erläuterungen, super! Mein Projekt hat (fast) genau die Struktur ohne das Sub-sub-Modul.

@TheDarkRose: Danke für die ausführliche Erläuterung!
Ich benutze Ubuntu 11.04 und mache auch einiges, was nicht geht über die Konsole, aber zunächst will ich das über die GUI machen.
Es soll eine Graphen-basierte Simulationslösung sein, ich will halt die Modelle, bzw. den core als eigenständiges Package anbieten, und die GUI davon trennen, genauso ein Package für Javadoc anbieten und womöglich später noch andere Module auslagern, aber bis jetzt ist es das erst einmal. Die Unterstützung von Eclipse ist denke ich mitterlweile sehr gut, so dass ich mich erst mal damit belassen werde.
Bei der Software steht halt die Qualität im Vordergrund, deshalb bietet sich Maven mit dem Cobertura Plugin und natürlich JUnit besonders gut an.

Fazit:
1) Maven-Projekt mit Super-POM erstellen (als Simple Project - skip archetype)
2) JDK 6.0, wie oben ins Super-POM eintragen - Projekt-Konfiguration updaten
3) Je nach Projekt- X-Anzahl Module erstellen mit gewünschten Archetype
4) Versionsnummern + GroupID NUR im Super-POM definieren, die untergeordneten Sub-Module erben dann dies
[ 5) JUnit 4.8.2 neueste Version im Super-POM eintragen]
[6) Eventuell weitere Plugins-/Dependencies eintragen]
7) EGit: Team -> Share Project im Maven (Haupt-Projekt) anklicken und das gesamte Projekt unter Versionskontrolle stellen
8) .gitignore -Dateien erstellen, wie oben aufgeführt
9) Initialen Commit durchführen
10) Module wie Fancy oben aufgeführt hat in Eclipse über Team-> Share Projekt aktivieren
11) Spaß haben ;)
 

TheDarkRose

Gesperrter Benutzer
Zu 1) Eigentlich gibt es für die Super-POM auch einen Archetype: pom-root
Zu 3) Welchen Archetype hast du für ein simples Java Projekt verwendet?
 

TheDarkRose

Gesperrter Benutzer
maven-archetype-quickstart, gut zu wissen. Ja so ist Maven auch gedacht, das es für alles Archetypes gibt. Wobei es schwierig ist den passende zu finden, weil viele komplexe Archetypes sind. Z.b. gibt es keinen reinen JPA-Archetype
 

Ähnliche Java Themen

Neue Themen


Oben