Webstart Resource aus .jar laden

Trevanian

Mitglied
Hallo alle zusammen,

bis jetzt habe ich nie einen Forenbeitrag erstellen müssen um eine Lösung zu finden, aber diesmal komme ich einfach wirklich nicht weiter:

Ich habe eine Software geschrieben, welche ich als .jar verbreite. Die Anwendung benötigt einige Icons (.png).

In meinem Eclipse-Workspace befindet sich folgende Ordnerstruktur:

Kompilierte Dateien: bin/de/home/tinyadmin/
Resourcen: bin/de/home/tinyadmin/resource/
Sourcecode: src/de/home/tinyadmin/

Meine Icons binde ich mit ClassLoader.getSytemResource("de/home/tinyadmin/resource/bild.png") ein, das funktioniert auch wunderbar.
Ich erstelle nun mit Eclipse ein .jar (Rechtsklick auf mein Projekt ---> Export --> "Runnable Jar") und dieses funktioniert auch problemlos.

Nun wollte ich Java-Webstart ausprobieren: Beim Start gibt es eine NullPointerException, da die Icons nicht gefunden werden können.

Ich habe daraufhin eine Methode geschrieben, welche mir die Icons auf die alt gewohnte Art und Weise einlädt (ClassLoader.getSystemResource....) und falls dies eine Exception wirft, wird eine andere Methode verwendet. Dies tat ich, da ich gelesen habe, dass das Einlesen unter Java Webstart so nicht funktioniert.

Leider finde ich nun keinen passenden Weg um meine Icons unter Java Webstart einzulesen, folgende Wege habe ich probiert:
  • <Klasse_aus_meinem_Programm>.class.getResource("bild.png")
  • <Klasse_aus_meinem_Programm>.class.getResource("/bild.png")
  • <Klasse_aus_meinem_Programm>.class.getResource("resource/bild.png")
  • <Klasse_aus_meinem_Programm>.class.getResource("/resource/bild.png")
  • <Klasse_aus_meinem_Programm>.class.getResource("de/home/tinyadmin/resource/bild.png")
  • <Klasse_aus_meinem_Programm>.class.getResource("/de/home/tinyadmin/resource/bild.png")

Die gleichen Kombinationen habe ich auch für Thread.currentThread().getContextClassLoader().getResource(<kombination>) und für <Klasse_aus_meinem_Programm>.class.getClassLoader().getResource(<kombination>) durchgetestet: ohne Erfolg.

Ich habe den resource/ -Ordner vorsichtshalber auch immer nochmals direkt in das .jar (/resource) und nicht nur in den Ordner, in dem die kompilierten Klassen liegen (/de/home/tinyadmin/resource) gelegt. Ich weiß jetzt echt nicht mehr weiter, es findet einfach meine Icons nicht.

Im .jar-File selbst sieht alles gut aus, ich habe auch versucht "nur ein Jar-File" mit Eclipse zu erstellen (also nicht ein "Runnable Jar"): ebenfalls ohne Erfolg.

Hilfe! 🙁

Gruß,

Trev
 
Hallo,
unter Webstart klappt bei mir folgendes am sichersten:

Java:
ImageIcon icon = new ImageIcon(Thread.currentThread().getContextClassLoader().getResource("de/home/tinyadmin/resource/bild.png"));

Die Bilddateien liegen dabei aber im Source-Ordner (src) in einem eigenen package genau wie die Java-Dateien. Die Resource wird dabei genauso angegeben wie vollqualifizierte Klassennamen nur statt '.' halt der slash '/'.

Wenn es nicht klappt, dann wird das jar-File vielleicht nicht richtig verteilt, bzw. der Webstart-Cache aktualisiert nicht richtig. Dann mal im 'Java Control Panel' die temporären Internetdateien löschen.

Grüße Hogli
 
Mein Projekt in Eclipse sieht wie folgt aus:
folder.png


Folgendes versuche ich, um ein Icon einzuladen:
Java:
ImageIcon icon_ref = new ImageIcon(Thread.currentThread().getContextClassLoader().getResource("/de/home/tinyadmin/resource/bild.png"));

Wenn ich nun versuche meine Webstart-Applikation zu starten (egal ob direkt vom Server oder mit javaws), dann erhalte ich folgende Exception:

Code:
java.lang.NullPointerException
	at javax.swing.ImageIcon.<init>(ImageIcon.java:167)
	at de.home.tinyadmin.IOHelfer.getIcon(IOHelfer.java:206)
	at de.home.tinyadmin.TinyAdminGUI.createActionButtons(TinyAdminGUI.java:564)
	at de.home.tinyadmin.TinyAdminGUI.<init>(TinyAdminGUI.java:160)
	at de.home.tinyadmin.TinyAdminC.<init>(TinyAdminC.java:88)
	at de.home.tinyadmin.TinyAdminC.main(TinyAdminC.java:101)
	.....
IOHelfer:206 ist genau die Zeile, in welcher der obige Code zum Laden des Icons steht.

Was mache ich nur falsch?

Gruß,

Trev
 
Ich habe da wohl einen ziemlich blöden Fehler gemacht: nach jeder Änderung habe ich es wieder mit "javaws" getestet, ohne dabei daran zu denken, dass er das .jar ja immer vom Server bezieht. Da war es dann natürlich egal, ob der Code in meinem lokalen Jar einwandfrei arbeitet.

Die korrekte Lösung war:

Java:
ImageIcon icon_ref = new ImageIcon(Thread.currentThread().getContextClassLoader().getResource("de/home/tinyadmin/resource/bild.png"));

Gruß,

Trev
 

Zurück
Oben