Jar-File [Datei nicht gefunden] (im Jar)

buntuswalus

Mitglied
Schönen Abend,

ich ahbe ein (wie ich hoffe kleines Problem). Ich habe ein Programm geschrieben, welches Wetterdaten interpoliert. Dazu werden aus einem im Projekt enthaltenen Ordner "data" CSV-Dateien eingelesen (eine Art Pseudodatenbank).

Das Programm lässt sich aus Eclipse heraus wunderbar ausführen. Wenn ich jedoch das Projekt zu einem runnable Jar-File exportiere ist das Programm nicht mehr lauffähig. Auf der Konsole meldet mein Programm, dass die CSV-Dateien nciht eingelesen werden konnten (FileNotFoundException).

Hier ein Bild von der Struktur und den Zugriffspfaden:

wetterd.jpg


Hat jemand eine schlaue Idee? :rtfm:
 
Zuletzt bearbeitet:
Daten in einer jar ließt, lädt man über

Eine im Jar enthaltene Klasse z.B. Foo

Foo.class.getResourceAsStream("relativerPfadvonFooZurJeweiligenDatei");

Somit bekommt man einen Stream was ja meistens reicht.

Oder man geht einen Umweg und holt sich über class.getResource("selbePfadangabeWieOben") die passsende URL, die man seinem Fiile-Objekt übergibt.
 
Ich kann dir leider nicht ganz folgen 🙂
Die Dateipfade in meinem Bild (die Strings rechts) werden später an Klassen übergeben,
welche diese weiterverarbeiten (lesen, umwandeln, ...). Das einlesen erfolgt so:
Java:
Scanner fileScan = new Scanner(new File(pfad));
"pfad" ist ein String von oben im Bild.

Mich würde interessieren wie ich dies genau ändern muss, damit ich die CSV-Dateien auch in einem Jar-File einlesen kann. ???:L
 
Zuletzt bearbeitet:
Möchte euch nicht dazwischen nudeln, aber:
so wird der Ordner mit den .csv Dateien doch ohne weiteres gar nicht mit ins Archive gepackt oder? (kannst ja mal ins jar schauen)...verschiebe den mal nach oben 😱
 
Java:
Scanner fileScan = new Scanner(Foo.class.getResourceAsStream("PfadVonFooZuDeinerDatei"));
bzw.
Scanner fileScan = new Scanner(Main.class.getResourceAsStream(dateiPfadOrte));

oder ganz anders, könnte auch funktionieren
private static String dateiPfadOrteURL = Main.class.getResource(dateiPfadOrte).getPath();
 
*grübel*
Verstehe ich nicht ganz, was soll da genau passieren?
Ich habe bereits eine klasse die die Daten einliest, warum brauche ich noch eine? :bahnhof:

Die Dateien habe ich nun alle direckt in den src-Ordner gelegt (wird nun mit exportiert).
Den erreiche ich mid "./src/DATEINAME" oder? 🙂

// Update, in Eclipse läuft es mit dem Pfad "./src/DATEINAME" im Jar nicht ;(
 
Zuletzt bearbeitet:
Läuft! Nur noch ein paar Fragen 😉

Wie oben gesagt, hab ich den genauen Fehler erst durch ein Ausführen in der Konsole gefunden.
Stimmt aber, src ist weg nach dem exportieren. Nun hab ich das ganze einfach mal in das Toppackage gelegt:
unbenanntqwk.jpg


Die CSV-Dateien beziehe ich nun so: (Der Code ist in einer Klasse im Package "fileRader")
Java:
Scanner fileScan = new Scanner(this.getClass().getClassLoader().getResourceAsStream(pfad));
und die Pfade zu den beiden Dateien sehen so aus (der Code ist in der Klasse Main):
Java:
// Dateipfade:
	private static String dateiPfadOrte = "wetterInterpolator/orte.csv";
	private static String dateiPfadMesswerte = "wetterInterpolator/messwerte.csv";

Der Link war sehr hilfreich eRaaaa, danke! 🙂
Nun fange ich alngsam an zu verstehen was mir JohannisderKaeufer mitteilen wollte (du hast mich ziehmlich verwirrt 😀).

Letzte 2 Fragen:
Ist meine Implementierung so in Ordnung?
Und mit Classpath ist der Inhalt von src gemeint, oder?
 
Zuletzt bearbeitet:
Ist meine Implementierung so in Ordnung?

Wenn sie funktioniert dann joah ^^ (die Pfade ändern sich ja wohl nicht, d.h. man könnte die auch private static final machen und dann groß schreiben (http://java.sun.com/docs/codeconv/html/CodeConventions.doc8.html#367) aber das nur am Rande

Classpath generell:
PATH and CLASSPATH (The Java™ Tutorials > Essential Classes > The Platform Environment)
Java Blog Buch : 07.03 Einbinden von externen Klassen – Classpath
Galileo Computing :: Java ist auch eine Insel (8. Auflage) – 10.4 Klassenlader (Class Loader)

waren das die Antworten auf deine Fragen? 😳
 
Frage 1: Ja.
Frage 2: Ehm, och nööö^^ Ich bin irgendwie von einer Ja Nein Antwort ausgegangen.. 😀

Naja ich les mich mal durch und ergründe dieses "Vielleicht" 😉
So dann schließ ich mal diese Angelegenheit hier. Danke euch!
 
Ou, eine Frage hab ich noch.

In der Mainmethode habe ich noch ein Icon das ich setze Für das Fenster.
Da ist die Syntax anders als beim Scanner:
Java:
frame.setIconImage(new ImageIcon("src/wetterInterpolator/icon.jpg").getImage());
Was kann ich hier machen? Ich habe hier nun ne halbe stunde rumprobiert.
So läuft es zumindest aus Eclipse heraus, aber das mit dem src (weis ich ja jetzt 😉) kann so aus
einem Jar-file nciht klappen. ???:L
 
Na auch über die URL und getResource(...) (ohne src/)
Java:
java.net.URL imgURL = DeineKlasse.class.getResource(PFAD);
//....
new ImageIcon(imgURL);
 
Java:
java.net.URL imgURL = Main.class.getResource("icon.jpg");		
frame.setIconImage(new ImageIcon(imgURL).getImage());

Klappt wunderpar! Also passt URL auch in den Konstruktor von ImageIcon 🙂
Gerissen 😀

Und getResource(PFAD); sucht ja direkt in dem aktuellen Package. Wunderbar.
So nu aber schlafen🙂 Gute Nacht!

DANKE!!
 
Wollte noch erwähnen dass du den Ordner data mit den csv-Dateien oder was auch immer nicht unbedingt "nach oben" (in den src-Ordner) schieben musst. Du kannst auch in Eclipse rechtsklick -> Build Path -> Use as source folder auswählen (eigentlich was JohannisderKaeufer erwähnt hat). Dann wird er beim Export in die jar gepackt und es ist evtl ein wenig übersichtlicher 😉
 

Neue Themen


Zurück
Oben