zur Probe wollte ich eine kleine Animation in ein JAR-Archiv packen, um
es auf anderen Computern zu testen.
Dummerweise scheitert es ja schon am JAR-Archiv. Verzeichnisse und
verwendete Textdateien zum Einlesen der Grafiken werden einfach nicht
gefunden?
Meine Manifest-Datei:
Main-Class: PaintMain
Depends-On: ladeliste.txt ziffern/eins.png ziffern/zwei.png
ziffern/drei.png ziffern/vier.png ziffern/fuenf.png
(Enter wurde nach dieser Zeile gedrückt, also wird sie nicht ignoriert)
So packe ich alles ins Archiv:
jar cvfm Zaehler.jar MainManifest *.class ziffern ladeliste.txt
Die Ausgabe sieht vielversprechend aus:
Manifest wurde hinzugefügt.
Hinzufügen von: ImageLoader.class (ein = 3699) (aus = 1855) (komprimiert
49 %)
Hinzufügen von: ImagePlayer.class (ein = 1092) (aus = 599) (komprimiert
45 %)
Hinzufügen von: PaintGUI.class (ein = 929) (aus = 591) (komprimiert 36 %)
Hinzufügen von: PaintMain.class (ein = 608) (aus = 381) (komprimiert 37 %)
Hinzufügen von: ShowImagePanel$1.class (ein = 792) (aus = 459)
(komprimiert 42 %)
Hinzufügen von: ShowImagePanel.class (ein = 2766) (aus = 1503)
(komprimiert 45 %)
Hinzufügen von: ziffern/ (ein = 0) (aus = 0) (gespeichert 0 %)
Hinzufügen von: ziffern/eins.png (ein = 1324) (aus = 1329) (komprimiert 0 %)
Hinzufügen von: ziffern/zwei.png (ein = 1985) (aus = 1990) (komprimiert 0 %)
Hinzufügen von: ziffern/drei.png (ein = 1710) (aus = 1715) (komprimiert 0 %)
Hinzufügen von: ziffern/vier.png (ein = 1224) (aus = 1229) (komprimiert 0 %)
Hinzufügen von: ziffern/fuenf.png (ein = 1901) (aus = 1906) (komprimiert
0 %)
Hinzufügen von: ladeliste.txt (ein = 66) (aus = 54) (komprimiert 18 %)
Trotzdem bekomme ich beim Starten des Archivs folgendes:
$ java -jar Zaehler.jar
java.io.FileNotFoundException: ladeliste.txt (No such file or directory)
at java.io.FileInputStream.open(Native Method)
at java.io.FileInputStream.<init>(FileInputStream.java:106)
at java.io.FileInputStream.<init>(FileInputStream.java:66)
at java.io.FileReader.<init>(FileReader.java:41)
at ImageLoader.loadImageArray(ImageLoader.java:46)
at ShowImagePanel.<init>(ShowImagePanel.java:40)
at PaintGUI.drawGUI(PaintGUI.java:15)
at PaintMain.main(PaintMain.java:11)
Exception in thread "main" java.lang.NullPointerException
at ImagePlayer.<init>(ImagePlayer.java:16)
at ShowImagePanel.<init>(ShowImagePanel.java:41)
at PaintGUI.drawGUI(PaintGUI.java:15)
at PaintMain.main(PaintMain.java:11)
In Eclipse funktioniert es natürlich. Es liegt also definitiv an keinem
falschen Pfad. Was ist hier los?
Markus
1. benutz ein package, nicht das default package
> at java.io.FileReader.<init>(FileReader.java:41)
> at ImageLoader.loadImageArray(ImageLoader.java:46)
Du kannst resourcen aus dem JAR nicht mit einem File Reader lesen, sondern
musst ueber den Classloader, z.b. getReseouceAsStream("/bla/fasel") machen.
Gruss
Bernd
Bernd Eckenfels schrieb:
> Du kannst resourcen aus dem JAR nicht mit einem File Reader lesen, sondern
> musst ueber den Classloader, z.b. getReseouceAsStream("/bla/fasel") machen.
Ok, da kann ich wohl lange probieren. Wozu dient dann die Option
"Depends-On" im Manifest-File?
Hab ich noch nie gesehen/benutzt.
Gruss
Bernd
Ich stieß auch erst vorher darauf, als ich eine Lösung zu diesem Problem
suchte.
Übrigens habe ich Probleme, ein File mit einem derartigen InputStream
einzulesen. Wie geht man hier vor?
Bei dne Grafiken scheint es zu funktionieren:
BufferedImage bufImage =
ImageIO.read(ImageIO.createImageInputStream(this.getClass().getResourceAsStream(imgname)));
Aber wie sieht es bei einer Textdatei aus?
Ich versuche schon die ganze Zeit sämtlich Reader, und bin derweil zu
folgendem Ergebnis gekommen:
BufferedInputStream fileinput = new
BufferedInputStream(this.getClass().getResourceAsStream(arrayFileName));
Dummerweise kann ich nun kein readline() mehr ausführen und ein read()
liefert mir ein int zurück. Wie könnt man hier am besten vorgehen?
Danke im Voraus,
Markus
BufferedReader fileInput = new BufferedReader(new InputStreamReader(this.getClass().getResourceAsStream(arrayFileName)));
kannst du nehmen.
Gruss
Bernd
Bernd Eckenfels schrieb:
> BufferedReader fileInput = new BufferedReader(new InputStreamReader(this.getClass().getResourceAsStream(arrayFileName)));
Vielen Dank. So funktioniert sowohl das Einlesen, als auch das JAR-Archiv.
Markus