Korrekte Pfadangaben damit eine .jar Datei unter Windwos läuft.

snuff

Mitglied
Hallo zusammen

Ich habe ein Programm geschrieben und möchte dies nun als executable jar file speichern und nutzen. Das Problem ist, dass die .jar Datei bei einem Doppelklick nicht startet. (keine Fehlermeldung oder Ähnlichens)

In der Entwicklungsumgebung funktioniert das Programm einwandfrei. Wenn ich die .jar Datei via cmd starte sehe ich, dass das Programm immer dort eine NullPointerException wirft, wo mit Pfaden gearbeitet wird, z.B. beim Laden von Bildern oder beim Speichern von Dateien.

Alle Daten sind im jar file selbst abgelegt. Die Pfade sind relativ zum Projektverzeichnis.
Wenn ich das soweit richtig verstanden habe muss unter Windows die Pfadangabe so erfolgen:
Code:
src\\name\\nochEinName\\usw...

Gibt es sonst noch was zu beachten damit das .jar file funktioniert? Weshalb mir die Konsole eine NullPointerExcepttion an dieser Stelle ausgibt ist mir auch nicht schlüssig, zumal ich eher eine FileNotFoundException erwarten würde.
 

snuff

Mitglied
Beispiel:
Eine Klasse speicher in einem Ordner namens "save" Dateien. Beim Programmstart wird überprüft welche Dateien schon vorhanden sind. Folgender Code gibt mir ein String Array mit den Dateinamen:

Code:
File folder = new File("src\\MyProgram\\userinterface\\save\\");
        File[] listOfFiles = folder.listFiles();
        String[] fileNames = new String[listOfFiles.length]; //Das ist Zeile 194

Die cmd gibt mit diese Meldung:
exception.png
 

Thallius

Top Contributor
Das kann nicht gehen da es diesen Ordner natürlich nicht gibt. Und in das .jar File kannst du sowieso nicht schreiben. Du must dir also eine andere Lösung suchen.

Gruß

Claus
 

snuff

Mitglied
Weiteres beispiel:

Beim Laden von Icons.
Mit dieser Methode werden Icons geladen:
Code:
public static ImageIcon loadIcon(String strBild) {
        MediaTracker tracker = new MediaTracker(p);
        ImageIcon icon = new ImageIcon(Utility.class.getResource("..\\images\\icons\\" + strBild)); //das ist Linie 52
        tracker.addImage(icon.getImage(), 0);
        try {
            tracker.waitForID(0);
        } catch (InterruptedException ex) {
            System.out.println("Fehler beim Laden.");
        }
        return icon;
    }

Danach soll ein MenuItem ein Icon laden:
Code:
JMenuItem menuItem = new JMenuItem("Help",Utility.loadResourceIcon("blueIcons\\16x16\\help.png")); //das ist Linie 87

Worauf mit die cmd folgendes gibt:

image hosting
 

Thallius

Top Contributor
Zuncähst mal würde ich mir angewöhnen File.separator zu benutzen. Das macht das Leben deutlich einfacher wenn dein Programm auch mal unter Linux oder Mac laufen soll. Diese ollen Backslashes von Windows sind nämlich ziemlich überholt.

Die Pfadangabe ist auf jeden Fall Mist da .. am Anfang bedeutet, dass er eine Ebene nach oben gehen soll. Das aus dem .jar heraus kann wieder nicht funktionieren da das .jar in dem Moment nunmal das root ist. Mich würde es sogar nicht einmal wundern wenn die Dateien gar nicht in deinem jar drin sind. Hast Du da mal reingesehen?
 

snuff

Mitglied
Das aus dem .jar heraus kann wieder nicht funktionieren da das .jar in dem Moment nunmal das root ist.

Wie würde man dann im jar file korrekt referenzieren? Die Bilder sind in einem Ordner namens "images", dieser wiederum ist eine Ebene höher als die ganzen .java Dateien.

Hast Du da mal reingesehen?

Wenn cih das jar file z.B. mit 7Zip öffne dann sind da alle Bilder zu sehen, also ja.
 

mrBrown

Super-Moderator
Mitarbeiter
Zuncähst mal würde ich mir angewöhnen File.separator zu benutzen. Das macht das Leben deutlich einfacher wenn dein Programm auch mal unter Linux oder Mac laufen soll. Diese ollen Backslashes von Windows sind nämlich ziemlich überholt.
File.separator ist Unsinn, das ist genauso überholt. Einfach '/' benutzen.

Die Pfadangabe ist auf jeden Fall Mist da .. am Anfang bedeutet, dass er eine Ebene nach oben gehen soll. Das aus dem .jar heraus kann wieder nicht funktionieren da das .jar in dem Moment nunmal das root ist. Mich würde es sogar nicht einmal wundern wenn die Dateien gar nicht in deinem jar drin sind. Hast Du da mal reingesehen?
in getResource bedeutet das, aus dem aktuellem package eins hoch wechseln.

Wie würde man dann im jar file korrekt referenzieren? Die Bilder sind in einem Ordner namens "images", dieser wiederum ist eine Ebene höher als die ganzen .java Dateien.
Zeig einmal deine genaue Ordnerstruktur. Prinzipiell müsste getResource("../images/icons/" + strBild)) passend sein
 

snuff

Mitglied
Hallo

Danke für die schnellen Antworten

Die Ordnerstruktur sieht wie folgt aus:


Entschuldigt die schreckliche Visualisierung aber ich weiss gerade nicht wie ich auf die schnelle eine Ordnerstruktur schön darstellen kann.
 

snuff

Mitglied
Code:
class.getResource("/images/icons/" + strBild))
führt zur Exception

Code:
class.getResource("../images/icons/" + strBild))
Funktioniert in der Entwicklungsumgebung, führt als .jar File zur Exception beim Aufruf von:
Code:
JMenuItem menuItem = new JMenuItem("Help",Utility.loadIcon("blueIcons/16x16/help2.png"));
 

snuff

Mitglied
Sry ich bin noch absoluter Programmier-Anfänger und kenne noch viele Teile der Java-Wicht.

Code:
class.getResource("/MyProgram/images/icons/" + strBild))
führt zur Exception.

Utility.class.getResource()liefert mir doch einen relativen Ressourcennamen, die Utility ist wiederum eine Ebene Tiefer (MyProgram.tools). Kann dann dieser Pfad überhaupt stimmen?

Kann man Pfade evt relativ zum Root-Verzeichnis des Projektes setzten? Falls ja was ist das Root-Verzeichnis? "MyProgram"? "src"?
 

snuff

Mitglied
Also wir kommen der Sache schon deutlich näher.

Code:
class.getResource("/MyProgram/images/icons/" + strBild))
Funktioniert. Die Exception wurde geworfen weil beim Aufruf noch ein "falscher" "\\" mitgegeben wurden.
Ich bin nun durchs ganze Programm gegangen und habe alle Dopper-Backslashes wieder durch normale Slashes ersetzt. Das .jar File lässt sich nun sogar starten.

Schon mal vielen Dank!

Allerdings gibt es noch Kleinigkeiten bei denen ich den Fehler noch nicht sehe.

Code:
menuItem = new JMenuItem("Help",Utility.loadIcon("blueIcons/16x16/help2.png"));
funktioniert Problemlos.


Hingegen wirft folgendes eine Exception.
Code:
btInfo = new JButton("Info",Utility.loadIcon("blueIcons/24x24/info2.png"))

Der JButton funktioniert in der Entwicklungsumgebung, aber in der .jar file nicht. Wenn ich das jar file mit 7Zip öffne sind beide Verzeichnisse sowie Dateien da.

In der Konsole wird wieder beim Versuch diesen JButton zu instanzieren eine NullPointerException von der Utility geworfen.
 

snuff

Mitglied
Noch eine Ergänzung.

Wie Oben erwähnt speichert das Programm auch Daten ab. Und wie ich ebenfalls erfahren habe können keine Dateien in das jar file geschrieben werden.

Ich habe das so gelöst dass der Benutzer zuerst via JFileChooser einen Pfad wählen muss und die Dateien dann dort gespeichert und geladen werden. Das funktioniert so weit ohne Probleme.

Jetzt möchte ich aber auch Dateien laden können, welche sich im jar file befinden. (Nur laden, nicht Speichern. Es handelt sich dabei um Default-Werte des Programmes welche geladen werden sollen)

Auch hier wirft mir Java eine Exception wenn ich diese Datei aus dem jar file laden möchte.
Die Dateien sind in src/MyProgram/userinterface/save abgelegt. Die dazugehörige Klasse ist in src/MyProgram/userinterface

Im Moment werden die Dateien noch so geholt:
Code:
importFile = new FileInputStream("src/MyProgram/userinterface/save/Default.ser");

Das Funktioniert in der Entwicklungsumgebung aber nicht im -jar File. Wie bekomme ich dort den korrekten Pfad?
 

snuff

Mitglied
Wie wird das genau implementiert?
Code:
importFile = class.getResourceAsStream(...)
importFile =  (FileInputStream) this.getClass().getResourceAsStream(...);

ersteres geht gar nicht und zweiteres akzeptiert der Compiler, aber beim Ausführen kommt eine CastException (BufferedInputStream zu FileInputStream)
 

mrBrown

Super-Moderator
Mitarbeiter
Ja, die Methode gibt dir keinen FileInputStream zurück, sondern einen InputStream. Änder deine Nutzung von FileInputStream zu InputStream und das klappt ;)
 

Thallius

Top Contributor
File.separator ist Unsinn, das ist genauso überholt. Einfach '/' benutzen.

Seit wann ist es Unsinn einen OS unabhängigen Define zu benutzen? Mag ja sein, dass Windows mittlerweile schlau genug ist das es auch / versteht aber dann kommt einer und lässt es auf einem anderen Betriebssystem, das Du vielleicht gar nicht kennst , laufen und das # als Separator benutzt und schon ist dein / fürn Ar.....

Claus
 

mrBrown

Super-Moderator
Mitarbeiter
Seit wann ist es Unsinn einen OS unabhängigen Define zu benutzen? Mag ja sein, dass Windows mittlerweile schlau genug ist das es auch / versteht aber dann kommt einer und lässt es auf einem anderen Betriebssystem, das Du vielleicht gar nicht kennst , laufen und das # als Separator benutzt und schon ist dein / fürn Ar.....
Mag überraschend für dich sein, aber Java händelt sowas für dich ;) Völlig egal was das OS als Separator benutzt, '/' ist für Pfade der richtige Separator.

In class.getResource dürfte '\' btw zu Fehlern führen - im Gegensatz zu '/'
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
R Datentypen Korrekte integer in Hex ASCII Konvertierung und serialisierung Allgemeine Java-Themen 1
R Threads korrekte Synchronisation bei Vector und ArrayList Allgemeine Java-Themen 6
Tippster Input/Output relative Pfadangaben Allgemeine Java-Themen 6
O Java-Applikation tut in Netbeans, als JAR nicht, wegen Pfadangaben einer benötigten Datei Allgemeine Java-Themen 8
BattleMaster246 Resource Pfadangaben Allgemeine Java-Themen 4
C Pfadangaben Allgemeine Java-Themen 6
D Pfadangaben unter Java Allgemeine Java-Themen 8
S Problem mit Pfadangaben Allgemeine Java-Themen 2
berserkerdq2 Habe ein svg bild, kann ich das zu svg koordinaten umrechnen, damit ich den Umriss zeichnen kann? Wenn ja wie? Allgemeine Java-Themen 1
Calli11 Was muss ich hier in die Main schreiben, damit das Programm ausgeführt wird? Allgemeine Java-Themen 4
R Methoden Was fehlt mir bzw. muss ich bei der Methode countHarshabNumbers ändern damit ich die Harshad Zahlen im Intervall [51, 79] zählen kann? Allgemeine Java-Themen 19
R Was muss ich ändern, damit der Kreis links unten gezeichnet wird? Allgemeine Java-Themen 17
S Ist das Neuzuweisen von Feldern atomic und damit Thread-Safe? Allgemeine Java-Themen 2
antonbracke Aus Jar eine Class laden und damit arbeiten! Allgemeine Java-Themen 5
S Wie reicht man am Besten Zahlenwerte von der GUI zum Code, der damit arbeitet? Allgemeine Java-Themen 10
F Plugin damit M$ Word Java syntax versteht? Allgemeine Java-Themen 12
C Strings zu groß um damit zu arbeiten Allgemeine Java-Themen 31
M wie dateien speichern damit sie platform unabhängig sind? Allgemeine Java-Themen 2
S Sun Zertifizierungen, wer hat Erfahrungen damit? Allgemeine Java-Themen 28

Ähnliche Java Themen

Neue Themen


Oben