In 4 Schritten minimale Java Web Applikation mit Maven generieren

11 Juli, 2009 - 12:15

Für ein anderes Tutorial benötigte ich eine ganz einfache Java Web Applikation. Die Web Applikation sollte über keine Logik verfügen, sondern lediglich eine einfache JSP Seite zurückgeben. Die Erstellung solch einer Java Web Applikation gelingt Dank Maven innerhalb weniger Minuten. Getestet habe ich dieses Tutorial auf einem aktuellem 64Bit Ubuntu Linux.

Schritt 1 - Maven installieren

Im ersten Schritt muss man Maven installieren. Maven ist ein Satz von Werkzeugen zur Verwaltung von Softwarebauprozessen. Maven wird über Konfigurationsdateien (pom.xml) gesteuert und von der Kommandozeile aus angestoßen. Die Installation auf einem aktuellen Ubuntu System ist denkbar einfach und gelingt mit folgendem Befehl auf der Kommandozeile:

user@hostname$ sudo aptitude install maven2

Den Erfolg der Installation kann man durch folgenden Befehl auf der Kommandozeile überprüfen:

user@hostname$ mvn -v
Maven version: 2.0.9
Java version: 1.6.0_13
OS name: "linux" version: "2.6.28-13-generic" arch: "amd64" Family: "unix"

Erhält man die gezeigte Ausgabe, war die Installation erfolgreich.

Unter Windows verläuft die Installation sehr ähnlich. Man lädt sich das entsprechende Paket von der Maven Homepage und installiert es. Anschließend muss man lediglich noch darauf achten, dass das Verzeichnis, welches die mvn Programmdatei enthält, im Suchpfad (PATH) enthalten ist. Den Suchpfad kann man über die Systemsteuerung konfigurieren.

Schritt 2 - Quelldateien generieren

Nun kann man auch schon die Java Web Applikation von Maven generieren lassen. Dazu nutzt man prinzipiell folgenden Befehl:

user@hostname$ mvn archetype:create -DgroupId=XYZ -DartifactId=ABC -DarchetypeArtifactId=maven-archetype-webapp

Puh, auf den ersten Blick sieht dies mächtig komplex aus, doch was passiert hier genau? Maven (mvn) ruft den create Befehl des archetype Plugins auf. Alle anderen Angaben sind lediglich Parameter für dieses Plugin und den create Befehl. Die Parameter werden als Java Kommandozeilenparameter in der Form

-Dparameter=wert

übergeben. Für den create Befehl des archetype Plugins werden im obigen Beispiel die folgenden 3 Parameter übergeben:

  • groupId - der Paketname für unser Projekt
  • artifactId - der Projektname
  • archetypeArtifactId - die vom create Befehl zu verwendende Vorlage (Template); Würden wir diesen Parameter weglassen, würde der create Befehl standardmäßig ein einfaches Java Projekt erzeugen und keine Java Web Applikation.

Bevor wir den Befehl ausführen, sollten wir sinnvolle Namen für die Parameter groupId und artifactId auswählen. Als groupId könnte man zum Beispiel den Domainnamen verwenden, unter dem später die Web Applikation erreichbar sein sollte. Die einzelnen Bestandteile des Domainnamen gibt man dabei in umgekehrter Reihenfolge an.

In diesem einfachen Beispiel ist der Wert des artifactId Parameters wichtiger, denn der Wert wird als Verzeichnisname für das Projekt genutzt. Später wird die Web Applikation auch über die URL http://localhost:8080/artifactID erreichbar sein. 

Nachdem wir die Bedeutung aller Parameter geklärt haben, können wir nun den Befehl mit folgenden Angaben ausführen:

user@hostname$ mvn archetype:create -DgroupId=com.soa-bpm-integration.webapp-expl -DartifactId=webapp-expl_web -DarchetypeArtifactId=maven-archetype-webapp

Die ersten Aufrufe von Maven werden einige Zeit benötigen, denn Maven lädt nun die notwendigen Plugins herunter. So muss Maven zum Beispiel erst einmal das archetype Plugin samt der verschiedenen Befehle nachladen.

Nachdem der Befehl ausgeführt wurde, hat man folgende neue Verzeichnisstruktur:

  • webapp-expl_web
    • src
      • main
        • resources
        • webapp
          • WEB-INF
            • web.xml
          • index.jsp
    • pom.xml

Die gesamte Verzeichnisstruktur sowie der Inhalt der 3 Dateien (web.xml, index.jsp und pom.xml) wurde von Maven automatisch ohne manuelle Eingriffe generiert. Die Dateien sind so vollständig, dass wir im nächsten Schritt automatisch die ausführbare und deploybare Java Web Applikation generieren können.

Schritt 3 - WAR Archiv erzeugen

Im vorherigen Schritt haben wir die Projektstruktur der Java Web Applikation samt aller notwendigen Quell- und Konfigurationsdateien durch Maven erzeugt. Nun müssen wir die Java Web Applikation noch kompilieren und die zugehörige WAR Datei erzeugen. Für unser obiges Beispiel, geht dies wiederum mit einem einzigen Maven Befehl. Bevor der Befehl ausgeführt werden kann, müssen wir in das Verzeichnis wechseln, in dem sich die pom.xml Datei befindet.

user@hostname$ mvn package

Beim ersten Aufruf dieses Befehls wird Maven wieder eine Reihe von Dateien aus dem Internet runterladen müssen. Nachdem der Befehl ausgeführt wurde, enthält das Hauptverzeichnis ein neues Unterverzeichnis target/. In diesem ist die kompilierte und archivierte Java Web Applikation abgelegt. Im folgenden Verzeichnisbaum wurde das Quellverzeichnis (src/) zur besseren Übersicht zugeklappt, aber es kann durch einen Klick auf den Verzeichnisbaum aufgeklappt werden.

  • webapp-expl_web
    • src
      • main
        • resources
        • webapp
          • WEB-INF
            • web.xml
          • index.jsp
    • target
      • classes
      • war
        • work
          • webapp-cache.xml
      • webapp-expl_web
        • META-INF
        • WEB-INF
          • classes
          • web.xml
        • index.jsp
      • webapp-expl_web.war
    • pom.xml

An dieser Stelle könnten wir das Tutorial eigentlich beenden. Die webapp-expl_web.war Datei kann nun auf einem beliebigen Java Servlet Container wie Apache Tomcat installiert werden. Gerade im Entwicklungszyklus wäre es aber sehr umständlich, wenn man jedesmal von Hand die Datei im Applikationsserver installieren müsste. Hier kann Maven wiederum behilflich sein, wie der nächste Schritt zeigt.

Schritt 4 - Java Web Applikation mit Jetty testen

Für Maven gibt es ein Jetty Plugin. Damit kann man direkt aus einem Maven Aufruf heraus die zuvor erzeugte Web Applikation in eine Jetty Instanz laden. Damit das funktioniert, muss die pom.xml Datei händisch erweitert werden. Bis zu diesem Zeitpunkt haben wir keinen einzigen manuellen Eingriff vorgenommen! Die vollständige pom.xml Datei sieht folgendermaßen aus.


  4.0.0
  com.soa-bpm-integration.webapp-expl
  webapp-expl_web
  war
  1.0-SNAPSHOT
  webapp-expl_web Maven Webapp
  http://maven.apache.org
  
    
      junit
      junit
      3.8.1
      test
    
  
  
    webapp-expl_web
      
      
        
          org.mortbay.jetty
          maven-jetty-plugin
        
      
      
  

In der gezeigten pom.xml Datei wurden lediglich die Zeilen 19 bis 26 händisch eingefügt. Mit diesen Zeilen wird ausgedrückt, dass während der Build Phase von Maven das Plugin Jetty zu laden ist. Jetzt kann man genau dieses Jetty Plugin mit folgendem Maven Befehl aufrufen.

user@hostname$ mvn jetty:run

Maven startet nun eine lokale Jetty Instanz und deployt die Web Applikation auf diesem Server. Dieser Vorgang ist abgeschlossen, wenn folgende Ausgabe erscheint.

[INFO] Started Jetty Server

Man kann nun die eigene Web Applikation im Browser aufrufen unter der URL: http://localhost:8080/artifactId. Dabei ist natürlich artifactId durch den Wert zu ersetzen, den man in Schritt 2 dafür verwendet hat. In unserem Beispiel müsste man also die URL http://localhost:8080/webapp-expl_web/ aufrufen.

Wenn alles geklappt hat, erhält man eine "Hello World" Seite. Der Inhalt dieser Seite wird natürlich aus der index.jsp Datei gesteuert.

Die Abhängigkeit auf Jetty hat keinen negativen Einfluss auf die Web Applikation. Möchte man zum Beispiel nur das Web Archiv (WAR) erzeugen, führt man den mvn package Befehl aus. Die Maven Build Phase kommt nach der Package Phase und hat damit keinen Einfluss auf die Erstellung des Web Archivs.

Dieses Tutorial hat natürlich nur an einem ganz einfachen Beispiel gezeigt, wie man mit Maven eine Web Applikation generieren kann. Dieses Beispiel lässt sich nun beliebig komplex ausbauen. Bei Gelegenheit werden wir hier auf weitere Möglichkeiten eingehen, etwa wie man das Maven Projekt in verschiedene Teilprojekte aufteilt oder wie man ein Web Framework wie Spring und Struts einbinden kann.counter


Kommentare

groupId und artifactId statt groupid und artifactid für das Jetty-Plugin.
Kommt sonst ein
"Parse error reading POM. Reason: Unrecognised tag: 'groupid' (position: START_TAG seen ...\n\n... @22:10) for project unknown [...]".

Ansonsten nettes Tutorial. Danke!

Uh, interessant. Unter Linux hat er mir das XML so generiert, aber tatsächlich steht in der zugehörigen XSD groupId. Scheint also auch am Parser und der Plattform zu liegen, wie er den XML Code akzeptiert.