habe jetzt ne weile hier im Forum gesucht aber irgendwie nicht das gefunden welches meine Frage beantwortet. Irgendwie steh ich glaub ich etwas auf dem Schlauch.
Folgendes Problem:
Ich habe ein Tool geschrieben in dem per Button-Klick eine HTML-Seite in einem JEditorPane gezeigt wird. Wenn die HTML-Dateien im gleichen Projekt bzw. in der gleichen Jar liegen, funktioniert es einwandfrei.
Jetzt wollte ich die ganzen HTML-Dateien in eine Jar packen und dann während der Laufzeit drauf zugreifen. Die Jar ist als externe Jar importiert worden. Als eine Möglichkeit habe ich dies gefunden.
Die Frage die ich mir stelle ist, welche Klasse ich hier angeben muss, um auf die jar zuzugreifen. In der Jar sind ja gar keine Klassen sonder nur HTML-Dateien.
Pack doch in das Jar-File noch eine Klasse - entweder nur einen Dummy, oder Du findest noch sinnvolle Funktionalität (z.B. eine main-Methode, die eine Fehlermeldung, eine Versionsnummer oder ein Verzeichnis der HTML-Seiten ausgibt). Auf jeden Fall sollte irgendeine Klasse im Jar-File sein, damit Du diese Klasse dann im Code verwenden kannst, um über ihren Classloader auf andere Ressourcen im Jar-File zuzugreifen.
wichtig ist zu wissen, wo sich diese Jar-Datei mit den html-Dateien befindet.
Wenn sie im Classpath (z. B. im Manifest) eingetragen ist, kannst du auf deren Inhalt automatisch zugreifen.
danke mal für eure Antworten. Irgendwie klappt das aber noch nicht. Ich habe nun eine Dummy-Klasse hinzugefügt, die nur den Rumpf der main methode hat.
Ich habe nun folgendes gemacht:
Ich habe eine Jar-Datei die nennt sich HTML.jar. Die Struktur dieser jar sieht folgendermaßen aus:
-HTML.jar
--html
---HTML.class
---Seite1.html
---Seite2.html
--META-INF
---MANIFEST.MF
Diese Jar-Datei habe ich mittels Import-Funktion von Eclipse in mein Projekt importiert und es befindet sich im resources-Ordner meines Projektes. Mit Rechtsklick auf die Jar-Datei und mit Klick auf Add to Build Path, füge ich die Jar der ClassPath hinzu, welches ich dann unter Referenced Libraries, in meinem Projekt, finde.
So nun versuche ich darauf zuzugreifen mit
Java:
ClassLoader classLoader = HTML.class.getClassLoader();InputStream is = classeLoader.getResourceAsStream("/html/Seite1.html";
Hier wird mein is aber "null". Genauso bei
Java:
InputStream is = classeLoader.getResourceAsStream("html/Seite1.html";
und bei
Java:
InputStream is = classeLoader.getResourceAsStream("Seite1.html";
Eine Klasse im jar ist nicht notwendig, wenn das jar-File im CLASSPATH eingebunden ist kann man die html Datei z.B. mit:
Java:
InputStream is =getClass().getResourceAsStream("html/Seite1.html");
oder
Java:
InputStream is =IrgendeineKlasse.class.getResourceAsStream("html/Seite1.html");
Bsp.:
tester.jar enthält Testing.class mit entsprechender Zeile im Code
res.jar enthält html.Seite1.html
beide jar-Files liegen im selben Verzeichnis
dann kann aus dem Verzeichnis heraus das Programm mit
java -classpath tester.jar;res.jar Testing
gestartet werden und die html-Datei auslesen.
Entscheiden ist nur, dass das jar-File im CLASSPATH aufgeführt wird.
hab dein Beispiel ausprobiert (mit einer jar mit /html/HTML.class und /html/Seite1.html) Ich komme nur in meiner Anwendungsklasse Main.class an die Ressource wenn ich ein "/" vor das html/Seite1.html mache.
Über den Classloader der HTML.class geht es wie du sagtest: einfach "html/Seite1.html"
Über den Classloader der Main.class (Anwenderklasse) muss es "/html/Seite1.html" heissen.
Sind das Unterschiede in der Such-Art und Weise? Einmal relativ und einmal absolut?
Ok ich denke ich habs wieder gerafft. (Vergesse sowas immer leicht...)
Es gibt wohl Unterschiede ob ich:
MeineKlasse.class.getResourceAsStream(...) aufrufe oder ob ich:
MeineKlasse.class.getClassLoader().getResourceAsStream(...) aufrufe.