ich habe eine Webseite, die innerhalb einer Jar-Datei abgelegt ist und möchte diese im Standard-Browser öffnen.
So lange die Datei auf dem System direkt greifbar ist, funktioniert das tadellos mit Hilfe der Klasse [JAPI]Desktop[/JAPI]. Keine Idee habe ich allerdings für den Fall, wenn die Webseite innerhalb einer Jar-Datei liegt.
Problem 1: Ich muss wohl den absoluten Pfad angeben? Das ist immer Mist, weil ich nicht weiß, wohin der Benutzer das Programm kopiert.
Problem 2: Wenn im Pfad ein Leerzeichen ist, gibt es einen Fehler, der darauf hinweist, dass sich an Position x ein ungültiges Zeichen im Pfad befindet.
Problem 3: Wenn ich den Pfad mit gültigen Zeichen ausstatte, bekomme ich Fehlermeldungen, die so, oder so ähnlich aussehen:
Ungültige Zeichen kannst du ja mit URLDecoder oder wie die klasse hieß, umwandeln. Damit hast du wenigstens ein Problem weniger. Aber da Problem #3 vorhanden ist, ändert das nicht viel. Keine Möglichkeit, die Datei in Temp zu entpacken?
Also ich glaube nicht, dass das direkt geht, da der Browser nicht wirklich weiß, wie er Resourcen in einem Jar findet.
wenn das mit TEMP-folder/file nicht gewuenscht ist, koenntest du naturelich auch einen kleinen Webserver starten, der die Datei ausliefert und der Browser muss dann nur localhost:irgendeinport/help.html aufrufen.
[QUOTE=AmunRa]Also ich glaube nicht, dass das direkt geht, da der Browser nicht wirklich weiß, wie er Resourcen in einem Jar findet.
wenn das mit TEMP-folder/file nicht gewuenscht ist, koenntest du naturelich auch einen kleinen Webserver starten, der die Datei ausliefert und der Browser muss dann nur localhost:irgendeinport/help.html aufrufen.[/QUOTE]
Stimmt, das jar protocol ist ja nur in Java drin, hab ich vergessen
@AmunRa , gute Idee. Ich habe keine Ahnung, ob das Programm mal auf einem System zum Einsatz kommt, das in dieser Hinsicht Restriktionen unterliegt.
Ich habe daher den Vorschlag von @PositiveDown umgesetzt. Ich denke, eine temporäre Datei kann man auf jedem System schreiben?
Meine funktionierende Lösung in Form einer Methode sieht nun so aus:
if (Desktop.isDesktopSupported()) {
File temp = null;
try {
temp = File.createTempFile("help", ".html"); //temporäre Datei im Standard-Temp-Verzeichnis erzeugen
temp.deleteOnExit(); //löschen, wenn Programm beendet wird
//Datei aus Jar-Datei einlesen
//-relativer Pfad mit getClass().getResourceAsStream(...) für Stream funktioniert offenbar nicht
//-Angabe einer Klasse aus dem Verzeichnis der html-Datei funktioniert
Scanner scan = new Scanner(MainController.class.getResourceAsStream("help.html"));
StringBuilder content = new StringBuilder();
while (scan.hasNextLine()) {
content.append(scan.nextLine()).append("
");
}
//Dateiinhalt in temporäre Datei kopieren/schreiben
Files.write(Paths.get(temp.getAbsolutePath()), content.toString().getBytes());
} catch (IOException ex) {
System.err.out(ex);
JOptionPane.showMessageDialog(this, "Fehler beim Erzeugen der Hilfedatei!
Die Hilfedatei kann daher nicht angezeigt werden.", "java.io.IOException", JOptionPane.ERROR_MESSAGE);
return;
}
try {
//temporäre Datei im Webbrowser anzeigen
Desktop desk = Desktop.getDesktop();
desk.browse(temp.toURI());
} catch (IOException ex) {
System.err.out(ex);
JOptionPane.showMessageDialog(this, "Fehler bei der Ausgabe der Hilfedatei im Webbrowser!", "java.io.IOException", JOptionPane.ERROR_MESSAGE);
}
}
}```
Probleme gab es mit `getClass().getResourceAsStream("../help.html")`. Wenn die HTML-Datei in einem anderen Verzeichnis als die einbindende Klasse liegt, wird eine [japi]NullPointerException[/japi] geworfen.
Ich wollte die Datei aber gerne etwas zentraler ablegen. Mit Angabe einer Klasse (die auch in der einbindenden Klasse referenziert wird) aus dem Verzeichnis der HTML-Datei hat das aber funktioniert.
Leg die Resource ins root-Verzeichnis, dann geht getClass().getResourceAsStream("/help.html"), wenn du es in ein package legen moechtest z.B. de.test
dann eben getClass().getResourceAsStream("/de/test/help.html"), dann hast du nie ein Problem und kannst die Resouce von jeder Klasse aus laden.
Vielleicht aber auch nicht. Denn ich hatte gerade den Gedanken, dass man ja vor dem Kopieren/Schreiben der temporären Datei noch einige Platzhalter in der HTML-Datei mit Daten füllen (austauschen) könnte. Bspw. Titel, Version etc. pp.