Java Webstart startet .jar file nicht

  • Themenstarter Themenstarter Destroyer2442
  • Beginndatum Beginndatum
D

Destroyer2442

Gast
Hallo,

Ich habe mal eine Java Application gschrieben und wollte diese mit Java Webstart ausführen um sie später auf einem Webserver
starten zu können.

Also habe ich mir erstmal ein Tutorial über Java Webstart durchgelesen und folgende Schritte gemacht :

- Alle erforderlichen Klassen in ein .jar file gepackt und diesen auch signiert, was anscheinend auch geklappt hat (die Kommandozeile hat ausgegeben, dass die Signierung sechs Monate gültig ist). Den .jar file selsbt auszuführen hat auch wunderbar geklappt (Application startet sofort).

- Danach habe ich einen .jnlp file erstellt der so aussieht :

[XML]<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<jnlp codebase="http://localhost/" href="BankkontoTester.jnlp" spec="1.0+">
<information>
<title>Bankkonto Simulator</title>
<vendor>Lädt</vendor>
<homepage href="index.php"/>
<description>Simuliert einen Bankschalter</description>
<description kind="short">Simulator</description>
</information>
<resources>
<j2se version="1.5+"/>
<jar eager="true" href="BankkontoTester.jar" main="true"/>
</resources>
<application-desc main-class="BankkontoTester">
</application-desc>
</jnlp[/XML]>

- der BankkontoTester.jar file sowie der BankkontoTester.jnlp file liegen beide im Quellverzeichnis von einem Apache webserver version 2.2, welcher auf meinem Rechner installiert ist und auf dem lokalen host läuft.

- Auf diesem Webserver ist ebenfalls PHP 5.3.1 sowie Mysql server 5.1.42 installiert.

So weit so gut.
Danach habe ich halt Java Webstart version 1.01 installiert und versucht den BankkontoTester.jnlp file auszuführen.
Danach startet java webstart und lädt den .jnlp file, welcher ebenfalls lesbar zu sein scheint (keine Fehlermeldung).
Nach kurzer Zeit erscheint auch die Meldung "Anwendung wird gestartet" aber dann passiert gar nichts mehr und das Fenster bleibt ewig offen ohne, dass die Applicattion gestartet wird oder irgendetwas davon zu sehen ist :/.

Wenn ich dann das Fenster schließe und den file direkt noch einmal öffnen will erscheint diesmal nur das Java Webstart Logo und verschwindet nach etwa 10 - 20 sekunden wieder ohne, dass irgendwas passiert ist.

Das selbe Resultat erhalte ich wenn ich vom Apache Webserver aus einer html datei heraus auf die .jnlp datei zugreife mit :

HTML:
<a href="BankkontoTester.jnlp">[Programm name]</a>

Ich habe bereits lange mit google und in dutztenden von Foren nach einem ähnlichen Fehler gesucht und bin bisher nicht fündig geworden. Da das Programm auch keine Fehlermeldung ausspuckt kann ich den Fehler so nicht wirklich verstehen aber ich glaube der Fehler könnte am .jnlp file liegen, weil es ehrlich gesagt der erste war den ich geschrieben habe und ich deswegen wahrscheinlich einen Fehler darin nicht sehen kann ^^.

Ich hoffe ihr könnt mir helfen

MFG Destroyer2442
 
Zuletzt bearbeitet von einem Moderator:
Hallo,

Ich habe mal eine Java Application gschrieben und wollte diese mit Java Webstart ausführen um sie später auf einem Webserver
starten zu können.

Also habe ich mir erstmal ein Tutorial über Java Webstart durchgelesen und folgende Schritte gemacht :

- Alle erforderlichen Klassen in ein .jar file gepackt und diesen auch signiert, was anscheinend auch geklappt hat (die Kommandozeile hat ausgegeben, dass die Signierung sechs Monate gültig ist). Den .jar file selsbt auszuführen hat auch wunderbar geklappt (Application startet sofort).

- Danach habe ich einen .jnlp file erstellt der so aussieht :
Code:
<?xml version="1.0" encoding="UTF-8" standalone="no"?> 
<jnlp codebase="http://localhost/" href="BankkontoTester.jnlp" spec="1.0+"> 
    <information> 
        <title>Bankkonto Simulator</title> 
        <vendor>Lädt</vendor> 
        <homepage href="index.php"/> 
        <description>Simuliert einen Bankschalter</description> 
        <description kind="short">Simulator</description> 
    </information> 
    <resources> 
<j2se version="1.5+"/> 
<jar eager="true" href="BankkontoTester.jar" main="true"/> 
    </resources> 
    <application-desc main-class="BankkontoTester"> 
    </application-desc> 
</jnlp>

- der BankkontoTester.jar file sowie der BankkontoTester.jnlp file liegen beide im Quellverzeichnis von einem Apache webserver version 2.2, welcher auf meinem Rechner installiert ist und auf dem lokalen host läuft.

- Auf diesem Webserver ist ebenfalls PHP 5.3.1 sowie Mysql server 5.1.42 installiert.

So weit so gut.
Danach habe ich halt Java Webstart version 1.01 installiert und versucht den BankkontoTester.jnlp file auszuführen.
Danach startet java webstart und lädt den .jnlp file, welcher ebenfalls lesbar zu sein scheint (keine Fehlermeldung).
Nach kurzer Zeit erscheint auch die Meldung "Anwendung wird gestartet" aber dann passiert gar nichts mehr und das Fenster bleibt ewig offen ohne, dass die Applicattion gestartet wird oder irgendetwas davon zu sehen ist :/.

Wenn ich dann das Fenster schließe und den file direkt noch einmal öffnen will erscheint diesmal nur das Java Webstart Logo und verschwindet nach etwa 10 - 20 sekunden wieder ohne, dass irgendwas passiert ist.

Das selbe Resultat erhalte ich wenn ich vom Apache Webserver aus einer html datei heraus auf die .jnlp datei zugreife mit :
Code:
<a href="BankkontoTester.jnlp">[Programm name]</a>

Ich habe bereits lange mit google und in dutztenden von Foren nach einem ähnlichen Fehler gesucht und bin bisher nicht fündig geworden. Da das Programm auch keine Fehlermeldung ausspuckt kann ich den Fehler so nicht wirklich verstehen aber ich glaube der Fehler könnte am .jnlp file liegen, weil es ehrlich gesagt der erste war den ich geschrieben habe und ich deswegen wahrscheinlich einen Fehler darin nicht sehen kann ^^.

Ich hoffe ihr könnt mir helfen

MFG Destroyer2442

Lass mal eine Java Konsole mitlaufen und schau ob dieser die Fehler wirft.
 
Ah ok danke für den tipp ^^

Damit wird mir folgender Fehler angezeigt :

"Beim Starten/Ausführen der Anwendung ist ein Fehler aufgetreten.

Kategorie: Fehler: ungültiges Argument

Zu viele Argumente angegeben: {-silent, -import, -reverse, -javafxau, -J-Dkernel.download.dialog=false, [noparse]http://dl.javafx.com/javafx-cache.jnlp JavaFX Runtime JNLP Cache Preload[/noparse] }"

leider kann ich damit auch nicht sehr viel Anfangen, weil ich grad nich weiß woher er diese Argumente kommen :/
 
Zuletzt bearbeitet von einem Moderator:
Ah ok danke für den tipp ^^

Damit wird mir folgender Fehler angezeigt :

"Beim Starten/Ausführen der Anwendung ist ein Fehler aufgetreten.

Kategorie: Fehler: ungültiges Argument

Zu viele Argumente angegeben: {-silent, -import, -reverse, -javafxau, -J-Dkernel.download.dialog=false, [noparse]http://dl.javafx.com/javafx-cache.jnlp JavaFX Runtime JNLP Cache Preload[/noparse] }"

leider kann ich damit auch nicht sehr viel Anfangen, weil ich grad nich weiß woher er diese Argumente kommen :/

Google halt mal kenn mich mit JavaFX nicht aus oder du dein jnlp file ist falsch
 
Hallo,

ich glaube deine jnlp-Datei hat einen Fehler.

Du schreibst folgendes:
Code:
<jar eager="true" href="BankkontoTester.jar" main="true"/>

Meiner Meinung müßte es so heißen:

Code:
<jar href="BankkontoTester.jar" download="eager" main="true"/>

MfG
hansmueller
 
Hallo Hansmueller,

leider hat deine Veränderung auch keinen Erfolg gehabt, wobei sie auch kein anderes Problem ausgelöst hat ^^.

ich sehe nach wie vor immer wenn ich die jnlp mit Javawebstart ausführen will dieses Fenster :

Und geht dann einfach nicht mehr weiter ...
 
Versuche mal Folgendes:

Öffne die Eingabeaufforderung (unter Zubehör).
Wechsle in das bin-Verzeichnis der JRE (Befehl: cd C:\Programme\Java\jre6\bin),
und gib dort folgenden Befehl ein:

javaws -verbose <jnlp-Datei>

Statt <jnlp-Datei> mußt du natürlich die Url zu deiner jnlp-Datei eingeben.
(Für weiter Infos siehe: javaws -help)

Wenn ich es richtig sehe müßte die Url
http://localhost/BankkontoTester.jnlp
lauten. (javaws -verbose http://localhost/BankkontoTester.jnlp)

Das -verbose gibt jetzt verschiedene Meldungen aus, vielleicht zeigt es ja einen Fehler oder ähnliches an.
Wenn es an WebStart liegt, sollte hier der Fehler ausgegeben werden.


MfG
hansmueller
 
Auf diese Weise bekomme ich zwar eine Fehlermeldung allerdings ist diese die Selbe wie in der Java-Konsole ausgegeben wurde :

Fehler :
"TooManyArgumentsException[ Zu viele Argumente angegeben: {-verbose, http://localhost/java/BankkontoTester.jnlp }]
at com.sun.javaws.Main.main(Unknown Source)"

leider weiß ich nicht warum dieser Fehler auftritt und auch mit google habe ich keine nützlichen Informationen gefunden.

MFG
 
Sorry, mein Fehler.
Ich habe übersehen, daß du eine uralte WebStart-Version benutzt.
Ich vermute, die kennt den verbose-Befehl noch nicht. (Siehe javaws Command Line).

Versuch es mal nur mit: javaws http://localhost/BankkontoTester.jnlp

Alternativ kannst du es auch mal mit einer neueren WebStart-Version versuchen. (1.0.1 ist wirklich nicht mehr aktuell).

Eines verstehe ich allerdings nicht.
Ich vermute, daß du die Java-Version 1.5 benutzt. (Das schließe ich aus deiner jnlp-Datei)
Da sollte eigendlich schon standardmäßig die WebStart-Version 1.5.0 dabei sein? (Siehe JDK 5.0 Java Web Start-related APIs & Developer Guides -- from Sun Microsystems)
Wieso hast du dann die alte Version installiert????:L

MfG
hansmueller
 
Also, dass Java webstart mit in Java integriert ist habe ich erlich gesagt nicht gewusst ^^.

Ich bin einfach dem tutorial gefolgt,welches einen Link zur version 1.01 von Java webstart sowie der Anweisung diese zu installieren beinhaltete ^^.

Habe jetzt java noch einmal neu draufgezogen (1.6.0_18) welche änderungen muss ich nun an meinem .jnlp-file vorhnehmen ?

MFG
Destroyer2442
 
Das kommt darauf an, mit welcher Java-Version du dein Programm kompiliert hast.

Wenn dein Programm nur mit der Version 1.5 funktioniert, solltest du den Tag
Code:
<j2se version="1.5+"/>
so abändern:
Code:
<j2se version="1.5+" href="http://java.sun.com/products/autodl/j2se"/>

Webstart zieht sich dann automatisch die JRE von Sun, die es für das Programm braucht. Dafür ist die href da. (Soll meines Wissens aber nur unter Windows automatisch funktionieren.)

Wenn dein Programm nur mit der Version 1.6 funktioniert, solltest du den Tag
Code:
<j2se version="1.5+"/>
so abändern:
Code:
<j2se version="1.6+" href="http://java.sun.com/products/autodl/j2se"/>

Allerdings muß ich leider zugeben, das ich leider keine Erfahrung mit Kompatibilitätsproblemen zwischen den Java-Versionen 1.5 und 1.6 habe. Ich habe Java immer nur ab Version 1.6 benutzt.

Ich weiß aber, das es bei den Klassen speziell für WebStart-Programme (Ich meine die JNLP-Api für Drucken, Dateien öffnen und speichern, Systemeinstellungen) teilweise ein paar Änderungen gab.

Probier die Änderungen in der jnlp-Datei aus und versuche das Programm mit
Code:
javaws -verbose http://localhost/BankkontoTester.jnlp
zu starten.

Wenn es schief geht, poste bitte die komplette Fehlermeldung.

MfG
hansmueller
 
Hi,

Meine .jnlp sieht jetzt so aus :

[xml]
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<jnlp codebase="http://localhost/java/" href="http://localhost/java/BankkontoTester.jnlp" spec="1.0+">
<information>
<title>Bankkonto Simulator</title>
<vendor>Lädt</vendor>
<homepage href="http://localhost/index.php"/>
<description>Simuliert einen Bankschalter</description>
<description kind="short">Simulator</description>
</information>
<resources>
<j2se version="1.6+" href="http://java.sun.com/products/autodl/j2se"/>
<jar href="http://localhost/java/BankkontoTester.jar" download="eager" main="true"/>
</resources>
<application-desc main-class="BankkontoTester">
</application-desc>
</jnlp>
[/xml]

Wenn ich diese mit Webstart ausführe wird mir zunächst folgende Meldung ausgeben :



nach bestätigung erscheint die Fehlermeldung "Anwendung konnte nicht gestartet werden" nach einem klick auf details wurde mir folgende Ausnahme angezeigt :

java.security.AccessControlException: access denied (java.io.FilePermission 0 read)
at java.security.AccessControlContext.checkPermission(Unknown Source)
at java.security.AccessController.checkPermission(Unknown Source)
at java.lang.SecurityManager.checkPermission(Unknown Source)
at java.lang.SecurityManager.checkRead(Unknown Source)
at java.io.FileInputStream.<init>(Unknown Source)
at java.io.FileInputStream.<init>(Unknown Source)
at java.io.FileReader.<init>(Unknown Source)
at Buttons.Aktion(BankkontoTester.java:447)
at BankkontoTester.main(BankkontoTester.java:643)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at com.sun.javaws.Launcher.executeApplication(Unknown Source)
at com.sun.javaws.Launcher.executeMainClass(Unknown Source)
at com.sun.javaws.Launcher.doLaunchApp(Unknown Source)
at com.sun.javaws.Launcher.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)

Außerdem stand in der Konsole :

Java Web Start 1.6.0_18
Verwendung der JRE-Version 1.6.0_18-b07 Java HotSpot(TM) Client VM
----------------------------------------------------
c: Konsole löschen
f: Objekte in Finalisierungswarteschlange finalisieren
g: Speicherbereinigung
h: Diese Hilfemeldung anzeigen
m: Speicherbelegung anzeigen
o: Protokollierung auslösen
p: Proxy-Konfiguration neu laden
q: Konsole ausblenden
r: Richtlinien-Konfiguration neu laden
s: System- und Bereitstellungseigenschaften ausgeben
t: Threadliste ausgeben
v: Thread-Stack ausgeben
0-5: Trace-Stufe auf <n> setzen
----------------------------------------------------
#### Java Web Start Error:
#### access denied (java.io.FilePermission 0 read)

Mit freundlichen Grüßen

Destroyer2442
 
OK, ich glaube ich weiß jetzt, wo der Fehler liegt.

Ein Java-Programm, daß über WebStart gestartet wird, läuft standardmäßig in einer sogenannten "Sandbox" ab. D. h. das Programm darf praktisch nichts auf dem (Client-)Rechner machen, z. B. Dateien auf die Festplatte schreiben oder lesen, Systemvariablen abfragen usw.
Dies stellt sicher, daß das Programm nicht machen kann, was es will (wie z. B. die Festplatte löschen).

Siehe Java Web Start and Security (The Java™ Tutorials > Deployment > Java Web Start)

Oder für die Grundlagen: Java(TM) Web Start
Java Web Start 1.5.0 Developer Guide

Es gibt 2 Möglichkeiten die Beschränkungen der Sandbox zu beseitigen bzw. zu umgehen:

1. Über das Packet javax.jnlp
Es handelt sich dabei um die jar-Datei "Java/jdk1.6.0xxx/sample/jnlp/servlet/jnlp.jar". Diese mußt du in deinen Classpath eintragen.
Dann erhälts du zusätzliche Klassen, mit denen du jeden bisher geblockten Zugriff auf den Clientrechner durch eine Erlaubnis des Anwenders aufheben kannst.
Das ganze sieht dann so aus: Wenn das Programm z. B. eine Datei auf dem Clientrechner abspeichern will, wird der Anwender zuerst gefragt, ob er diese Aktion auch wirklich zulassen will. Erst wenn der Anwender diese Abfrage bestätigt, wird das Programm fortgeführt.

Die Api für die Klassen findest du hier: JNLP API Reference 1.5
Wie du diese anwenden kannst unter JNLP API Examples

2. Über eine Signierung der jar-Datei
Durch das Signieren der jar-Datei und durch den Zusatz
Code:
<security>
   <all-permissions/>
</security>
in der jnlp-Datei wird die Sandbox-Funktion ausgeschaltet.
Der Anwender wird beim Programmstart gefragt, ob er dem Zertifikat vertraut. Wenn er zustimmt, startet das Programm mit vollen Zugriffsrechten (zumindest denen, die auch der Anwender hat (Glaube ich zumindest)).

Link: Signing and Verifying JAR Files (The Java™ Tutorials > Deployment > Packaging Programs in JAR Files)

Für privat Leute und kleine Firmen ist die Signierung mit einem selbsterstelltem Zertifikat wohl die beste Lösung.


Ich weiß nicht welchen dieser beiden Wege du gehen willst. Wenn du den ersteren gehst, mußt du dich mit der Api auseinandersetzen und dein Programm an den enstprechenden Stellen abändern.

Wenn du dich für den zweiten Weg entscheidest kannst du dich an folgende Anleitung halten. Und vergiss nicht den Zusatz in der jnlp-Datei.
Sämtliche Befehle werden in die Konsole (= Eingabeaufforderung) eingegeben.
Betriebsystem Windows XP.

Wechsel in das Verzeichnis:
C:\Programme\Java\jdk1.6.xxx\bin
(Beispiel Befehl: cd C:\Programme\Java\jdk1.6.0_18\bin)

Zuerst muß ein Schlüsselpaar erzeugt und verwaltet werden.
Dazu muß folgendes in die Konsole eingegeben werden:
keytool -genkey -keystore TestTresor -alias Testschluessel

Mit -genkey generiert man das Schlüsselpaar,
mit -keystore XXX wird eine Schlüsseldatenbank mit dem Namen XXX erzeugt (falls noch nicht vorhanden), in dem das Schlüsselpaar verwaltet wird und
mit -alias YYY gibt man diesem Schlüsselpaar den Namen YYY.

Das Programm fragt zusätzlich noch nach einem Passwort, mit dem man den Keystore sichern möchte. Alle Passwörter müssen mindestens 6 Zeichen lang sein.
Die Passworteingabe ist unsichtbar, d. h. man sieht weder welche Zeichen man eingibt, noch wie viele.
Das Programm fragt noch diverse Dinge wie Namen, Land etc. ab. Diese müssen meines Wissens nicht unbedingt ausgefüllt werden.
Das Programm fragt, ob die Eingaben korrekt sind.
Mit „ja“ bestätigen. (Also „ja“ eingeben.)
Passwort für das Schlüsselpaar: Betätigung der Eingabetaste
Dadurch wird das selbe Passwort für das Schlüsselpaar wie für den Keystore verwendet. (Ist am einfachsten.)

Jetzt muß man ein selbstsigniertes Zertifikat erstellen:
keytool -selfcert -validity 1825 -keystore TestTresor -alias Testschluessel

Mit -selfcert erzeugt man ein selbstsigniertes Zertifikat,
mit -validity 1825 verpaßt man dem Zertifikat eine Gültigkeitsdauer von 5 Jahren (365 Tage x 5),
mit -keystore XXX gibt man an aus welcher Schlüsseldatenbank das Schlüsselpaar genommen werden soll und
mit -alias YYY gibt man den Namen des Schlüsselpaares an.

Das Programm fragt noch das Passwort für den Keystore ab.

Jetzt kann man mit dem selbssignierten Zertifikat das Java-Programm signieren:
jarsigner -keystore TestTresor <Pfad zum Programm> Testschluessel

Mit -keystore XXX gibt man die Schlüsseldatenbank an,
mit <Pfad zum Programm> gibt man die zu signierende jar-Datei an (Hier muß der komplette Pfad angegeben werden, also z. B. C:\Test\Versuch\IchbindasProgramm.jar (ohne die <>)) und
am Schluß gibt man noch den Namen des Schlüsselpaares an.

Das Programm fragt noch das Passwort für den Keystore ab.

Die jar-Datei ist nun signiert und kann nun für Java Web Start verwendet werden.

Zusätzliches:
Die Schlüsseldatenbank wird im Ordner C:\Programme\Java\jdk1.6.xxx\bin\ als Datei angelegt.

Bitte gib mir eine Rückmeldung, ob dies das Problem löst.

Mfg
hansmueller
 
Zuletzt bearbeitet:
Das war tatsächlich das Problem und wurde damit behoben 🙂
Das Programm startet jetzt (endlich) fehlerfrei ^^.

Ich habe mich für den zweiten Lösungsweg entschieden und in den .jnlp file den zusatz :
[xml]
<security>
<all-permissions/>
</security>
[/xml]

eingefügt und habe den .jar file neu signiert (genau nach der Anleitung von hansmueller).

Danke für die Hilfe !

Mit freundlichen Grüßen

Destroyer2442
 

Zurück
Oben