# Java Webstart beschleunigen und Verlauf anzeigen



## java-ari (29. Jul 2010)

Hallo allerseits,

ich bin hier neu im Forum und da ich gerade beim Thema Webstartbeschleunigung etwas am Verzweifeln bin, möchte ich mal mein Problem hier loswerden, in der Hoffnung, dass mir jemand weiterhelfen kann.

Also, ich habe eine recht große Anwendung, die per Webstart gestartet wird. Nach dem Ausführen der JNLP-Datei werden zunächst die benötigten Jar-Files aktualisiert. Beim Update der Jar-Files wird mit einem Progressindikator der Verlauf des Updatevorganges standardmäßig angezeigt. Dann wird ein von mir definiertes Bild als Splashscreen für kurze Zeit angezeigt. Soviel zum üblichen Verhalten von Webstartanwendungen. Das Problem ist jetzt, dass nachdem der Splashscreen wieder ausgeblendet wird, lange Zeit nichts passiert, bis nach ein bis zwei Minuten die Applikation gestartet wird. Im Hintergrund werden irgendwelche Cacheoperationen durchgeführt und die Signaturen der Jars überprüft u.s.w. 

Gibt es eine Möglichkeit, diese Abläufe, die im Hintergrund passieren, irgendwie zu beschleunigen oder zu mindest in dieser Zwischenzeit (zwischen Splashscreen und Start der Applikation) einen Ladebalken anzuzeigen, damit der Benutzer auch sieht, dass etwas im Hintergrund passiert?

Ich wäre sehr sehr dankbar für jede Antwort, die mir weiterhilft!

Grüße,

Ari


----------



## hansmueller (29. Jul 2010)

Hallo,

die folgenden Links könnten interessant sein:
New Splash-Screen Functionality in Java SE 6
How to Create a Splash Screen (The Java™ Tutorials > Creating a GUI With JFC/Swing > Using Other Swing Features)

Das sollte man eigendlich auch mit WebStart kombinieren können. Man müßte nur ausprobieren, ob es über das Manifest oder die Komandozeilenargumente funktioniert.
Beides kann man bei WebStart in der JNLP-Datei angeben:
Entweder mit dem Element <j2se version="1.6+" java-vm-args="-splash:filename.gif"/> 
oder im Manifest (wird anscheinend nur ausgelesen, wenn die Jar mit der Main-Klasse unter dem Element <resources> bei den <jar> an erster Stelle steht und man nirgendswo sonst die Main-Klasse angegeben hat.)

Du hättest dann praktisch 2 Startbilder (=Splashscreens), zuerst das von WebStart (mit dem Element <icon kind="splash" href="images/splash.gif"/>) und dann das vom eigendlichen Programm. (Natürlich nur, wenn es funktioniert.)

Alternativ könntest du auch die Download-Politik ändern (Element <update>). Dort gibt es verschiedene Möglichkeiten (z. B. das Herunterladen im Hintergrund ausführen lassen und mit der alten Version arbeiten).

MfG
hansmueller


----------



## java-ari (4. Aug 2010)

Hallo hansmueller,

danke für die Tipps. Einige Hinweise hatte ich schon ausprobiert, aber sie führen bei unserer Applikation nicht zum Ziel.

z.B. das Verändern der Download-Policy mit <update check="background"> bringt bei uns insofern nichts, da es zur Folge hat, dass nach einer Änderung der Daten auf dem Server die Applikation ein weiteres Mal aus dem Cache geladen wird, und der Anwender nicht sofort die neue Version bekommt. Erst beim zweiten Mal ist die neue Version verfügbar, da sie beim ersten Durchlauf im Hintergrund geladen wurde.

Die Idee mit <j2se version="1.6+" java-vm-args="-splash:filename.gif"/> finde ich sehr gut und das hätte uns auch ein großes Stück weitergebracht, aber leider gibt es da einen Bug von Java, dass dieser Aufruf ausgerecht beim Webstart nicht funktioniert.
siehe:
Bug ID: 6510416 Need a support of native SplashScreen in Java WebStart

Diesen Bug gibt es schon seit Januar 2007 und scheinbar hat sich bisher noch nichts getan.

Es gibt noch einen weiteren Bug, dass sich das Laden von Webstart-Applikationen sein Java 1.6+ deutlich verschlechtert haben soll. siehe: Bug ID: 6566201 JNLP ClassLoader performance degraded in 1.6 significantly for the signed(?) jar
Aber auch da scheint sich niemand drum zu kümmern. Diesen Bug gibt es auch schon seit Juni 2007.

Ich habe noch etwas interessantes gefunden: Und zwar kann man die Jar-Files im Deploy-Verzeichnis mit __V[version].jar (z.B. Test.jar ->  Test__V1.0.jar) umbenennen und die JNLP-Datei dementsprechend anpassen. 

<resources>
    <jar href="Test.jar" main="true" version="1.0"/>   
    <property name="jnlp.versionEnabled" value="true"/>
    ...
</resources>

Auf diese Weise finden keine unnötigen Updateüberprüfungen mehr statt, es wird lediglich die JNLP-Datei vom Server geholt und mit der im Java-Cache liegenden JNLP-Datei verglichen. So werden nur die Jar-Files aktualisiert, die sich laut JNLP-Datei verändert haben und die gesamte Updateüberprüfung findet lokal statt.

Wenn ich noch etwas rausfinde, werde ich es hier posten.


----------



## hansmueller (5. Aug 2010)

Hallo java-ari,

Danke für die Info. Das hilft auch mir sehr viel weiter. Ich habe zur Zeit ein Projekt laufen, bei dem ich ebenfalls etwas mit einem Spashscreen und WebStart machen wollte (daher mein Vorschlag diesbezüglich). Wäre aber erst in 2-3 Monaten dazu gekommen, das auszuprobieren.

Die Bugs sind wirklich schon uralt und noch immer nicht gefixt. Wollen die WebStart vielleicht absichtlich ins Nirvana befördern. ???:L
Daweil ist die Idee genial. Man müsste es aber noch weiter ausbauen. (Der Offline-Modus ist ein Graus.)

MfG
hansmueller


----------

