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:
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.
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.
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.
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
Du hast die Wette gewonnen 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?
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
(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:
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?
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
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