Child pages
  • Java HelloWorld mit Maven
Skip to end of metadata
Go to start of metadata

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

1 Comment

  1. Anonymous

    "Hello World" mit Maven ... also, irgendwie ... cool!