Fuse 6 is no longer supported
As of February 2025, Red Hat Fuse 6 is no longer supported. If you are using Fuse 6, please upgrade to Red Hat build of Apache Camel.2.3. Maven-Grundlagen
2.3.1. Überblick
Dieser Abschnitt liefert eine kurze Einführung in einige grundlegende Konzepte von Maven, die Ihnen dabei helfen, die fundamentalen Ideen des Maven Build-Systems zu verstehen.
2.3.2. Build von Lebenszyklus-Phasen
Maven definiert einen Standardsatz von Phasen im Build-Lebenszyklus, wobei die genaue Abfolge von Phasen davon abhängt, für welches Paket der Build erfolgt. Ein JAR-Paket zum Beispiel beinhaltet (unter anderem) die Phasen:
compile
, test
, package
und install
.
Beim Ausführen von Maven wird die Phase in der Regel als ein Argument des
mvn
Befehls festgelegt um anzugeben, wie weit der Build voranschreiten soll. Hier sind ein paar der am häufigsten verwendeten Maven-Befehle:
- Führen Sie den Build des Projekts durch, führen Sie die Einheitentests aus und installieren Sie das resultierende Paket im lokalen Maven Repository:
mvn install
- Bereinigen Sie das Projekt (indem Sie temporäre und intermediäre Dateien löschen):
mvn clean
- Führen Sie den Build des Projekts und die Einheitentests durch:
mvn test
- Build und Installation des Projekts, wobei Einheitentests übersprungen werden:
mvn install -Dmaven.test.skip=true
- Den Build des Projekts im Offline-Modus durchführen
mvn -o install
Der Offline-Modus (ausgewählt durch die-o
Option) ist in denjenigen Fällen hilfreich, in denen Sie wissen, dass Sie bereits alle erforderlichen Abhängigkeiten in Ihrem lokalen Repository haben. Er hindert Maven daran (unnötig) auf Aktualisierungen für SNAPSHOT-Abhängigkeiten zu prüfen, so dass der Build schneller voranschreitet.
2.3.3. Maven-Verzeichnisstruktur
Beispiel 2.1, »Standard Maven Verzeichnislayout« zeigt das Standard-Verzeichnislayout von Maven. Am wichtigsten ist die Maven POM-Datei,
pom.xml
, die den Build für dieses Maven-Projekt konfiguriert.
Beispiel 2.1. Standard Maven Verzeichnislayout
ProjectDir/ pom.xml src/ main/ java/ ... resources/ META-INF/ spring/ *.xml OSGI-INF/ blueprint/ *.xml test/ java/ resources/ target/ ...
Die Java-Quelldateien des Projekts müssen unter
ProjectDir/src/main/java/
gespeichert und alle Ressourcendateien sollten unter ProjectDir/src/main/resources/
gespeichert werden. Insbesondere Spring XML-Dateien (die mit dem Muster *.xml
übereinstimmen) sollten unter dem folgenden Verzeichnis gespeichert werden:
ProjectDir/src/main/resources/META-INF/spring/
Blueprint XML Dateien (die mit dem Muster
*.xml
übereinstimmen), sollten unter dem folgenden Verzeichnis gespeichert werden:
ProjectDir/src/main/resources/OSGI-INF/blueprint/
2.3.4. Konvention vor Konfiguration
Ein wichtiges Prinzip ist bei Maven das der Konvention vor Konfiguration. Dies bedeutet, dass Mavens Funktionen und Plugins mit vernünftigen Standardkonventionen initialisiert werden, so dass die grundlegende Funktionalität von Maven nur wenig oder keine Konfiguration erfordert.
Insbesondere der Speicherort der Dateien innerhalb von Mavens standardmäßigem Verzeichnis-Layout bestimmt effektiv, wie diese verarbeitet werden. Wenn Sie zum Beispiel ein Maven Projekt für den Build eines JAR haben, so werden alle Java-Dateien im
src/main/java
Verzeichnis automatisch kompiliert und dem JAR hinzugefügt. Alle Ressourcen-Dateien im src/main/resources
Verzeichnis werden ebenfalls dem JAR hinzugefügt.
Anmerkung
Obwohl es möglich ist, die Standardkonventionen von Maven zu ändern, wird davon dringend abgeraten. Die Verwendung von nicht standardmäßigen Maven Konventionen macht die Konfiguration Ihrer Projekte schwieriger und schwerer verständlich.
2.3.5. Maven Packtyp
Maven definiert eine Vielfalt an Packtypen, die das Build-Grundverhalten bestimmen. Die gängigsten Packtypen lauten wie folgt:
jar
- (Default) Dieser Packtyp wird für JAR-Dateien verwendet und ist der Standard-Packtyp in Maven.
bundle
- Dieser Packtyp wird für OSGi-Bündel verwendet. Um diesen Packtyp zu verwenden, müssen Sie auch den
maven-bundle-plugin
in der POM-Datei konfigurieren. war
- Dieser Packtyp wird für WAR-Dateien verwendet. Um diesen Packtyp zu verwenden, müssen Sie auch den
maven-war-plugin
in der POM-Datei konfigurieren. pom
- Beim Build mit diesem Packtyp wird die POM-Datei selbst im lokalen Maven-Repository installiert. Dieser Packtyp wird in der Regel für übergeordnete POM-Dateien verwendet.
2.3.6. Maven Artifakte
Das Endprodukt eines Maven-Builds ist ein Maven Artifakt (zum Beispiel eine JAR-Datei). Maven Artifakte werden normalerweise in einem Maven-Repository installiert, von wo aus auf diese zugegriffen werden kann und wo diese als Bausteine für andere Maven-Projekte verwendet werden können (indem sie als Abhängigkeiten deklariert werden).
2.3.7. Maven Koordinaten
Artifakte werden durch einen Tupel von Maven Koordinaten eindeutig identifiziert, die in der Regel aus
groupId:artifactId:version
bestehen. Bei der Bereitstellung eines Maven Artifakts in den Red Hat JBoss Fuse Container, können Sie es mit einem Maven URI der Form mvn:groupId/artifactId/version
referenzieren.
Weitere Informationen zu Maven Koordinaten finden Sie unter Bereitstellung in den Container.
2.3.8. Maven Abhängigkeiten
Die häufigste Änderung, die Sie an der POM-Datei Ihres Projekts werden vornehmen müssen ist das Hinzufügen oder Entfernen von Maven Abhängigkeiten. Eine Abhängigkeit ist einfach eine Referenz zu einem Maven Artifakt (in der Regel eine JAR-Datei), das benötigt wird, um Ihr Projekt auszuführen. Genau genommen übernimmt die Verwaltung der Collection von Abhängigkeiten im Kontext eines Maven Builds den Platz der Verwaltung der Collection von JAR-Dateien in einem Klassenpfad.
Der folgende Schnipsel aus einer POM-Datei zeigt, wie eine Abhängigkeit am
camel-blueprint
Artifakt festgelegt wird:
<project ...> ... <dependencies> <dependency> <groupId>org.apache.camel</groupId> <artifactId>camel-blueprint</artifactId> <version>2.15.1.redhat-621084</version> <scope>provided</scope> </dependency> </dependencies> ... </project>
2.3.9. »dependency« Element
Das
dependency
Element deklariert eine Abhängigkeit vom Maven Artifakt mit Koordinaten org.apache.camel:camel-blueprint:6.2.1.redhat-084
. Sie können so viele dependency
Elemente wie Sie möchten innerhalb des dependencies
Elements hinzufügen.
2.3.10. »dependency/scope« Element
Das
scope
-Element ist optional und liefert zusätzliche Informationen darüber, wann diese Abhängigkeit benötigt wird. Es wird standardmäßig angenommen (mit weggelassenem scope
Element), dass die Abhängigkeit beim Build, dem Testen der Einheit und zur Runtime benötogt wird. Mit am Wert eingestelltem scope
provided
, hängt die Auswirkung davon ab, welche Art von Artifakt erstellt wird:
- OSGi Bündel—(wenn das
packaging
Element von POM alsbundle
festgelegt ist), so hat dieprovided
Bereichseinstellung keine Wirkung.
2.3.11. Transitive Abhängigkeiten
Um die Liste von Abhängigkeiten in Ihrem POM zu vereinfachen und nicht jede einzelne Abhängigkeit explizit auflisten zu müssen, bietet Maven einen rekursiven Algorithmus, um die für Ihr Projekt erforderlichen Abhängigkeiten zu ermitteln.
Wenn Ihr Projekt A zum Beispiel von B1 und B2 abhängt, B1 von C1, C2 und C3 und B2 von D1 und D2 abhängt, so zieht sich Maven zum Zeitpunkt des Build automatisch alle explizit und implizit benötigten Abhängigkeiten und erstellt einen Klassenpfad, der die Abhängigkeiten B1, B2, C1, C2, C3, D1 und D2 beinhaltet. Von diesen Abhängigkeiten erscheinen nur B1 und B2 explizit in As POM-Datei. Der Rest der Abhängigkeiten—die von Maven herausgefunden werden—sind als transitive Abhängigkeiten bekannt.
2.3.12. Maven Repositories
Ein Maven Repository ist ein Ort, an dem Maven nach Artifakten suchen kann. Da Maven Repositorys überall sein können—und das beinhaltet überall im Internet—ist das Maven Build-System inhärent distribuiert. Nachfolgend sehen Sie die Hauptkategorien des Maven Repository:
- Lokales Repository—das lokepale Rository (standardmäßig, gespeichert unter
~/.m2/repository
auf *NIX oderC:\Documents and Settings\UserName\.m2\repository
auf Windows) wird von Maven wie folgt verwendet:- Erster Suchort—das lokale Repository ist der erste Ort, an dem Maven nach einer Abhängigkeit sucht.
- Cache heruntergeladener Abhängigkeiten—jegliche Artifakte, die von einem entfernten Speicherort heruntergeladen wurden, sind dauerhaft im lokalen Repository gespeichert, damit sie schnell abgerufen werden können, wenn sie das nächste Mal benötigt werden.
- Speicher lokal erstellter Artifakte—bei jedem Build eines lokalen Projekts (mittels
mvn install
), wird das resultierende Artifakt in Ihrem lokalen Repository gespeichert.
- Remote Repository—Maven kann auch nach Artifakten in entfernten Repositorys suchen und diese herunterladen. Standardmäßig versucht Maven automatisch ein Artifakt von entfernten Repositorys herunterzuladen, wenn es das Artifakt nicht im lokalen Repository finden kann (Sie können dieses Verhalten durch Festlegen des
-o
Flag unterdrücken—zum Beispielmvn -o install
). - System Repository—(nur Red Hat JBoss Fuse Container; wird nicht vom
mvn
Befehlszeilen-Tool verwendet) zur Runtime kann der Red Hat JBoss Fuse Container auf Artifakte vom JBoss Fuse System Repository unterInstallDir/system/
zugreifen.
Weitere Informationen zu Maven Repositories finden Sie unter Bereitstellung in den Container.
2.3.13. Festlegen entfernter Repositorys
Falls Sie die Maven zugänglichen Remote Repositories anpassen müssen, so müssen Sie zunächst die Speicherorte für die Build- und Runtime Repositorys wie folgt separat konfigurieren:
- Build-Zeitpunkt—um die benutzerdefinierten Repositorys, auf die zum Zeitpunkt des Build zugegriffen werden kann, anzupassen (beim Ausführen des
mvn
Befehls), bearbeiten Sie die Mavensettings.xml
Datei an folgendem Speicherort:- *Nix: standardmäßiger Speicherort ist
~/.m2/settings.xml
. - Windows: standardmäßiger Speicherort ist
C:\Documents and Settings\UserName\.m2\settings.xml
.
- Runtime—um die zur Runtime zugänglichen entfernten Repositorys anzupassen (von innerhalb des Red Hat JBoss Fuse Containers), bearbeiten Sie die Einstellungen der relevanten Eigenschaften in
InstallDir/etc/org.ops4j.pax.url.mvn.cfg
.