Nicht .class-Datein in .jar-Dateien einbinden
lima-city → Forum → Programmiersprachen → Java
aufruf
beispiel
bild
buffer
byte
catch
datei
fis
funktion
gen
handbuch
klasse
main
null
ordner
package
phosphat
tip
verzeichnis
window
-
Hallo,
ich habe da ein Problem wozu ich seit l?ngerem keine L?sung gefunden habe:
Wenn ich ein Java Programm geschrieben habe und dazu ein Handbuch verfasse als .pdf oder was auch immer, dann m?chte ich dieses nat?rlich durch Knopfdruck im Programm aufrufen k?nnen. Das ist aber nicht mein Problem, denn das ist ja nun noch recht trivial. Mein Problem ist es, dass wenn ich dieses Programm nun als ausf?hrbare .jar-Datei exportiere (z.B. mit Eclipse) m?chte ich nat?rlich das er das Handbuch in dieser jar Datei verwendet.
Allerding findet er das Handbuch nicht obwohl es in der jar Datei enthalten ist. Es funktioniert erst wenn ich neben der jar Datei noch einen Ordner habe in dem das Handbuch liegt und welcher genauso hei?t wie der in der jar Datei.
Beispiel:
Ich habe die Datei Proggi.jar erstellt in welcher sich die Datei Handbuch\Handbuch.pdf befindet. So ist es auch im Quellcode angegeben und so funktioniert es vor dem exportieren.
Wenn ich nun aber die jar Datei ausf?hren will muss ich den Ordner Handbuch\Handbuch.pdf im selben Verzeichnis wie die jar Datei erstellen damit er es findet.
Ich w?sste jetzt gerne einen Weg wie ich das umgehen kann und ihm klar mache, dass er das Handbuch aus der jar Datei ?ffnen soll.
F?r Tips/L?sungen w?re ich sehr dankbar.
Gru?,
Phosphat -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Hi, das gleiche Problem hat mich auch schonmal fast zum kotzen gebracht
1. Wenn du es so schreibst:
Handbuch\Handbuch.pdf , dann sucht er nicht in deiner jar, sondern in dem Verzeichnis in dem deine jar liegt.
Am besten du erstellst ein package, namens Handbuch in deiner jar, und legst dort deine pdf ab. Nun gibst du den Pfad so an: /Handbuch/Handbuch.pdf
Wenn du nun neu exportierst, dann sucht er dank des / in deiner jar.
Hoffe ist irgendwie klar.
- Gru? KaraHead -
Hallo,
erstmal danke das es ?berhaupt Jemand versucht :)
Den Slash hab ich nat?rlich gemacht, ich hab nur in meiner Fragestellung den Backslash verwendet, warum auch immer... Jedenfalls funktioniert es so trotzdem nicht.
Mitlerweile habe ich auch eine L?sung gefunden. Naja was hei?t ich, ein Freund hat mir gezeigt wie es geht. Nachfolgend der Quelltexte, anhand dessen man es eigentlich nachvollziehen k?nnen sollte. Zumdindest die Leute die sowas gebrauchen k?nnen sollten es verstehen :)
F?r Bilder ist das noch recht einfach, da gen?gt folgender Code um ein ImageIcon aus einer Deitei im Jar zu erstellen.
ImageIcon ii;
Object o = MainFrame.class.getResource("Pictures/bild.gif");
if (o!=null)
ii = new ImageIcon((URL)o);
else
{
o = new ImageIcon("Pictures/bild.gif");
if (o!=null)
ii = new ImageIcon("Pictures/bild.gif");
else
ii = new ImageIcon(new byte[200]);
}
MainFrame ist die Klasse welche durch main instanziiert wird, wobei es egal ist ob eine Klasse mit main Funktion diese aufruft oder die Klasse selbst die main Funktion erh?lt. Pictures muss ein Unterpackage von dem Package sein in welchem die class Datei liegt. Bei mir iste das z.B. das Package gui mit gui.Pictures.
Wenn man nun eine PDF Datei ?ffnen will wird das ganze etwas komplizierter und Umfangreicher:
File f = new File("Pictures/Handbuch.pdf");
if (!f.exists()) {
try {
f = File.createTempFile("handbuch",".pdf");
FileOutputStream fo = new FileOutputStream(f);
BufferedOutputStream bo = new BufferedOutputStream(fo);
FileUtils.copy(MenuAction.class.getResourceAsStream("Pictures/Handbuch.pdf"),bo);
bo.close(); fo.close();
} catch (IOException e3) {
e3.printStackTrace();
}}
if(System.getProperty("os.name").toLowerCase().indexOf("windows") > -1)
{
try {
Runtime.getRuntime().exec ("rundll32 url.dll,FileProtocolHandler "+f.getAbsolutePath());
}
catch(IOException e2){
e2.printStackTrace();
}
}
Der zweite try-catch Block dient nur zum aufrufen unter Windows, ist also nebens?chlich. Auch hier ist Pictures wieder ein UnterPackages von dem Package in welchem die class Datei liegt und MenuAction ist die Datei welche das Handbuch aufruft. Im ersten Try-catch Block wird FileUtils.copy aufgerufen in welcher die eigentlich arbeit stattfindet:
public static void copy(InputStream fis, OutputStream fos) throws IOException {
try {
byte buffer[] = new byte[0xffff];
int nbytes;
while ((nbytes = fis.read(buffer)) != -1)
fos.write(buffer, 0, nbytes);
} catch (IOException e) {
throw e;
} finally {
if (fis != null)
try {
fis.close();
} catch (IOException e) {
}
try {
if (fos != null)
fos.close();
} catch (IOException e) {
}
}
}
So wirklich hab ich die Funktion copy noch nicht durchschaut, aber es funktioniert so und das hat mir gereicht. Vielleicht hilft es ja Jemandem weiter...
Gru?,
Phosphat -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage