michi's log

Java Web Start Tutorial

with 4 comments

Einleitung

Java Web Start ist eine tolle Sache um Java Programme über das Internet zu verteilen um sie auf Clientrechnern starten zu können. Einer der großen Vorteile ist es, dass keine Installationsdateien vom Benutzer heruntergeladen werden müssen, sondern ein Klick auf einen Link genügt um die Anwendung zu starten. Vorausgesetzt natürlich, dass die Java Runtime installiert worden ist. Für den Benutzer ist alles so einfach wie möglich gehalten, für den Entwickler gibt es aber ein paar Dinge die man wissen muss um Web Start zum laufen zu bringen. Im folgenden gibt es eine Anleitung um das erste Web Start fähige Programm zu schreiben.

1. Die Anwendung

Im Prinzip eignet sich jede Java Anwendung um sie Web Start fähig zu machen. Man muss nur beachten, dass das Programm später in einer Sandbox auf dem Clientrechner läuft und es somit nicht möglich ist auf die Festplatte und damit auf diverse Dateien zuzugreifen. Stattdessen sollte man alle Dateien auf die man während der Programmlaufzeit zugreifen möchte in JAR Dateien speichern. Um von einem Java Programm aus auf eine JAR Datei zuzugreifen kann man folgenden Mechanismus verwenden:

String input = ... ;
InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream(input);

Auf den ersten Blick sieht das im Vergleich zu:

String input = ... ;
File f = new File(input);

etwas kompliziert aus jedoch ist dies nötig, da Java aus sicherheitstechnischen Aspekten 1. verbietet auf Dateien direkt zuzugreifen und 2. einen sicheren Classloader verwendet. Genau diesen ClassLoader benutzen wir durch die Zeilen oben für unsere Resourcen.

2. Die JAR Dateien

Alle Java Anwendungen die Web Start fähig sein sollen müssen in JAR Dateien ausgeliefert werden. Um diese zu erzeugen gibt es das Programm jar, dass von der Kommandozeile aus aufgerufen werden kann:

jar cf beispielJAR.jar bild.jpg

Dies erstellt eine neue JAR Datei (Argument c) und fügt die angegebene Datei dem Archiv hinzu (Argument f). Eine komplette Übersicht über alle Argumente gibt es zum Beispiel hier.
Eine der ausgelieferten JAR Dateien muss ausführbar sein. Dafür muss in der JAR Datei ein Manifest enthalten sein. Ein sehr einfaches Manifest sieht z.B. so aus:


Manifest-Version: 1.0
Main-Class: de.test.TestApp
Class-Path: lib/input.jar

Das Main-Class Attribut legt fest welche Klasse im JAR ausgeführt werden soll. Diese Klasse muss eine Methode public void main(String [] argv) haben.
Das Manifest speichert man sich am besten als txt Datei im Projekt Verzeichnis. Um es einer bestehenden JAR Datei anzufügen genügt es

jar ufm beispielJAR.jar manifest.txt

auf der Kommandozeile aufzurufen.

Java benutzt weiterhin einen dritten Sicherheitsmechanismus: Alle benutzten JAR Dateien, also solche die den Quellcode enthalten und solche die Resourcen oder Bibliotheken enthalten müssen signiert sein. Jeder der schon ein Web Start Programm ausgeführt hat kennt das: zu Beginn muss der Benutzer entscheiden ob er der Quelle des Programms vertraut und das Programm wirklich ausführen will. Dies kann er anhand von der mitgelieferten Signatur überprüfen.
Als Entwickler muss man natürlich erst einmal eine solche Signatur erzeugen. In der JDK sind die hierfür benötigten Programme schon mitgeliefert.

Als erstes braucht man ein Programm namens keytool. Mit diesem Programm legt man einen sogenannten “key store” an in dem alle verwendeten Schlüssel gespeichert sind mit denen man später dann die JAR Dateien signieren kann. Das geht so:

keytool -genkey -keystore beispielKeyStore -alias beispielName

Das Programm fragt nach den Passwörtern und legt eine Datei namens beispielKeyStore im aktuellen Verzeichnis an.
Um mit den angelegten Schlüsseln eine JAR Datei zu signieren genügt eine weitere Zeile mit einem zweiten Programm das jarsigner heisst:

jarsigner -keystore beispielKeyStore -storepass keyStorePasswort -keypass aliasPassword beispielJAR.jar beispielName

So verfährt man mit allen weiteren JAR Dateien im Projekt. Eine genaue Beschreibung des Programms keytool findet man hier: für Windows und Linux/Solaris.

3. Die jnlp Dateien

Nun wird noch in einer jnlp Datei spezifiziert welche JARs tatsächlich zum Programm gehören, wo man diese runterladen kann, welche Java Version dafür benötigt wird und so weiter. Diese Datei ist in XML und kann beispielsweise so aussehen:

<?xml version=\"1.0\" encoding=\"UTF-8\"?>
  <jnlp  spec="1.0+"  
	codebase="http://www.beispiel.de/webstart/"  
	href="beispiel.jnlp">
 <information>
 	<title>test</title>
	<vendor>quixotic project</vendor>
	<homepage href="http://www.beispiel.de"/>
	<description>test</description>
	<description kind="short">einfaches web start beispiel</description>
	<icon href="icon.gif"/> <icon kind="splash" href="splash.gif"/>
	<offline-allowed/>
 </information>
 <security>
 	<all-permissions/>
 </security>
 <resources>
 	<j2se href="http://java.sun.com/products/autodl/j2se" version="1.5+"/>
	<jar href="beispielJAR.jar"/> <jar href="beispiel_resources.jar"/>
 </resources>
 <resources os="Windows">
 	<j2se href="http://java.sun.com/products/autodl/j2se" version="1.5+"/>
 	<nativelib href="lib/beispiel-win32-native.jar"/>
 </resources>
 <resources os="Linux">
 	<j2se href="http://java.sun.com/products/autodl/j2se" version="1.5+"/>
 	<nativelib href="lib/beispiel-linux-native.jar"/>
 </resources>
 <application-desc/> 
</jnlp>

4. Der Webserver Der Benutzer muss um ein Programm zu starten einfach auf einen Link auf die jnlp Datei klicken. Wenn der Webserver die Web Start Erweiterung kennt wird dies wunderbar funktionieren. Falls er dies jedoch nicht kennt bekommt der Benutzer einfach nur die XML Datei angezeigt oder kann sie herunterladen. Dies ist natürlich nicht gewünscht und es gibt zwei Mäglichkeiten das zu ändern: 1. Man hat Zugriff auf die Webserver Einstellungen. Java Web Start definiert einen neuen MIME-Typ den man mit AddType application/x-java-jnlp-file .jnlp einfach hinzufügen kann. 2. Man hat keinen Zugriff auf die Webserver Einstellungen. Man kann den benötigten Header mit den entsprechenden Angaben auch einfach selbst mit einer Scriptsprache erstellen. In PHP z.B. muss einfach folgende Zeile ganz oben in die jnlp Datei eingefügt werden:

<?php  header("Content-type: application/x-java-jnlp-file");
echo "< xml version=\"1.0\" encoding=\"UTF-8\">"; ?>

und die Datei in *.php umbenannt werden.

Written by michi

April 19th, 2007 at 4:22 pm

Posted in

4 Responses to 'Java Web Start Tutorial'

Subscribe to comments with RSS or TrackBack to 'Java Web Start Tutorial'.

  1. Nettes kleines Tutorial. Es hat alles enthalten was ich brauche um eine Webstart Anwendung zum laufen zu bekommen.

    Vielen Dank ;-)

    Falko

    28 May 07 at 20:48

  2. Gerne geschehen. Freue mich immer wenn ich helfen konnte.

    michi

    28 May 07 at 20:59

  3. Danke für das kleine Tutorial, war wirklich sehr hilfreich!

    Michael

    17 Mar 08 at 11:20

  4. [...] und deswegen dachte ich es wäre ganz gut hierfür ein deutsches Tutorial zu haben. Hier gehts zum Java Web Start Tutorial. Viel Spass beim Lesen. Es gibt ein ähnliches englisches Tutorial und viele andere interessante [...]

Leave a Reply

*
To prove you're a person (not a spam script), type the security word shown in the picture. Click on the picture to hear an audio file of the word.
Click to hear an audio file of the anti-spam word

To use reCAPTCHA you must get an API key from https://www.google.com/recaptcha/admin/create