JavaFX JavaFX Jar ausführbar jedoch nicht alle Stages

Davee

Mitglied
Moin,

ich habe ein etwas umfangreicheres Programm programmiert mit JavaFX 11, Java 15, SQLite und einem Modul aus der SpringBoot Library.
Jedenfalls konnte ich das Programm zu einer Jar exportieren, indem ich eine "Launcher-Klasse" erstellt habe, die die JavaFX Main Klasse aufruft. Das muss man ja bei Java 9+ so machen, da die JavaFX SDK nicht mehr in Java integriert ist oder sowas.
Jedenfalls lässt sich das Programm auch ausführen, wenn ich nun eine neue Stage aufrufen möchte, kommt ein Fehlercode aus der Konsole:

[CODE title="Fehlercode aus Powershell"]PS E:\IntelliJ\Android\Projects\PasswordManager\out\artifacts\PasswordManager_jar2> java -jar .\PasswordManager.jar
Exception in thread "JavaFX Application Thread" java.lang.RuntimeException: java.lang.reflect.InvocationTargetException
at javafx.fxml.FXMLLoader$MethodHandler.invoke(FXMLLoader.java:1787)
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:54)
at javafx.event.Event.fireEvent(Event.java:198)
at javafx.scene.Scene$ClickGenerator.postProcess(Scene.java:3564)
at javafx.scene.Scene$ClickGenerator.access$8200(Scene.java:3492)
at javafx.scene.Scene$MouseHandler.process(Scene.java:3860)
at javafx.scene.Scene$MouseHandler.access$1200(Scene.java:3579)
at javafx.scene.Scene.processMouseEvent(Scene.java:1849)
at javafx.scene.Scene$ScenePeerListener.mouseEvent(Scene.java:2588)
at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:397)
at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:295)
at java.base/java.security.AccessController.doPrivileged(AccessController.java:391)
at com.sun.javafx.tk.quantum.GlassViewEventHandler.lambda$handleMouseEvent$2(GlassViewEventHandler.java:434)
at com.sun.javafx.tk.quantum.QuantumToolkit.runWithoutRenderLock(QuantumToolkit.java:390)
at com.sun.javafx.tk.quantum.GlassViewEventHandler.handleMouseEvent(GlassViewEventHandler.java:433)
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:831)
Caused by: java.lang.reflect.InvocationTargetException
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:78)
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:78)
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:1784)
... 31 more
Caused by: java.lang.IllegalStateException: Location is not set.
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2459)
at javafx.fxml.FXMLLoader.load(FXMLLoader.java:2435)
at de.login.Controller.register(Controller.java:63)
... 43 more[/CODE]

Ich kann leider nichts aus dem Code entnehmen, da es ja wie gesagt aus der Powershell ist und nicht in der IDE.. Weiß da jemand weiter?


EDIT: Ich weiß auch nicht wirklich wo genau die Datenbanken erstellt werden. Normalerweise wurden sie während der Entwicklung immer in dem Projektordner erstellt aber ich habe ja nur eine einzige Jar. Werden die Datenbanken, wenn das Programm funktionieren würde, dann in der Jar erstellt?
 
Guck dir mal den StackTrace an den du da siehst. Das erzaehlt dir, von oben nach unten:

  1. Eine RuntimeException ist aufgetreten, ohne Text aber mit dem grundlegenden Fehler "InvocationTargetException".
  2. "Caused by" sagt dir dass die naechste Exception in der Kette eine "java.lang.reflect.InvocationTargetException" ohne Text ist.
  3. Zweites "Caused by" sagt dir dass die letzte Exception in der Kette eine "java.lang.IllegalStateException" ist mit dem Text "Location is not set."
Letztere ist aufgetreten im "FXMLLoader", und der Einsprungpunkt von deinem Code wird "at de.login.Controller.register(Controller.java:63)" sein. Also, was steht auf "Controller.java:63"? Vermutlich das laden von einer JavaFX XML Datei ohne einen gueltigen Ort.
 
Guck dir mal den StackTrace an den du da siehst. Das erzaehlt dir, von oben nach unten:

  1. Eine RuntimeException ist aufgetreten, ohne Text aber mit dem grundlegenden Fehler "InvocationTargetException".
  2. "Caused by" sagt dir dass die naechste Exception in der Kette eine "java.lang.reflect.InvocationTargetException" ohne Text ist.
  3. Zweites "Caused by" sagt dir dass die letzte Exception in der Kette eine "java.lang.IllegalStateException" ist mit dem Text "Location is not set."
Letztere ist aufgetreten im "FXMLLoader", und der Einsprungpunkt von deinem Code wird "at de.login.Controller.register(Controller.java:63)" sein. Also, was steht auf "Controller.java:63"? Vermutlich das laden von einer JavaFX XML Datei ohne einen gueltigen Ort.
Ja richtig. Das Programm versagt an der Stelle an der es eine neue FXML File laden soll. Ich weiß aber nicht wieso.. Hier der Code an der Stelle:
[CODE lang="java" title="Methode die ausgeführt wird:" highlight="5, 7"]public void register() {
try {
// Hier wird wohl der Ort der FXML Datei nicht gefunden. In der IDE funktioniert
// diese Art von "Ortsangabe", in der Jar jedoch nicht.
FXMLLoader loader = new FXMLLoader(getClass().getResource("../register/registerModel.fxml"));
// Hier beim Laden kommt der Fehler
Parent root = loader.load();
loader.getController();
Scene scene = new Scene(root, 300, 275);
Stage stage = new Stage();
stage.setScene(scene);
stage.setResizable(false);
stage.setMinHeight(1000.00);
stage.setMinWidth(1920.00);
stage.show();

} catch (IOException e) {
e.printStackTrace();
}
}[/CODE]



EDIT: Ich hab inzwischen rausgefunden dass es auf jeden Fall am Pfad der angegebenen FXML Datei liegen muss. Ich habe viel gegoogelt aber ich habe mein Problem nicht lösen können, egal ob ich relative oder absolute Pfade angebe. Die einzige Art und Weise wie es in der IDE funktioniert ist mit führenden "../". Ich habe aber rausfinden können ( https://stackoverflow.com/questions...ath-for-fxml-files-css-files-images-and-other ), dass das mit zwei Punkten in einer Jar nicht funktionieren kann.
 
Zuletzt bearbeitet:
Ich habe die Lösung zu meinem Problem gefunden.
Ich habe folgende Zeile:

Java:
FXMLLoader loader = new FXMLLoader(getClass().getResource("../register/registerModel.fxml"));

durch folgende Zeile ersetzt:

Java:
FXMLLoader loader = new FXMLLoader(RegisterController.class.getResource("registerModel.fxml"));

Erklärung:
RegisterController entspricht meiner Klasse/meinem Controller für die FXML Datei.
.class ruft die Klasse auf und .getResource bekommt den Dateinamen der FXML Datei übergeben.

Mit dieser Methode funktioniert es sowohl in der .jar Application als auch in der IDE.
 

Zurück
Oben