Was ist Maven? Build- und Abhängigkeitsmanagement für Java

Apache Maven ist ein Eckpfeiler der Java-Entwicklung und das am häufigsten verwendete Build-Management-Tool für Java. Das optimierte, XML-basierte Konfigurationsmodell von Maven ermöglicht es Entwicklern, die Umrisse eines Java-basierten Projekts schnell zu beschreiben oder zu erfassen, wodurch das Starten und Freigeben neuer Projekte zum Kinderspiel wird. Maven unterstützt auch testgetriebene Entwicklung, langfristige Projektwartung und seine deklarative Konfiguration und die große Auswahl an Plugins machen es zu einer beliebten Option für CI / CD. Dieser Artikel ist eine kurze Einführung in Maven, einschließlich des POM und der Verzeichnisstruktur von Maven sowie Befehle zum Erstellen Ihres ersten Maven-Projekts.

Beachten Sie, dass die neueste Version von Maven zum jetzigen Zeitpunkt Maven 3.6.3 ist.

Maven gegen Ant und Gradle

Maven ist nicht das einzige Build-Tool im Java-Ökosystem, obwohl es das beliebteste ist. Ant, eine frühere Generation von XML-basierten Konfigurationstools, verfügt nicht über die standardisierten, auf Konventionen basierenden Methoden und das Abhängigkeitsmanagement von Maven, bietet jedoch Flexibilität, die Sie mit Maven nicht finden werden. Gradle ist ein neueres Tool, das auf dem Maven-Ökosystem ausgeführt wird (unter Verwendung der Maven-Repositorys), jedoch die Verwendung eines Groovy- oder Kotlin-basierten DSL für die Konfiguration unterstützt. Alle drei sind für sich genommen gute Build-Tools und können jeweils in einen CI / CD-Prozess integriert werden. Was zählt, ist die Auswahl des richtigen für Ihre Bedürfnisse und das Wissen, wie man es richtig einsetzt.

Wie Maven funktioniert

Wie viele großartige Tools nimmt Maven das, was einst überkompliziert war (Konfigurationshölle), und vereinfacht es zu verdaulichen Teilen. Maven besteht aus drei Komponenten:

  • Das POM: Die Datei, die ein Maven-Projekt und seine Abhängigkeiten beschreibt.
  • Das Verzeichnis: Das standardisierte Format zur Beschreibung eines Maven-Projekts im POM.
  • Repositorys: Hier werden Software von Drittanbietern gespeichert und entdeckt.

Das Maven-POM : Jedes Java-Projekt, das Maven verwendet, hat eine POM-Datei (Project Object Model) im Stammverzeichnis. Das pom.xmlbeschreibt die Abhängigkeiten des Projekts und erklärt Ihnen, wie Sie es erstellen. ( Abhängigkeiten sind Software von Drittanbietern, die für das Projekt erforderlich ist. Einige gängige Beispiele sind JUnit und JDBC. Eine Liste aller verfügbaren Tools und gängigen Abhängigkeiten finden Sie im Maven Central Repository.)

Das Maven-Verzeichnis : Das Maven-Verzeichnis implementiert die sogenannte Konvention über die Konfiguration , eine elegante Lösung für die Konfigurationshölle. Anstatt von Entwicklern zu verlangen, das Layout zu definieren und die Komponenten für jedes neue Projekt von Hand zu konfigurieren (wie dies bei makefileund Ant der Fall war ), richtet Maven eine gemeinsame Projektstruktur ein und bietet ein Standarddateiformat zur Beschreibung der Funktionsweise. Sie müssen nur Ihre Anforderungen eingeben, und Maven ruft Abhängigkeiten auf und konfiguriert das Projekt für Sie.

Zentralisierte Repositorys : Schließlich verwendet Maven zentralisierte Repositorys, um Projektpakete als Abhängigkeiten zu erkennen und zu veröffentlichen. Wenn Sie auf eine Abhängigkeit in Ihrem Projekt verweisen, erkennt Maven sie im zentralen Repository, lädt sie in ein lokales Repository herunter und installiert sie in Ihrem Projekt. Meistens ist dies alles für Sie als Entwickler unsichtbar.

Zugriff auf Maven-Abhängigkeiten

Standardmäßig löst Maven Abhängigkeiten aus dem Maven Central Repository auf. Eine gängige Alternative ist JCenter, das über eine größere Auswahl verfügbarer Pakete verfügt. Organisationen veröffentlichen und hosten auch interne Repositorys, die öffentlich oder privat sein können. Um auf ein Repository zuzugreifen, geben Sie dessen URL im Maven POM an oder Sie können Maven anweisen, in anderen Repositorys zu suchen.

Maven installieren

Maven ist ein Java-Projekt. Bevor Sie es installieren, muss das JDK in Ihrer Entwicklungsumgebung installiert sein. (Weitere Informationen zum Herunterladen und Installieren des JDK finden Sie unter "Was ist das JDK? Einführung in das Java Development Kit".)

Sobald Sie Ihre Java-Entwicklungsumgebung eingerichtet haben, können Sie Maven in nur wenigen Schritten installieren:

  1. Laden Sie die neueste Maven-Version herunter (Maven 3.6.3 zum jetzigen Zeitpunkt).
  2. Extrahieren Sie die apache.mavenZIP-Datei an einen geeigneten Ort.
  3. Platzieren Sie diese Datei auf Ihrem Pfad. Zum Beispiel auf einem Unix- oder Linux-System: Exportieren PATH=$PATH:/home/maven/.

Sie sollten jetzt Zugriff auf den mvnBefehl haben. Geben Sie ein mvn -v, um sicherzustellen, dass Sie Maven erfolgreich installiert haben.

Der Maven POM

Das Stammverzeichnis jedes Maven-Projekts ist die pom.xmlDatei. Trotz seines Rufs, langweilig zu sein, funktioniert XML für diesen Anwendungsfall recht gut. Mavens POM ist leicht zu lesen und enthüllt viel von dem, was in einem Projekt vor sich geht. (Wenn Sie mit JavaScript gearbeitet haben, pom.xmlähnelt der Zweck der package.jsonDatei von Node NPM .)

Listing 1 zeigt einen sehr einfachen Maven pom.xml.

Listing 1. Simple Maven POM

   4.0.0 com.javaworld what-is-maven 1.0-SNAPSHOT Simple Maven Project jar   junit junit 4.12 test    

Den Maven POM verstehen

Sobald Sie den Dreh raus haben, ist der POM nicht mehr mysteriös. Zu Beginn können Sie die XML-Präambel überfliegen, die nur auf das offizielle POM-Schema verweist. Beachten Sie jedoch, dass das XML mit beginnt modelVersion. Das sagt Maven, welche Version des POM verwendet werden soll, in diesem Fall Maven POM 4.0.0.

Als nächstes haben Sie groupId, artifactIdund version. Zusammen identifizieren diese drei Attribute jede von Maven verwaltete Ressource im Repository eindeutig. Diese Attribute oben in der Datei beschreiben Ihr Maven-Projekt.

Schauen Sie sich nun den dependenciesAbschnitt des POM an, in dem wir die Abhängigkeiten des Projekts beschreiben. In diesem Fall haben wir bisher nur eine Abhängigkeit gezogen, JUnit. Beachten Sie, dass JUnit auch in Bezug auf seine beschrieben wird groupId, artifactIdund version.

Unabhängig davon, ob Sie Ihr eigenes Projekt oder eine Projektabhängigkeit beschreiben, teilen diese Werte Maven konsistent mit, wo sich ein Projekt im Maven-Repository befindet und welche Version zur Verwendung verfügbar ist.

Hosten Sie Ihr Projekt in einem Maven-Repository

Beachten Sie, dass der POM alles definiert, was Ihr Projekt zum Ausführen benötigt, aber auch Ihr Projekt als potenzielle Abhängigkeit beschreibt. Wenn Sie ein Projekt erstellen, das eine Abhängigkeit darstellt, z. B. eine Bibliothek für andere Projekte erstellen, müssen Sie es auf vier Arten verfügbar machen:

  1. Stellen Sie es lokal zur Verfügung.
  2. Veröffentlichen Sie in einem privat verwalteten Remote-Repository.
  3. In einem Cloud-basierten privaten Repository veröffentlichen.
  4. Veröffentlichen Sie in einem öffentlichen Repository wie Maven Central.

Im ersten Fall verwenden Sie überhaupt kein Remote-Repository. Stattdessen laden andere Entwickler Ihr Projekt mithilfe des mvn installBefehls herunter und installieren es lokal auf ihrem Maven-Repo .

Im zweiten Fall verwenden Sie ein gehostetes Maven-Repository, das einen privat gesteuerten Server zum Veröffentlichen und Herunterladen von Abhängigkeiten verwendet. Dazu benötigen Sie einen Repository-Manager wie Apache Archiva.

Eine neuere Alternative ist die Verwendung eines privaten Remote-Repos, für dessen Verwaltung jedoch ein Cloud-basierter Dienst erforderlich ist, z. B. Cloudsmith. Dies bietet den Vorteil von remote gehosteten Abhängigkeiten, ohne dass ein Repo-Server eingerichtet werden muss. Dieser Service ist natürlich kostenpflichtig.

Schließlich wird ein kleiner Prozentsatz der Projekte im Central Maven Repository oder JCenter landen, die für weit verbreitete öffentliche Pakete vorgesehen sind. Wenn Sie eine Open-Source-Abhängigkeit erstellen, die von anderen verwendet werden soll, benötigen Sie eines dieser zentralen Repositorys, um Ihre Arbeit der Welt zur Verfügung zu stellen.

  • Erfahren Sie mehr über das Hosten Ihres Projekts in einem Maven-Repository und erhalten Sie eine Liste der verfügbaren Repositorys.
  • Weitere Informationen finden Sie in der offiziellen Maven-Dokumentation zum Maven Release Plugin, mit der in einem Maven-Repository veröffentlichte Software vorbereitet und verwaltet wird.

Erstellen Sie das Maven-Paket

Wenn Sie das pom.xmlaus Listing 1 erstellen und in ein Verzeichnis stellen, können Sie Maven-Befehle dagegen ausführen. Maven hat eine Vielzahl von Befehlen und weitere sind über das Plugin verfügbar, aber Sie müssen nur eine Handvoll kennen, um zu starten.

Versuchen Sie für Ihren ersten Befehl die Ausführung mvn package. Obwohl Sie noch keinen Quellcode haben, weist das Ausführen dieses Befehls Maven an, die JUnit-Abhängigkeit herunterzuladen. Sie können die Protokollausgabe von Maven überprüfen, um festzustellen, ob die Abhängigkeit geladen wurde.

Abhängigkeitsbereich

Möglicherweise haben Sie bemerkt, dass die JUnit-Abhängigkeit im Beispiel-POM als markiert ist scope test. Der Bereich ist ein wichtiges Konzept im Abhängigkeitsmanagement, mit dem Sie im Wesentlichen definieren und begrenzen können, wie jede Abhängigkeit in Ihrem Projekt aufgerufen und verwendet wird. Der testBereich stellt sicher, dass die Abhängigkeit verfügbar ist, wenn Tests ausgeführt werden, jedoch nicht, wenn die App für die Bereitstellung gepackt ist.

Ein weiterer gängiger Bereich ist der provided, der dem Framework mitteilt, dass die Abhängigkeit von der Laufzeitumgebung bereitgestellt wird. Dies tritt häufig bei Servlet-JARS auf, wenn sie in einem Servlet-Container bereitgestellt werden, da der Container diese JARS bereitstellt. In der Apache Maven-Dokumentation finden Sie eine vollständige Liste der Maven-Abhängigkeitsbereiche.

Mavens Verzeichnisstruktur

Wenn der Befehl ausgeführt wird, beachten Sie, dass Maven ein /targetVerzeichnis erstellt hat. Dies ist der Standardspeicherort für die Ausgabe Ihres Projekts. Abhängigkeiten, die Sie heruntergeladen haben, befinden sich /targetzusammen mit Ihren kompilierten Anwendungsartefakten im Verzeichnis.

Als nächstes möchten Sie eine Java-Datei hinzufügen, die Sie im Maven- src/Verzeichnis ablegen . Erstellen Sie eine /src/main/java/com/javaworld/Hello.javaDatei mit dem Inhalt von Listing 2.

Listing 2. Hello.java

 com.javaworld public class Hello { public static void main(String[] args){ System.out.println("Hello, JavaWorld"); } } 

Der /srcPfad ist der Standardspeicherort für die Quelldateien Ihres Projekts. Die meisten Projekte legen ihre Hauptdateien ab /src/main/, wobei Java-Dateien in den Klassenpfad unter verschoben werden /java. Wenn Sie Assets einschließen möchten, die kein Code sind, wie Konfigurationsdateien oder Bilder, können Sie diese außerdem verwenden /src/main/resources. Assets in diesem Pfad werden dem Hauptklassenpfad hinzugefügt. Testdateien gehen in /src/test/java.

Im Folgenden finden Sie einige wichtige Teile einer Maven-Projektstruktur (wie in der Maven-Standardverzeichnisstruktur definiert):

Wichtige Teile der Maven Standard Directory Structure

pom.xml Die Projektdeskriptordatei
/ src / main / java Speicherort der Quelldateien
/ src / main / resources Standort von Vermögenswerten außerhalb der Quelle
/ src / test / java Speicherort der Testquelldateien
/Ziel Speicherort der Build-Ausgabe

Verwalten Ihres Maven-Projekts

Der mvn packageBefehl weist Maven an, das Projekt zu bündeln. Setzen Sie diesen Befehl ab, wenn Sie bereit sind, alle Ihre Projektdateien an einem Ort zu sammeln. Denken Sie daran, dass wir in der POM-Datei für dieses Projekt den Verpackungstyp auf festgelegt jarhaben. Dieser Befehl weist Maven an, die Anwendungsdateien in eine JAR zu packen.

Maven bietet eine Vielzahl zusätzlicher Optionen, um zu steuern, wie die JAR verwaltet wird, ob es sich um eine fette oder eine dünne JAR handelt, und um eine ausführbare Datei anzugeben mainclass. Weitere Informationen zur Dateiverwaltung in Maven finden Sie in den Maven-Dokumenten.

Nachdem Sie ein Projekt gebündelt haben, möchten Sie wahrscheinlich ein mvn install. Dieser Befehl verschiebt das Projekt in das lokale Maven-Repository. Sobald es sich im lokalen Repository befindet, steht es anderen Maven-Projekten in Ihrem lokalen System zur Verfügung. Dies ist nützlich für Entwicklungsszenarien, in denen Sie und / oder Ihr Team Abhängigkeits-JARs erstellen, die noch nicht in einem zentralen Repository veröffentlicht wurden.

Zusätzliche Maven-Befehle

Geben mvn testSie ein, wenn Sie bereit sind, Unit-Tests auszuführen, die Sie im /src/java/testVerzeichnis definiert haben .

Geben mvn compileSie ein, wenn Sie bereit sind, die Klassendateien des Projekts zu kompilieren. Wenn Sie ein Hot-Deployment-Setup ausführen, löst dieser Befehl den Hot-Deploying-Klassenladeprogramm aus. (Das Hot-Deploy-Tool mvn spring-boot:runüberwacht - wie der Befehl von Spring Boot - die Klassendateien auf Änderungen, und beim Kompilieren werden Ihre Quelldateien kompiliert, und die ausgeführte Anwendung spiegelt diese Änderungen wider.)

Ein neues Projekt starten: Archetypen in Maven und Spring

Ein Maven-Archetyp ist eine Vorlage zum Starten neuer Projekte basierend auf einer Vielzahl vordefinierter Einstellungen. Jeder Archetyp bietet vorgefertigte Abhängigkeiten, z. B. für ein Java EE- oder Java-Webanwendungsprojekt. Sie können auch einen neuen Archetyp aus einem vorhandenen Projekt erstellen und dann schnell neue Projekte basierend auf diesen vordefinierten Layouts erstellen. Weitere Informationen zu Apache Maven-Archetypen finden Sie in den Maven-Dokumenten.

Das Spring-Framework, das gut mit Maven zusammenarbeitet, bietet zusätzliche, ausgefeilte Funktionen zum Stubben neuer Projekte. Beispielsweise ist Spring Initializr ein Tool, mit dem Sie sehr schnell die gewünschten Elemente in einer neuen App definieren können. Initializr ist per se kein Maven-Archetyp, dient jedoch dem gleichen Zweck, ein Projektlayout auf der Grundlage von Vorabspezifikationen zu erstellen. In Initializr können Sie mvn archetype:generatedie Optionen eingeben und durchsuchen, um einen Archetyp zu finden, der für das, was Sie erstellen, geeignet ist.

Abhängigkeiten hinzufügen