Ab einer gewissen Projektkomplexität ist es sinnvoll, Teilprojekte zu erstellen. Das gilt natürlich auch für die Software-Entwicklung mit Maven.
Obwohl es doch einfach sein sollte, in Eclipse ein solches Maven-Multi-Projekt zusammen mit Teilprojekten zu erstellen, gibt es einige Stolperfallen hierbei. In diesem Artikel möchte ich in einfachen Schritten das Vorgehen darstellen.
Maven Root Projekt erstellen
Zuerst erstellen wir ein leeres Maven Projekt. Über das Menü File > New > Other...
rufen wir den Wizard Maven Project
auf.
Im ersten Schritt müssen wir den Speicherort des Projekts angeben. Wichtig: die Option „Create a simple Project
“ sollte nicht ausgewählt sein.
Dann soll ein Archetyp, also eine Vorlage für ein Maven Projekt, ausgewählt werden. Diese Vorlage ist in der Regel nicht im Katalog „Nexus Indexer“ enthalten.
Deshalb müssen wir den richtigen Archetype über den Button Add Archtype
einfügen.
Für ein leeres (Wurzel-)Projekt in Maven kann der folgende Archetype verwendet werden:
Group ID | org.codehaus.mojo.archetypes |
Artifact ID | pom-root |
Version | 1.1 |
Dann muss unser neuer Archetype in der Dialogliste ausgewählt werden.
Im nächsten Dialog geben wir die Daten für ein Maven Projekt ein: Group Id, Artifact Id und Version. Das Package wird mit der Kombination aus Group Id und Artifact Id vorbelegt, kann aber verändert werden.
Dann kann der Wizard mit Finish
beendet werden und das Projekt wird erstellt.
Die zugehörige POM-Datei ist minimalistisch und enthält nur die folgenden Elemente:
Diese werden wir gleich noch ergänzen, damit sie für alle Unterprojekte verwendet werden.
Scala-Projekt als Maven Module erstellen
Zunächst erstellen wir nun aber ein Unterprojekt – in Maven auch als „Module“ bezeichnet. Dazu müssen wir wieder über das Menü File > New > Other...
den Wizard Maven Module
aufrufen.
Wenn wir ein Scala-Projekt erstellen wollen, können wir den folgenden Archetype verwenden:
Group ID | net.alchim31.maven |
Artifact ID | scala-archetype-simple |
Version | 1.5 |
Wieder wird ein neues Projekt erstellt, dessen Struktur einem klassischen Maven Projekt entspricht. Die Sourcen sind in den Verzeichnissen src/main/scala
und src/test/scala
zu finden.
Korrekturen an den POM-Dateien vornehemn
Es treten aber einige Fehler auf, die wir nun noch beheben wollen. Zum einen zeig ein Blick in die POM-Datei einige Probleme.
Die Einträge für das scala-maven-plugin
und das maven-surefire-plugin
gehören eigentlich in den Abschnitt <pluginManagement>
. Also erstellen wir in der POM des Root-Projekts ein Tag <build>
und darin ein Tag für <pluginManagement>
. Dann verschieben wir die Einträge <plugins>
aus der POM-Datei des Scala-Projekts dorthin. Bei mir war es notwendig, folgenden Kommentar in maven-surefire-plugin
zu entkommentieren: useManifestOnlyJar
.
Ebenso verschieben wir die Abschnitte <properties>
und <dependencies>
in die Root-POM.
Wie wir sehen, wird noch das JDK 1.6 verwendet. Hier können wir bei Bedarf in <properties>
die maven.compiler.source
und das maven.compiler.target
auf 1.7 ändern. Außerdem wird von der aktuellen Scala IDE Version 3.0.1 bereits Scala 2.10.2 unterstützt, so dass auch der Eintrag scala.version
auf 2.10.2
geändert werden kann.
In den <dependencies>
können dann auch die Versionen für Specs2 und ScalaTest auf die aktuellen Versionen gesetzt werden bzw. die Einträge können gelöscht werden, wenn sie nicht für eines der Projekte benötigt werden.
Anschließend sollten wir die Projekte noch aktualisieren. Dazu wird im Kontextmenü eines Projekts das Menü Maven > Update Project...
aufgerufen.
Jetzt können wir testen, ob alles funktioniert, indem wir im Kontext-Menü des Scala-Projekts Run As > Maven Test
auswählen und warten, bis Maven alle notwendigen Abhängigkeiten aufgelöst und aus dem Internet geladen hat. Es sollten alle Test erfolgreich ausgeführt werden.
Um sich das Leben noch etwas leichter zu machen, können wir in Eclipse dem Scala Projekt auch eine Scala Nature mitgeben. Hierzu müssen wir nur im Kontextmenü Configure > Add Scala Nature
auswählen.
Finale POM-Version
Nach allen oben beschriebenen Änderungen sieht die endgültige Version der POM-Datei im Maven Master Projekt wie folgt aus:
4.0.0
de.praxisit.maven
de.praxisit.maven.test
0.0.1-SNAPSHOT
pom
de.praxisit.maven.test
de.praxisit.maven.scala
1.7
1.7
UTF-8
2.10
2.10.2
org.scala-lang
scala-library
${scala.version}
junit
junit
4.11
test
org.scalatest
scalatest_${scala.tools.version}
2.0.M6-SNAP8
test
net.alchim31.maven
scala-maven-plugin
3.1.3
compile
testCompile
-make:transitive
-dependencyfile
${project.build.directory}/.scala_dependencies
org.apache.maven.plugins
maven-surefire-plugin
2.13
false
true
false
**/*Test.*
**/*Suite.*