Maven installieren
Zunächst müssen Java und Maven installiert werden. Java erhält man von http://java.sun.com, Maven von http://maven.apache.org/download.html
.
HelloWorld Application generieren
Ein beliebter Einstieg in eine Programmiersprache ist das "HelloWorld" Programm. Das ist das einfachstmögliche Programm, das den Text "Hello, world!" auf der Konsole ausgibt. Im allgemeinen ist es nur wenige Zeilen lang. In Basic heißt es etwa
10 PRINT "Hello, world!"
.
In Java ist das schon komplizierter, hier sieht es so aus:
Datei App.java: package de.schirmacher; public class App { public static void main( String[] args ) { System.out.println( "Hello World!" ); } }
Der Java Source Code muss erstmal kompiliert werden. Dazu wird der Java Compiler javac
benötigt. Dieses Programm ist in der Java Runtime Installation nicht enthalten, also darauf achten, dass man sich das JDK installiert, und nicht nur die Rava Runtime (JRE). Weiterhin ist bei Java stets auf Groß- und Kleinschreibung zu achten, auch unter Windows. Wenn man ein "package" verwendet, dann muss außerdem die Ordner-Hierarchie mit der Package-Hierarchie übereinstimmen.
javac de/schirmacher/App.java java de.schirmacher.App Hello World!
Das war ja ziemlich einfach. Aber heutzutage schreibt man selbst ein "HelloWorld"-Programm nicht mehr selbst, sondern man lässt es sich generieren. Maven kennt dazu die Befehle archetype:create
(veraltet) bzw. archetype:generate
, die einem eine komplette Directorystruktur aufsetzen, mit allem, was dazugehört. Einschließlich o.a. "HelloWorld"-Programm.
Maven benötigt noch zwei zusätzliche Parameter namens groupId
und artifactId
. Die artifactId
ist üblicherweise der Name des Programms oder Moduls, die groupId
ist meistens eine übergeordnete Bezeichnung wie ein Firmen- oder Projektname. Da die groupId
weltweit eindeutig sein sollte, hat sich also Konvention die Verwendung eines Domainnamens eingebürgert.
Wir wechseln also in ein geeignetes Verzeichnis und starten Maven. Es werden nun etliche MByte an Bibliotheken, Plugins und dergleichen gedownloadet. Sodann wird einem ein erschreckend umfangreiches Auswahlmenü angeboten, aber wir brauchen erstmal nur die angebotenen Defaults mit return
bestätigen. Der archetype:create
-Befehl generiert denselben Output, ist aber veraltet, weil es jetzt ja den komplizierteren archetype:generate
-Befehl gibt, der noch viel mehr kann (dazu später mehr).
cd dev mvn archetype:generate -DgroupId=de.schirmacher -DartifactId=helloworld [INFO] Scanning for projects... [INFO] Searching repository for plugin with prefix: 'archetype'. [INFO] org.apache.maven.plugins: checking for updates from central [INFO] org.codehaus.mojo: checking for updates from central [INFO] artifact org.apache.maven.plugins:maven-archetype-plugin: checking for updates from central Downloading: http://repo1.maven.org/maven2/org/apache/maven/plugins/maven-archetype-plugin/2.0-alpha-4/maven-archetype-plugin-2.0-alpha-4.pom 4K downloaded Downloading: http://repo1.maven.org/maven2/org/apache/maven/archetype/maven-archetype/2.0-alpha-4/maven-archetype-2.0-alpha-4.pom 13K downloaded Downloading: http://repo1.maven.org/maven2/org/apache/maven/maven-parent/9/maven-parent-9.pom 32K downloaded Downloading: http://repo1.maven.org/maven2/org/apache/apache/4/apache-4.pom 4K downloaded Downloading: http://repo1.maven.org/maven2/org/apache/maven/plugins/maven-archetype-plugin/2.0-alpha-4/maven-archetype-plugin-2.0-alpha-4.jar 63K downloaded [INFO] ------------------------------------------------------------------------ [INFO] Building Maven Default Project [INFO] task-segment: [archetype:generate] (aggregator-style) [INFO] ------------------------------------------------------------------------ [INFO] Preparing archetype:generate [INFO] No goals needed for project - skipping Downloading: http://repo1.maven.org/maven2/org/apache/maven/archetype/archetype-common/2.0-alpha-4/archetype-common-2.0-alpha-4.pom 15K downloaded Downloading: http://repo1.maven.org/maven2/org/apache/maven/maven-core/2.0.8/maven-core-2.0.8.pom 6K downloaded Downloading: http://repo1.maven.org/maven2/org/apache/maven/maven/2.0.8/maven-2.0.8.pom 11K downloaded Downloading: http://repo1.maven.org/maven2/org/apache/maven/maven-parent/6/maven-parent-6.pom 19K downloaded ... Choose archetype: 1: internal -> appfuse-basic-jsf (AppFuse archetype for creating a web application with Hibernate, Spring and JSF) 2: internal -> appfuse-basic-spring (AppFuse archetype for creating a web application with Hibernate, Spring and Spring MVC) 3: internal -> appfuse-basic-struts (AppFuse archetype for creating a web application with Hibernate, Spring and Struts 2) 4: internal -> appfuse-basic-tapestry (AppFuse archetype for creating a web application with Hibernate, Spring and Tapestry 4) 5: internal -> appfuse-core (AppFuse archetype for creating a jar application with Hibernate and Spring and XFire) 6: internal -> appfuse-modular-jsf (AppFuse archetype for creating a modular application with Hibernate, Spring and JSF) 7: internal -> appfuse-modular-spring (AppFuse archetype for creating a modular application with Hibernate, Spring and Spring MVC) 8: internal -> appfuse-modular-struts (AppFuse archetype for creating a modular application with Hibernate, Spring and Struts 2) 9: internal -> appfuse-modular-tapestry (AppFuse archetype for creating a modular application with Hibernate, Spring and Tapestry 4) 10: internal -> maven-archetype-j2ee-simple (A simple J2EE Java application) 11: internal -> maven-archetype-marmalade-mojo (A Maven plugin development project using marmalade) 12: internal -> maven-archetype-mojo (A Maven Java plugin development project) 13: internal -> maven-archetype-portlet (A simple portlet application) 14: internal -> maven-archetype-profiles () 15: internal -> maven-archetype-quickstart () 16: internal -> maven-archetype-site-simple (A simple site generation project) 17: internal -> maven-archetype-site (A more complex site project) 18: internal -> maven-archetype-webapp (A simple Java web application) 19: internal -> jini-service-archetype (Archetype for Jini service project creation) 20: internal -> softeu-archetype-seam (JSF+Facelets+Seam Archetype) 21: internal -> softeu-archetype-seam-simple (JSF+Facelets+Seam (no persistence) Archetype) 22: internal -> softeu-archetype-jsf (JSF+Facelets Archetype) 23: internal -> jpa-maven-archetype (JPA application) 24: internal -> spring-osgi-bundle-archetype (Spring-OSGi archetype) 25: internal -> confluence-plugin-archetype (Atlassian Confluence plugin archetype) 26: internal -> jira-plugin-archetype (Atlassian JIRA plugin archetype) 27: internal -> maven-archetype-har (Hibernate Archive) 28: internal -> maven-archetype-sar (JBoss Service Archive) 29: internal -> wicket-archetype-quickstart (A simple Apache Wicket project) 30: internal -> scala-archetype-simple (A simple scala project) 31: internal -> lift-archetype-blank (A blank/empty liftweb project) 32: internal -> lift-archetype-basic (The basic (liftweb) project) 33: internal -> cocoon-22-archetype-block-plain ([http://cocoon.apache.org/2.2/maven-plugins/]) 34: internal -> cocoon-22-archetype-block ([http://cocoon.apache.org/2.2/maven-plugins/]) 35: internal -> cocoon-22-archetype-webapp ([http://cocoon.apache.org/2.2/maven-plugins/]) 36: internal -> myfaces-archetype-helloworld (A simple archetype using MyFaces) 37: internal -> myfaces-archetype-helloworld-facelets (A simple archetype using MyFaces and facelets) 38: internal -> myfaces-archetype-trinidad (A simple archetype using Myfaces and Trinidad) 39: internal -> myfaces-archetype-jsfcomponents (A simple archetype for create custom JSF components using MyFaces) 40: internal -> gmaven-archetype-basic (Groovy basic archetype) 41: internal -> gmaven-archetype-mojo (Groovy mojo archetype) Choose a number: (1/2/3/4/5/6/7/8/9/10/11/12/13/14/15/16/17/18/19/20/21/22/23/24/25/26/27/28/29/30/31/32/33/34/35/36/37/38/39/40/41) 15: : [INFO] artifact org.apache.maven.archetypes:maven-archetype-quickstart: checking for updates from central Downloading: http://repo1.maven.org/maven2/org/apache/maven/archetypes/maven-archetype-quickstart/1.0/maven-archetype-quickstart-1.0.jar 4K downloaded Define value for version: 1.0-SNAPSHOT: : Confirm properties configuration: groupId: de.schirmacher artifactId: helloworld version: 1.0-SNAPSHOT package: de.schirmacher Y: : [INFO] ---------------------------------------------------------------------------- [INFO] Using following parameters for creating OldArchetype: maven-archetype-quickstart:RELEASE [INFO] ---------------------------------------------------------------------------- [INFO] Parameter: groupId, Value: de.schirmacher [INFO] Parameter: packageName, Value: de.schirmacher [INFO] Parameter: package, Value: de.schirmacher [INFO] Parameter: artifactId, Value: helloworld [INFO] Parameter: basedir, Value: C:\dev [INFO] Parameter: version, Value: 1.0-SNAPSHOT [INFO] ********************* End of debug info from resources from generated POM *********************** [INFO] OldArchetype created in dir: C:\dev\helloworld [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESSFUL [INFO] ------------------------------------------------------------------------ [INFO] Total time: 2 minutes 30 seconds [INFO] Finished at: Fri Sep 11 09:27:34 CEST 2009 [INFO] Final Memory: 8M/15M [INFO] ------------------------------------------------------------------------ C:\dev>
Nach einer gewissen Wartezeit und dem Download von etlichen MByte wird ein Directory mit allen für Maven erforderlichen Dateien angelegt. Wir können jetzt unser HelloWorld Programm automatisch testen und bauen. Dazu wechseln wir in das neu generierte Verzeichnis und geben mvn package
ein. Dieser Vorgang lädt einige weitere MByte, führt ggf. vorhandenen Test-Code aus und erzeugt ein distributable:
C:\dev>cd helloworld C:\dev\helloworld>mvn package [INFO] Scanning for projects... [INFO] ------------------------------------------------------------------------ [INFO] Building helloworld [INFO] task-segment: [package] [INFO] ------------------------------------------------------------------------ Downloading: http://repo1.maven.org/maven2/org/apache/maven/plugins/maven-resources-plugin/2.2/maven-resources-plugin-2.2.pom 1K downloaded Downloading: http://repo1.maven.org/maven2/org/apache/maven/plugins/maven-plugins/1/maven-plugins-1.pom 3K downloaded Downloading: http://repo1.maven.org/maven2/org/apache/maven/maven-parent/1/maven-parent-1.pom 6K downloaded Downloading: http://repo1.maven.org/maven2/org/apache/apache/1/apache-1.pom 3K downloaded Downloading: http://repo1.maven.org/maven2/org/apache/maven/plugins/maven-resources-plugin/2.2/maven-resources-plugin-2.2.jar 13K downloaded Downloading: http://repo1.maven.org/maven2/org/apache/maven/plugins/maven-compiler-plugin/2.0.2/maven-compiler-plugin-2.0.2.pom 2K downloaded Downloading: http://repo1.maven.org/maven2/org/apache/maven/plugins/maven-plugins/8/maven-plugins-8.pom 5K downloaded Downloading: http://repo1.maven.org/maven2/org/apache/maven/maven-parent/5/maven-parent-5.pom 14K downloaded Downloading: http://repo1.maven.org/maven2/org/apache/maven/plugins/maven-compiler-plugin/2.0.2/maven-compiler-plugin-2.0.2.jar 17K downloaded Downloading: http://repo1.maven.org/maven2/org/apache/maven/plugins/maven-surefire-plugin/2.4.2/maven-surefire-plugin-2.4.2.pom 6K downloaded Downloading: http://repo1.maven.org/maven2/org/apache/maven/surefire/surefire/2.4.2/surefire-2.4.2.pom 6K downloaded Downloading: http://repo1.maven.org/maven2/org/apache/maven/maven-parent/7/maven-parent-7.pom 20K downloaded Downloading: http://repo1.maven.org/maven2/org/apache/maven/plugins/maven-surefire-plugin/2.4.2/maven-surefire-plugin-2.4.2.jar 21K downloaded ... [INFO] Surefire report directory: C:\dev\helloworld\target\surefire-reports ------------------------------------------------------- T E S T S ------------------------------------------------------- Running de.schirmacher.AppTest Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.031 sec Results : Tests run: 1, Failures: 0, Errors: 0, Skipped: 0 ... [INFO] [jar:jar] [INFO] Building jar: C:\dev\helloworld\target\helloworld-1.0-SNAPSHOT.jar [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESSFUL [INFO] ------------------------------------------------------------------------ [INFO] Total time: 33 seconds [INFO] Finished at: Fri Sep 11 10:13:57 CEST 2009 [INFO] Final Memory: 7M/18M [INFO] ------------------------------------------------------------------------
Das Programm kann nun mit folgendem Befehl gestartet werden:
java -cp target/helloworld-1.0-SNAPSHOT.jar de.schirmacher.App Hello World!
Es geht allerdings noch etwas einfacher, indem man in der jar-Datei die Information ablegt, welche Klasse beim Aufruf zu starten ist. Dazu werden folgende zusätzliche Informationen in der pom.xml
-Datei benötigt, und zwar gleich hinter den <dependencies>
-Abschnitt:
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <configuration> <archive> <manifest> <mainClass>de.schirmacher.App</mainClass> <addClasspath>true</addClasspath> </manifest> </archive> </configuration> </plugin> </plugins> </build>
Jetzt kann man das HelloWorld-Programm mit java -jar target/helloworld-1.0-SNAPSHOT.jar
oder auch mit Doppelklick (abhängig von der Systemkonfiguration) starten.
Falls die jar-Datei kein Manifest enthält, gibt es den folgenden Fehler:
Failed to load Main-Class manifest attribute from helloworld-1.0-SNAPSHOT.jar