OpenJDK mit openJfx

Hallo zusammen

Ich bin meine letzten zwei Java Programme am Updaten auf OpenJDK. Bis jetzt lief das einigermassen gut. Nun die letzten zwei sind in Kombination mit JavaFX programmiert worden und das ist ja in OpenJDK nicht mehr vorhanden.

Nun bin ich soweit dass es im eclipse läuft. Dazu musste ich der VM ein paar Argumente übergeben, aber soweit ist das in Ordnung. Will ich jetzt aber, das .jar file aus der Eingabeaufforderung starten kommen viele Fehler. Folgender Befehl führe ich aus:

java --module-path "C:\Program Files\Java\openjfx-18.0.1\javafx-sdk-18.0.1\lib" --add-modules javafx.controls,javafx.fxml -jar Sortimat.jar

Ihr seit am Text "Main / main | Programm gestartet das der generelle Start funktionieren würde

Kann sich jemand vorstellen was das Problem sein könnte? ich Verwende OpenJDK in der Version 16 und OpenJFX in der Version 18.

Vielen Dank schonmal für eure Hilfe

Von beiden Technologien (in diesen Versionen) habe ich keine Ahnung. Noch weniger von der Kombination aus beiden. Aber … wenn es aus Eclipse heraus läuft, müßte es ja auch außerhalb laufen.

Ein „Trick“, den ich gelegentlich verwendet habe, wenn es darum geht, irgendeine Anwendung, die man normalerweise (mit all ihren dependencies und der Magie, die Eclipse halt für einen regelt) aus Eclipse heraus startet, dann doch mal an der Kommandozeile zu starten:

  • Die Anwendung starten
  • In der ‚Debug‘-View mit rechts auf die Instanz klicken (ist auch egal, ob sie schon ‚terminated‘ ist)
  • „Properties“ im Popup-Menü auswählen
  • Im Fenster erscheint dann die ‚Command Line‘, die verwendet wurde, um das ganze zu starten.

Falls sich das nicht dramatisch geändert hat (mit dem ganzen neumodischen „Modul“-Kram …), dann sollte man diese Kommandozeile direkt an der Console eingeben können, um das Programm wieder genau so zu starten, wie aus Eclipse raus.

Kannst Du mal die Main Klasse Zeigen?

Hallo headnut,
hast Du denn die geforderten Module in das Projekt mit eingebunden?
Wenn das Projekt die Module nicht kennt, so wird es diese beim packetieren auch nicht einbeziehen.

Vielen Dank schonmal für die wertvollen Tipps.

Meine Command Line sieht folgendermassen aus, aus dem eclipse kopiert:

"C:\Program Files\Java\jdk-16.0.2\bin\javaw.exe" -XX:+ShowCodeDetailsInExceptionMessages -agentlib:jdwp=transport=dt_socket,suspend=y,address=localhost:49911 --module-path "C:\Program Files\Java\openjfx-18.0.1\javafx-sdk-18.0.1\lib" --add-modules javafx.controls,javafx.fxml -javaagent:C:\Users\RS\eclipse\java-2022-03\eclipse\configuration\org.eclipse.osgi\516\0\.cp\lib\javaagent-shaded.jar -Dfile.encoding=Cp1252 -classpath "E:\workspace\E_2279_Sortimat_MKW3 3V0\target\classes;E:\workspace\Utils_V2\bin;C:\Users\RS\.m2\repository\org\hsqldb\hsqldb\2.6.1\hsqldb-2.6.1.jar;C:\Users\RS\.m2\repository\com\jgoodies\jgoodies-common\1.7.0\jgoodies-common-1.7.0.jar;C:\Users\RS\.m2\repository\com\jgoodies\jgoodies-looks\2.5.3\jgoodies-looks-2.5.3.jar;C:\Users\RS\.m2\repository\org\apache\logging\log4j\log4j-api\2.18.0\log4j-api-2.18.0.jar;C:\Users\RS\.m2\repository\org\apache\logging\log4j\log4j-core\2.18.0\log4j-core-2.18.0.jar;C:\Users\RS\.m2\repository\org\openjfx\javafx-controls\18.0.1\javafx-controls-18.0.1.jar;C:\Users\RS\.m2\repository\org\openjfx\javafx-controls\18.0.1\javafx-controls-18.0.1-win.jar;C:\Users\RS\.m2\repository\org\openjfx\javafx-graphics\18.0.1\javafx-graphics-18.0.1.jar;C:\Users\RS\.m2\repository\org\openjfx\javafx-graphics\18.0.1\javafx-graphics-18.0.1-win.jar;C:\Users\RS\.m2\repository\org\openjfx\javafx-base\18.0.1\javafx-base-18.0.1.jar;C:\Users\RS\.m2\repository\org\openjfx\javafx-base\18.0.1\javafx-base-18.0.1-win.jar;C:\Users\RS\.m2\repository\org\openjfx\javafx-fxml\18.0.1\javafx-fxml-18.0.1.jar;C:\Users\RS\.m2\repository\org\openjfx\javafx-fxml\18.0.1\javafx-fxml-18.0.1-win.jar" ch.kaiser.view.Main

Aus meiner Sicht ist diese so nicht brauchbar…

Das hier ist meine main:

image

Ich denke auch das irgendwie nicht alles mitkommt…

Ich stehe da im Moment tatsächlich auf dem Schlauch… in eclipse weiterhin Problemlos, in der Console kommt folgende Fehlermeldung:

WARNING: sun.reflect.Reflection.getCallerClass is not supported. This will impact performance.
Main / main | Programm gestartet
Exception in Application constructor
java.lang.reflect.InvocationTargetException
        at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:119)
        at java.base/java.lang.reflect.Method.invoke(Method.java:577)
        at javafx.graphics@18.0.1/com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(LauncherImpl.java:465)
        at javafx.graphics@18.0.1/com.sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.java:364)
        at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:104)
        at java.base/java.lang.reflect.Method.invoke(Method.java:577)
        at java.base/sun.launcher.LauncherHelper$FXHelper.main(LauncherHelper.java:1081)
Caused by: java.lang.RuntimeException: Unable to construct Application instance: class ch.kaiser.view.Main
        at javafx.graphics@18.0.1/com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:891)
        at javafx.graphics@18.0.1/com.sun.javafx.application.LauncherImpl.lambda$launchApplication$2(LauncherImpl.java:196)
        at java.base/java.lang.Thread.run(Thread.java:833)
Caused by: java.lang.reflect.InvocationTargetException
        at java.base/jdk.internal.reflect.DirectConstructorHandleAccessor.newInstance(DirectConstructorHandleAccessor.java:79)
        at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499)
        at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:483)
        at javafx.graphics@18.0.1/com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$8(LauncherImpl.java:803)
        at javafx.graphics@18.0.1/com.sun.javafx.application.PlatformImpl.lambda$runAndWait$12(PlatformImpl.java:484)
        at javafx.graphics@18.0.1/com.sun.javafx.application.PlatformImpl.lambda$runLater$10(PlatformImpl.java:457)
        at java.base/java.security.AccessController.doPrivileged(AccessController.java:399)
        at javafx.graphics@18.0.1/com.sun.javafx.application.PlatformImpl.lambda$runLater$11(PlatformImpl.java:456)
        at javafx.graphics@18.0.1/com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:96)
        at javafx.graphics@18.0.1/com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
        at javafx.graphics@18.0.1/com.sun.glass.ui.win.WinApplication.lambda$runLoop$3(WinApplication.java:184)
        ... 1 more
Caused by: java.lang.NoClassDefFoundError: datenbank/verbinden
        at ch.kaiser.datenbank.DatenbVerb.initDB(DatenbVerb.java:102)
        at ch.kaiser.datenbank.DatenbVerb.<init>(DatenbVerb.java:36)
        at ch.kaiser.view.Main.<init>(Main.java:125)
        at java.base/jdk.internal.reflect.DirectConstructorHandleAccessor.newInstance(DirectConstructorHandleAccessor.java:67)
        ... 11 more
Caused by: java.lang.ClassNotFoundException: datenbank.verbinden
        at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641)
        at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)
        at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
        ... 15 more
Exception running application ch.kaiser.view.Main

Eher aus Neugier: Warum bezeichnest du die Command Line als ‚nicht brauchbar‘? (*)

Anscheinend hast du im ‚Debug‘-Modus gestartet. Deswegen tauchen dort einige Sachen auf, die mit agent... zu tun haben. Die könnte man manuell entfernen, aber du kannst auch im nicht-Debug-Modus starten: Die Instanz sollte trotzdem in der Debug-View auftauchen, und die Command Line sollte dann „sauberer“ sein (d.h. ohne alles, was mit dem Debugger zu tun hat).

Und… was passiert, wenn du die Command line (bevorzugt vom nicht-Debug-run) einfach mal an der Kommandozeile einfügst?

(*) Ja, in der Command Line stehen erstmal viele absolute Pfade drin. Das ist für eine echte Verwendung natürlich unsinnig, aber für den ersten Test ist es egal. Es geht erstmal nur daraum, rauzufinden, welche JARs/Pfade man überhaupt braucht.

Ich bin jetzt bis Freitag unterwegs, danke für die Tipps. Ich melde mich am Freitag

Laut deinem Stacktrace liegt das Problem darin, dass er eine Klasse „datenbank.verbinden“ nicht finden kann. Wieso es per Eclipse funktioniert kann icht nicht sagen, aber letztendlich kann Java deine Application Klasse nicht erstellen, weil im Konstruktor eben dieser Fehler auftritt

Wenn ich wetten müßte, würde ich tippen, dass diese Klasse in

  • E:\workspace\E_2279_Sortimat_MKW3 3V0\target\classes oder
  • E:\workspace\Utils_V2\bin

liegt :slight_smile:

Du hast die Wette gewonnen :slight_smile: Aber warum muss diese plötzlich von Hand in den Befehl eingegeben werden? Normalerweise hat die Eclipse mit exportiert. Ist das weil ich nun plötzlich argumente mitgebe?

Oder weil du bei Eclipse einfach nicht den richtigen Export gewählt hast?

Hab jetzt schon länger kein Eclipse mehr verwendet, im Gegensatz zu IntelliJ meinte ich aber, war das immer sehr leicht eine .jar zu exportieren.

Wieder ein bißchen raten: Du hast das Projekt unter E:\workspace\E_2279_Sortimat_MKW3 3V0 exportiert, wahrscheinlich irgendwas mit „Rechtsklick → Export as JAR“ oder so. Und dabei ist die Sortimat.jar entstanden. In dieser JAR ist aber erstmal nicht das drin, was in einen anderen Projekt liegt. Im speziellen ist da nicht das drin, was in Utils_V2 liegt.

Man kann den JAR-Export tweaken und genau konfigurieren, was da drin sein soll, aber das kann ein Pain-In-The-Back sein.

Einfacher wäre es vermutlich, wenn du dein Utils_V2 projekt auch als JAR exportierst (halt in eine Utils_V2.jar). Dann solltest du sie einfach beim Start mit angeben können, grob sowas wie

javaw [...] -classpath Utils_V2.jar -jar Sortimat.jar

(in dem […] steht das ganze „modules“-Zeug, von dem ich noch keine Ahnung habe). Zumindest denke ich, dass das so gehen sollte, sofern das Module-Handling einem da keinen Strich durch die Rechnung macht…

Ja der export ohne Argumente mache ich gleich und der funktioniert. Die Frage ist tatsächlich ob Eclipse da unterscheidet. Ich probiere jetzt mal das von Marco aus.

Das Problem bleibt dasselbe. Ich habe den aufruf nun aus Eclipse kopiert, ein wenig angepasst und ausgeführt:

Java --module-path "C:\Program Files\Java\openjfx-18.0.1\javafx-sdk-18.0.1\lib" --add-modules javafx.controls,javafx.fxml -Dfile.encoding=Cp1252 -classpath "E:\workspace\E_2279_Sortimat_MKW3 3V0\target\classes;E:\workspace\Utils_V2\bin;C:\Users\RS\.m2\repository\org\hsqldb\hsqldb\2.3.1\hsqldb-2.3.1.jar;C:\Users\RS\.m2\repository\com\jgoodies\jgoodies-common\1.7.0\jgoodies-common-1.7.0.jar;C:\Users\RS\.m2\repository\com\jgoodies\jgoodies-looks\2.5.3\jgoodies-looks-2.5.3.jar;C:\Users\RS\.m2\repository\org\apache\logging\log4j\log4j-api\2.18.0\log4j-api-2.18.0.jar;C:\Users\RS\.m2\repository\org\apache\logging\log4j\log4j-core\2.18.0\log4j-core-2.18.0.jar;C:\Users\RS\.m2\repository\org\openjfx\javafx-controls\18.0.1\javafx-controls-18.0.1.jar;C:\Users\RS\.m2\repository\org\openjfx\javafx-controls\18.0.1\javafx-controls-18.0.1-win.jar;C:\Users\RS\.m2\repository\org\openjfx\javafx-graphics\18.0.1\javafx-graphics-18.0.1.jar;C:\Users\RS\.m2\repository\org\openjfx\javafx-graphics\18.0.1\javafx-graphics-18.0.1-win.jar;C:\Users\RS\.m2\repository\org\openjfx\javafx-base\18.0.1\javafx-base-18.0.1.jar;C:\Users\RS\.m2\repository\org\openjfx\javafx-base\18.0.1\javafx-base-18.0.1-win.jar;C:\Users\RS\.m2\repository\org\openjfx\javafx-fxml\18.0.1\javafx-fxml-18.0.1.jar;C:\Users\RS\.m2\repository\org\openjfx\javafx-fxml\18.0.1\javafx-fxml-18.0.1-win.jar" -jar Sortimat.jar

Am ende kommt das Programm im Main eine Zeile weit und dann knallt es:

java.lang.reflect.InvocationTargetException
        at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:119)
        at java.base/java.lang.reflect.Method.invoke(Method.java:577)
        at javafx.graphics@18.0.1/com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(LauncherImpl.java:465)
        at javafx.graphics@18.0.1/com.sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.java:364)
        at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:104)
        at java.base/java.lang.reflect.Method.invoke(Method.java:577)
        at java.base/sun.launcher.LauncherHelper$FXHelper.main(LauncherHelper.java:1081)
Caused by: java.lang.RuntimeException: Unable to construct Application instance: class ch.kaiser.view.Main
        at javafx.graphics@18.0.1/com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:891)
        at javafx.graphics@18.0.1/com.sun.javafx.application.LauncherImpl.lambda$launchApplication$2(LauncherImpl.java:196)
        at java.base/java.lang.Thread.run(Thread.java:833)
Caused by: java.lang.reflect.InvocationTargetException
        at java.base/jdk.internal.reflect.DirectConstructorHandleAccessor.newInstance(DirectConstructorHandleAccessor.java:79)
        at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499)
        at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:483)
        at javafx.graphics@18.0.1/com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$8(LauncherImpl.java:803)
        at javafx.graphics@18.0.1/com.sun.javafx.application.PlatformImpl.lambda$runAndWait$12(PlatformImpl.java:484)
        at javafx.graphics@18.0.1/com.sun.javafx.application.PlatformImpl.lambda$runLater$10(PlatformImpl.java:457)
        at java.base/java.security.AccessController.doPrivileged(AccessController.java:399)
        at javafx.graphics@18.0.1/com.sun.javafx.application.PlatformImpl.lambda$runLater$11(PlatformImpl.java:456)
        at javafx.graphics@18.0.1/com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:96)
        at javafx.graphics@18.0.1/com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
        at javafx.graphics@18.0.1/com.sun.glass.ui.win.WinApplication.lambda$runLoop$3(WinApplication.java:184)
        ... 1 more
Caused by: java.lang.NoClassDefFoundError: datenbank/verbinden
        at ch.kaiser.datenbank.DatenbVerb.initDB(DatenbVerb.java:102)
        at ch.kaiser.datenbank.DatenbVerb.<init>(DatenbVerb.java:36)
        at ch.kaiser.view.Main.<init>(Main.java:125)
        at java.base/jdk.internal.reflect.DirectConstructorHandleAccessor.newInstance(DirectConstructorHandleAccessor.java:67)
        ... 11 more
Caused by: java.lang.ClassNotFoundException: datenbank.verbinden
        at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641)
        at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)
        at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
        ... 15 more
Exception running application ch.kaiser.view.Main

So ein Gefrickel. Als nach der „Main-Klasse“ gefragt wurde, war sicher kein Screenshot der main-Methode gemeint. Wie die aussieht, wissen wir. Die Frage ist, wo diese Klasse datenbank.verbinden rumliegt (falls das wirklich eine Klasse ist - ich glaube langsam, das ist nur ein String, der wo-auch-immer herkommt…), und warum die bei at ch.kaiser.datenbank.DatenbVerb.initDB(DatenbVerb.java:102) gemeldet wird. Was ist denn in Zeile 102 dieser DatenbVerb-Klasse?

ha… Ich gehe dem mal nach. Anscheinend gibt es da ein Problem mit meinen eigenen Klassen…

Das DatenbVerb ist ein eigenes Projekt bei mir. Nun habe ich das alles direkt in mein Sortimat Projekt programmiert und es geht.

Nun gibt es massenhaft neue Fehler, aber überall werden auf solche externen Projekte verwiesen. Das ist in diesem Fall mein Problem :slight_smile:

Voila, das waren nicht viele aufrufe… Die habe ich aus dem externen Projekt genommen und im neuen ausgeschrieben. Seither funktioniert das alles wie gewünscht :slight_smile:

Danke euch für die Unterstützung