# [Java6] WebStart-Problem!! Frage zum Nachladen von Lib's/Änderung der JNLP



## vfl_freak (11. Juni 2010)

Hallo zusammen,

wir haben hier ein Problem im Zusammenhang mit Änderungen an der JNLP-Datei auf dem Webserver, wenn dort neue Libraries eingetragen werden!

Im Java-Cache (ab 6.0) werden ja für jede Anwendung drei Dateien angelegt. Eine *.idx*-Datei, die Library-Pfade enthält, dann eine *.lap*-Datei mit Info zur Lage des Programms und letztlich eine Datei ohne Extension, die quasi die aktuelle jnlp-Datei enthält. Diese letzte Datei wird ja von der javaws.exe ggf. in eine neu erstellte Programmverknüpfung auf dem Desktop geschrieben.

Wenn ich nun in der jnlp-Datei auf unserem WebServer die jnlp-Datei um eine neue Lib erweitere (und natürlich auch die entsprechende jar-Datei dort ablege), dann lässt sich die Anwendung über die Verknüpfung nicht mehr starten, da die oben genannte Datei ohne Extension im Java-Cache gelöscht ist. Sprich: die Anwendung muss komplett neu von WebServer installiert werden, da die Verknüpfung keinen Startpunkt zum Aufruf findet ....
 Nach der Neuinstallation klappt dann alles wie gewohnt; auch die neue  Lib wird erkannt 

Das dies ein generelles Problem von WebStart ist, kann ich mir  eigentlich nicht vorstellen. Hängt es eventuell mit den Einträgen in der JNLP-Datei zusammen ?

Hier mal der Inhalt (leicht anonymisiert) :

```
<?xml version="1.0" encoding="utf-8"?>
<!-- JNLP File Created by KBr - klaus.brokmann@xxx.yy  -->
<jnlp spec="1.0+" codebase="http://www.XXX.YY/" href="applikationsname.jnlp">
 <information>
  <title>myApplication</title>
  <vendor>European Security Alliance</vendor>
  <homepage href="myAppl.html"/>
  <description>myApplication</description>
  <description kind="short">myApplication (Test-Version)</description>
  <icon href="pics/w32g.gif"/>
  <offline-allowed />
  <shortcut online="true">
    <desktop/>
  </shortcut>
 </information>
 <security>
  <all-permissions/>
 </security>
 <update check="always" policy="always" />
 <resources>
  <j2se version="1.6.0+" href="http://java.sun.com/products/autodl/j2se" initial-heap-size="128m" max-heap-size="512m" />
  <jar href="myApplication.jar"/>
  <jar href="Serialio.jar"/>
  <jar href="jspComm.jar"/>
  <jar href="log4j-1.2.8.jar"/>
  <jar href="jco.jar"/>
  <jar href="edtftpj.jar"/>
  <jar href="foxtrot-core-3.0.jar"/>
  <jar href="swingx-1.6.jar"/>     // diese Referenz habe ich neu hinzugefügt !!
  <nativelib href="Win_x86_EtherAddr.jar"/>
  <nativelib href="libSolaris_sparc_EtherAddr.jar"/>
  <nativelib href="libLinux_x86_EtherAddr.jar"/>
  <nativelib href="mawin.jar"/>
  <nativelib href="win32com.jar"/>
  <nativelib href="JSkype.jar"/>
  <!--nativelib href="MSVCRTD.jar"/-->
 </resources>
 <application-desc main-class="myApplication.mainApp"/>
</jnlp>
```

Ich hoffe händeringend, dass mir irgendwer hierzu einen Tipp geben kann.
Vielen Dank im voraus 
LG aus OS
Klaus


----------



## Thomas Darimont (12. Juni 2010)

Hallo,

mir ist nicht ganz klar welches Verhalten du nun gerne hättest.
Willst du das deine Anwendung trotzdem noch startet auch wenn auf dem Server eine neue JNLP Datei erkannt wird in dem diese beim start die Jars "aktualisiert" bzw. nur die hinzugefügten jars nachlädt und dann ganz normal startet?

Sprich dein Problem ist das die Anwendung nicht mehr startet, sobald auf dem Server ein neues JNLP File erkannt wird. Das möchtest du nun irgendwie abstellen.

Oder suchst du implizit nach einer Möglichkeit wie man an den Webstart Mechanismen vorbei jars vom Server ziehen und in den Classpath der Anwendung bringen kann?

//edit:
Könntest mal versuchen den update check von "always" auf background zu stellen. Dabei wird die Anwendung zunächst aus dem Cache gestartet und im Hintergrund wird auf das update geprüft und gegebenenfalls runtergeladen. Die policy könntest du dann auf prompt-update / prompt-run Stellen um den Benutzer darüber zu informieren, dass die neue Version nun installiert werden kann.
http://java.sun.com/javase/6/docs/technotes/guides/javaws/enhancements6.html

Gruß Tom


----------



## vfl_freak (12. Juni 2010)

Moin Thomas,

erstmal Danke für Deine Antwort 



Thomas Darimont hat gesagt.:


> mir ist nicht ganz klar welches Verhalten du nun gerne hättest.
> Willst du das deine Anwendung trotzdem noch startet auch wenn auf dem Server eine neue JNLP Datei erkannt wird in dem diese beim start die Jars "aktualisiert" bzw. nur die hinzugefügten jars nachlädt und dann ganz normal startet?
> Sprich dein Problem ist das die Anwendung nicht mehr startet, sobald auf dem Server ein neues JNLP File erkannt wird. Das möchtest du nun irgendwie abstellen.


Genau - ich hätte gerne, dass die Anwendung auch dann startet, wenn sich die JNLP auf dem Webserver geändert hat!
Ich hatte eigentlich erwartet, dass dann diese geänderte JNLP auch in den Cache geschrieben würde, was aber scheinbar eben nur bei einer Neu-Installation zu passieren scheint. Wir haben in der Firma zwar ein Batch-Script entwickelt, dass diese Neu-Installation automatisch durchführt (mit Löschen der Anwendung im Cache, runterladen der JNLP, Starten der Anwendung mit Erzeugung der Verknüpfung und anschließendem Kopieren dieser Verknüpfung in einen gewünschten Desktop-Ordner). Das klappt soweit auch gut, aber da die Anwendung auf ca. 40 PCs in einer Notrufzentrale läuft, ist es natürlich nervig, wenn die Mitarbeiter bei jeder Änderung erst neu installieren müssen. Die sind es gewohnt, so wie bei einem Update der Anwendung, das alles automatisch geschieht .....



Thomas Darimont hat gesagt.:


> //edit:
> Könntest mal versuchen den update check von "always" auf background zu stellen. Dabei wird die Anwendung zunächst aus dem Cache gestartet und im Hintergrund wird auf das update geprüft und gegebenenfalls runtergeladen. Die policy könntest du dann auf prompt-update / prompt-run Stellen um den Benutzer darüber zu informieren, dass die neue Version nun installiert werden kann.
> http://java.sun.com/javase/6/docs/technotes/guides/javaws/enhancements6.html


Danke für diesen Tipp! Das werde ich dann am Montag gleich mal austesten (und dann hier reflektieren) !

Schönes WE!
tschüss
Klaus


----------



## vfl_freak (14. Juni 2010)

Guten morgen Thomas,

tja, das hat leider noch nicht geklappt ... :-(  Wenn ich den Anhang aus Deinem Post (resp. das, was sonst dazu im Web finden lässt) richtig verstehe, bezieht sich dieser Eintrag ja auch 'nur' auf das Applikation-Update und nicht auf das Update der JNLP-Datei.

Nach dem Ändern der Einstellung auf "background/prompt-..." habe ich die Applikation neu gestartet, was auch klappte. Ich sah dann im entsprechenden Verzeichnis des Java-Cache dass beide Datein (.idx und die ohne Ext.) unter einem neuen Namen erzeugt wurden ... Allerdings wurde diese neue Name NICHT in die Verknüpfung eingetragen; dort steht weiter der alte Name !

Ich konnte dann beobachten, dass beim Beenden meiner Applikation im Cache die Datei mit alten Namen ohne EXT gelöscht wird. 
Ergo kann die Applikation anschließend nicht mehr gestartet werden und muss wieder neu installiert werden ... :-(

Ich bin derzeit ein wenig ratlos .... 

Gruß
Klaus


----------



## hansmueller (14. Juni 2010)

Hallo,

eigendlich brauchst du, wenn du die jnlp änderst nicht die komplette Anwendung vom Clientrechner löschen.
Der Client muß nur einmal die neue jnlp-Datei ausführen, die alte jnlp-Datei sollte dann von der neuen überschrieben werden. (Vorausgesetzt die beiden haben den gleichen Namen.)

Bei einer Änderung der jnlp-Datei mußt du den Anwender nur dazu auffordern das Programm für Updatezwecke über einen Link zu starten, der zur neuen jnlp-Datei führt.
Danach kann man das Programm wieder über die Desktopverknüpfung starten.

Ich habe irgendwo in den Dokumentationen der jnlp mal gelesen, das man eine jnlp-Datei auch über eine jnlp-Datei mitgeben kann.
D. h. du hast eine Start-jnlp-Datei, die du nicht veränderst und eine Programm-jnlp-Datei, die du beliebig verändern kannst, wann du willst.
Ich glaube man kann diese Programm-jnlp-Datei einfach in die <Resouces> hineinschreiben.

MfG
hanmueller


----------



## vfl_freak (14. Juni 2010)

Hallo hansmüller,

Danke für Deine Antwort  



hansmueller hat gesagt.:


> eigendlich brauchst du, wenn du die jnlp änderst nicht die komplette Anwendung vom Clientrechner löschen.
> Der Client muß nur einmal die neue jnlp-Datei ausführen, die alte jnlp-Datei sollte dann von der neuen überschrieben werden. (Vorausgesetzt die beiden haben den gleichen Namen.)


Löschen tue ich sie ja auch zunächst einmal nicht (lediglich vor einer Neuinstallation).
Es werde wie gesagt bei Starten der Anwendung neue Dateien im Java-Cache erstellt; allerdings nicht in die Verknüpfung eingetragen.
Nach Beenden der Anwendung wird die eine Datei im Cache wieder gelöscht ....



hansmueller hat gesagt.:


> Bei einer Änderung der jnlp-Datei mußt du den Anwender nur dazu auffordern das Programm für Updatezwecke über einen Link zu starten, der zur neuen jnlp-Datei führt.
> Danach kann man das Programm wieder über die Desktopverknüpfung starten.


Das habe ich zugegebenermaßen nicht ganz verstanden 
Die neue JNLP wird ja gefunden, nur die Reaktion darauf ist fehlerhaft ... s. o. 

Gruß
Klaus


----------

