File wird in der .Jar nicht gefunden

Karaa

Mitglied
Hallo liebe Commuinty,

ich habe mir ein kleines Programm geschrieben welches aus einer einfachen .txt Datei Wörter in mehrere ArrayLists speichert. Das Programm funktioniert in der IDE einwandfrei und es kommt zu keinen Exceptions. Beim bilden und ausführen einer .jar dieses Programmes bekomme ich folgende Exception:

Code:
java.io.FileNotFoundException: src\main\resources\words.txt (Das System kann den angegebenen Pfad nicht finden)
        at java.base/java.io.FileInputStream.open0(Native Method)
        at java.base/java.io.FileInputStream.open(FileInputStream.java:213)
        at java.base/java.io.FileInputStream.<init>(FileInputStream.java:155)
        at java.base/java.util.Scanner.<init>(Scanner.java:639)
        at robot.Robot.fillWords(Robot.java:35)
        at robot.Robot.<init>(Robot.java:27)
        at robot.EasyMode.<init>(EasyMode.java:60)
        at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
        at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
        at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
        at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:500)
        at java.base/java.lang.reflect.ReflectAccess.newInstance(ReflectAccess.java:166)
        at java.base/jdk.internal.reflect.ReflectionFactory.newInstance(ReflectionFactory.java:404)
        at java.base/java.lang.Class.newInstance(Class.java:591)
        at javafx.fxml.FXMLLoader$ValueElement.processAttribute(FXMLLoader.java:936)
        at javafx.fxml.FXMLLoader$InstanceDeclarationElement.processAttribute(FXMLLoader.java:980)
        at javafx.fxml.FXMLLoader$Element.processStartElement(FXMLLoader.java:227)
        at javafx.fxml.FXMLLoader$ValueElement.processStartElement(FXMLLoader.java:752)
        at javafx.fxml.FXMLLoader.processStartElement(FXMLLoader.java:2722)
        at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2552)
        at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2466)
        at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3237)
        at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3194)
        at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3163)
        at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3136)
        at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3113)
        at javafx.fxml.FXMLLoader.load(FXMLLoader.java:3106)
        at robot.MenuScene.easyButtonClicked(MenuScene.java:25)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.base/java.lang.reflect.Method.invoke(Method.java:567)
        at com.sun.javafx.reflect.Trampoline.invoke(MethodUtil.java:76)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.base/java.lang.reflect.Method.invoke(Method.java:567)
        at com.sun.javafx.reflect.MethodUtil.invoke(MethodUtil.java:273)
        at com.sun.javafx.fxml.MethodHelper.invoke(MethodHelper.java:83)
        at javafx.fxml.FXMLLoader$MethodHandler.invoke(FXMLLoader.java:1782)
        at javafx.fxml.FXMLLoader$ControllerMethodEventHandler.handle(FXMLLoader.java:1670)
        at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:86)
        at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238)
        at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191)
        at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59)
        at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58)
        at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
        at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
        at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
        at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
        at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
        at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74)
        at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:49)
        at javafx.event.Event.fireEvent(Event.java:198)
        at javafx.scene.Node.fireEvent(Node.java:8890)
        at javafx.scene.control.Button.fire(Button.java:203)
        at com.sun.javafx.scene.control.behavior.ButtonBehavior.mouseReleased(ButtonBehavior.java:206)
        at com.sun.javafx.scene.control.inputmap.InputMap.handle(InputMap.java:274)
        at com.sun.javafx.event.CompositeEventHandler$NormalEventHandlerRecord.handleBubblingEvent(CompositeEventHandler.java:218)
        at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:80)
        at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238)
        at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191)
        at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59)
        at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58)
        at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
        at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
        at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
        at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
        at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
        at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74)
        at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:54)
        at javafx.event.Event.fireEvent(Event.java:198)
        at javafx.scene.Scene$MouseHandler.process(Scene.java:3862)
        at javafx.scene.Scene.processMouseEvent(Scene.java:1849)
        at javafx.scene.Scene$ScenePeerListener.mouseEvent(Scene.java:2590)
        at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:409)
        at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:299)
        at java.base/java.security.AccessController.doPrivileged(AccessController.java:391)
        at com.sun.javafx.tk.quantum.GlassViewEventHandler.lambda$handleMouseEvent$2(GlassViewEventHandler.java:447)
        at com.sun.javafx.tk.quantum.QuantumToolkit.runWithoutRenderLock(QuantumToolkit.java:412)
        at com.sun.javafx.tk.quantum.GlassViewEventHandler.handleMouseEvent(GlassViewEventHandler.java:446)
        at com.sun.glass.ui.View.handleMouseEvent(View.java:556)
        at com.sun.glass.ui.View.notifyMouse(View.java:942)
        at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
        at com.sun.glass.ui.win.WinApplication.lambda$runLoop$3(WinApplication.java:174)
        at java.base/java.lang.Thread.run(Thread.java:830)

Die jar Datei findet den Pfad zur .txt Datei nicht. Allerdings ist die .txt Datei in der Jar vorhanden.
Könntet ihr mir helfen wie ich dieses Problem lösen könnte?

Hier die Methode meines Programmes:
Java:
public void fillWords() {

        try {
            // Füge die Wörter aus der .txt Datei in die Wordlist rein
            File words = new File("src/main/resources/words.txt");
            Scanner scanner = new Scanner(words);
            while (scanner.hasNextLine()) {
                String data = scanner.nextLine();
                wordList.add(data);
            }
            scanner.close();

            for (String word : wordList) { // befülle die einfache Liste mit Wörtern der Länge 4 bis 6

                if (word.length() == 4 || word.length() == 5 || word.length() == 6) {
                    easyWords.add(word);
                }
            }

            for (String word : wordList) { // befülle die normale Liste mit Wörtern der Länge 6 und 7
                if (word.length() == 6 || word.length() == 7) {
                    normalWords.add(word);
                }
            }

            for (String word : wordList) { // befülle die schwere Liste mit Wörtern der Länge 7 bis 10
                if (word.length() == 7 || word.length() == 8 || word.length() == 9 || word.length() == 10) {
                    hardWords.add(word);
                }
            }

            Collections.shuffle(easyWords); // Mischt die Wörter der Listen zufällig
            Collections.shuffle(normalWords);
            Collections.shuffle(hardWords);
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
 
Ressourcen in der Jar sollte man mit Class#getResourceAsStream laden. Das ganze gibt dann einen Input-Stream zurück, den du dem Scanner übergeben kannst.
Das ganze als File zu behandeln funktioniert nur, wenn das wirklich als Datei im Dateisystem liegt, was ja in diesem Fall nicht so ist.

Außerdem muss der Pfad angepasst werden, den Ordner „src/main/resources“ gibt es in der Jar nicht mehr, dort ist der Dateipfad wahrscheinlich direkt „/words.txt“
 
Ressourcen in der Jar sollte man mit Class#getResourceAsStream laden. Das ganze gibt dann einen Input-Stream zurück, den du dem Scanner übergeben kannst.
Das ganze als File zu behandeln funktioniert nur, wenn das wirklich als Datei im Dateisystem liegt, was ja in diesem Fall nicht so ist.

Außerdem muss der Pfad angepasst werden, den Ordner „src/main/resources“ gibt es in der Jar nicht mehr, dort ist der Dateipfad wahrscheinlich direkt „/words.txt“
Cool erklärt!
 

Neue Themen


Zurück
Oben