Webstart Problem mit Adressierung bei Laden von Datei aus jar (Webstart)

gunni

Mitglied
Hi,

ich habe hier eine kleine Webstart Anwendung die eine 3ds Datei einlesen und anzeigen soll. Solang ich sie als einfache Java Anwendung ausführe funktioniert auch alle Prima aber wenn ich die Anwendung als Webstart ausliefere gibt es Probleme mit dem zugriff auf die zu ladende Datei.
Vorweg, ich benutze netbeans 6.7.1 (auch zum generieren des ganzen webstart zeugs). Die Datei ist im Projekt direkt neben den Source files platziert und wird auch mit ins Jar gepackt.
Um späteren erklärungen vorzubeugen poste ich gleich nochmal mein jnlp File.

[XML]<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<jnlp codebase="http://127.0.0.1/webstart/" href="launch.jnlp" spec="1.0+">
<information>
<title>Java3dTest</title>
<vendor>gunni</vendor>
<homepage href=""/>
<description>Java3dTest</description>
<description kind="short">Java3dTest</description>


</information>
<security>
<all-permissions/>
</security>
<resources>
<j2se version="1.6+"/>
<jar eager="true" href="Java3dTest.jar" main="true"/>


<jar href="lib/portfolio.jar"/>
</resources>
<application-desc main-class="java3dtest.Welt">

</application-desc>
</jnlp>
[/XML]

Um auf die Datei zugriefen zu können hole ich mir erstmal eine URL mit getResource
Java:
URL fileURL = getClass().getResource("musterecke.3ds");

und erhalte
Code:
http://127.0.0.1/webstart/java3dTest.jar!/java3dtest/musterecke.3ds
soweit so gut.

wenn ich jetz testweise mit einem FileReader versuche anhand der URL (bzw URL.getpath()) darauf zuzugreifen funktioniert das nicht (FileNotFoundException). Dazu der Code:
Java:
FileReader fr = new FileReader(fileURL.getPath());

Ich habe jetzt schon viel herumprobiert. Zum URL laden getSystemresource, wo aber nie eine URL zurück kam. Ich hab den Pfad leicht angepasst auf die unterordner im Jar, was aber auch kein ergebnis lieferte.

Ich bin jetzt mit meinem Laienwissen so ziemlich am Ende und habe folgende Fragen.
Ist eine URL (also http:// usw) überhaupt ein gültiger "Pfad" für eine Java Klasse? Liegt das Ganze evtl daran das der Pfad über "jar Grenzen" hinweg (!) geht? Muss ich das Jar vorher evtl Laden um per Hand die Datei Rausholen bzw Adressieren zu können?
Oder gibt es eine ganz andere Methode wie man Dateien aus Jar Files Laden kann?

Ich bin über jede Hilfe dankbar. Wenn noch Fragen zu irgendwelchen Einzelheiten sind, bitte Stellen. Ich schau hier alle paar Stunden rein.
 
Moin,

wenn Du einen Reader brauchst, dann so:

Java:
final BufferedReader in = new BufferedReader(new InputStreamReader(getClass().getClassLoader().getResourceAsStream("java3dtest/musterecke.3ds")));

in.[..]

in.close();

Das laden von Ressourcen mit irgendwelchen "new File*" Geschichten ist scheinbar nicht auszurotten. Drum merke, wann immer es geht, einen Stream über den Classloader holen.

Gruß,
Fancy
 
Ja ok, so ist das natürlich viel Ordendlicher. Aber darum ging es mir nicht. Ich hab eine Loader Klasse der ich einen Pfad übergeben muss. Es gibt zwar eine Funktion wo ich einen Reader übergeben kann, allerdings bekomm ich da immer nur Null zurück. Ich kann auch leider nicht in den Source da schauen. Es kann gut sein das das einfach nicht implementiert ist.
(Falls zufällig jemand schonmal mit laden von 3ds Modellen zu tun gehabt hat, ich benutze das portfolio der ncsa. Wenn es etwas besseres gibt, bitte her damit 🙂)
 
Hallo,

die Url ist nicht so ganz richtig🙂
Java:
http://127.0.0.1/webstart/java3dTest.jar!/java3dtest/musterecke.3ds

Die JNLP wird von dem Programm javaws.exe abgearbeitet. Dieses lädt die Resoucen (z. B. deine Java3dTest.jar) herunter und speichert diese lokal auf dem Rechner ab. Das Problem dabei ist, daß mit den aktuellen WebStart-Versionen diese Dateien sozusagen verschlüsselt in einem dafür vorgesehenen Verzeichnis ablegt.
Wenn das Programm jetzt gestartet wird, stimmt es zwar, daß die Datei musterecke.3ds auf deinem Server in der jar liegt, aber das ist nicht die jar, welche gerade ausgeführt wird, da das Programm auf den Client und nicht auf den Server läuft.
Den tatsächlichen Pfad zur Datei (jar lokal auf dem Client) kann man meines Wissens nach nicht ermitteln. Deshalb klappt es nicht mit der Url. (Ich hoffe, ich habe jetzt keinen Stuss zusammengeschrieben.)


MfG
hansmueller
 
Ich hab mir inzwischen mal diese ncsa Lib angesehen. Bei mir sind die Ergebnisse damit ähnlich. Beim Weg über den Reader bekomme ich zwar keine Null zurück, stattdessen aber eine leere Szene. Beim Weg über die URL ein "MalformedURLException: no protocol:" (bei http). Sieht für mich zumindest auch so aus, als ob zumindest der 3DS Loader davon nur mit lokalen Dateien umgehen kann.

Eine Empfehlung zu einer anderen Lib kann ich Dir aber leider auch nicht geben, da ich normalerweise weder 3DS noch Java3D Nutzer bin.

Gruß,
Fancy
 
Danke Hansmueller, wenn das was du sagst stimmt hab ich gleich die Argumentation warum ich es nicht "so" lösen konnte 🙂

Gibt es sonst eine Möglichkeit auf Dateien im Jar zuzugreifen? Wie Fancy bestätigt scheint es ja nur möglich zu sein mit dem Loader Dateien über einen Pfad zu öffnen.

Ich habe jetzt weiter etwas herumexperimentiert. Das mit dem Zugriff über einen Stream scheint zu funktionieren.
Java:
InputStream in = getClass().getResourceAsStream("musterecke.3ds");
Ich nehme mit jetzt erstmal den Stream und kopiere mir das File einfach nach "/" (mit hilfe eines einfachen FileOutputStreams) was wohl dann irgendwo in der VM vom Webstart landet.
So wie es bis jetzt aussieht kann ich das geschriebene File ganz normal Adressieren und mit meinem Loader öffnen.
Diese Lösung ist zwar nicht sehr ellegant aber sie funktioniert erstmal. Vielleicht hat ja jemand noch eine Idee wie man es besser machen könnte.
 

Zurück
Oben