Eclipse RCP (e4) Anwendung mit JavaFX / e(fx)clipse - Upgrade Probleme

Björn

Neues Mitglied
Hallo,

gibt es hier Experten die Eclipse RCP (e4) mit JavaFX entwickeln?

Ich habe ein Projekt damals mit Eclipse Luna (4.4.1) und Java 8 erstellt, das ganze auch von SWT auf JavaFX portiert, auch Teile der Open Source SWTChart auf JavaFX portiert. Die Anwendung ist als e4 (RCP) realisiert, hauptsächlich da ich mir hier die Vorteile von Window Management (Views, Editors, Perspectives) verspreche und nutzt e(fx)clipse in Version 1.1.0 um JavaFX innerhalb von Eclipse RCP zu ermöglichen.
Den Code aktualisiere ich innerhalb dieser Umgebung und das geht gut, schöner und mehr Spaß machen würde es mal auf die aktuellen Versionen zu wechseln. Mehrmals versucht, Tage verbracht und immer gescheitert. Auch der Versuch eine Hello-World Eclipse RCP (e4) Applikation mit Java FX zu erstellen scheitert mit den neuen Versionen, habe alle Anleitungen durch, Foren durchsucht....

Ziel: Hello-World Eclipse RCP (e4) mit Java FX auf aktueller Eclipse Platform, Java, JFX, e(fx)clipse - das über Windows CMD gestartet werden kann. Muss nicht .exe sein, kann auch über java ... gestartet werden.
Gerne Eclipse 2012-12 RCP, Adoptium jdk-21.0.5+11, OpenFX javafx-sdk-21.0.5, e(fx)clipse 3.9 - aber auch gerne was von vor 1-2 Jahren was zusammen geht

Versucht habe ich es mit dieser Anleitung https://tomsondev.bestsolution.at/2...efxclipse-rcp-development-for-java11-and-pde/ und diesen Versionen
Eclipse: Eclipse 2019-12 // Eclipse IDE for RCP and RAP Developers (includes incubating components)
JDK: AdoptJDK-11 = Adoptium OpenJDK 11 (LTS) - 11.0.25+9 (64bit Win)
JFX: JavaFX-SDK-11 11.0.2
e(fx)clipse: e(fx)clipse 3.6.0

Mit meinen alten Versionen gibt es dann zwei Schritte um ein Executable zu erstellen: Maven und dann ANT. Wie ich aus anderen Beiträgen verstehe, wird der ANT Schritt so nicht mehr funktionieren (javafxpackager no longer exists), und man müsste eher jlink/jpackage verwenden. Vielleicht brauche ich diesen Schritt auch gar nicht, so lange ich nach dem Maven build die Anwendung über CMD starten könnte.

Nachdem das Maven build geht, bekomme ich ein product (my.app.app.product-win32.win32.x86_64.zip) und auch als entpackte Version. Hier sollte man doch auch die Applikation mit eclipse.exe, die dort enthalten ist, starten können.

Ich bekomme dann
Java:
Unresolved requirement: Require-Capability: osgi.ee; filter:="(&(osgi.ee=JavaSE)(version=11))"

kompletter log:
Code:
!SESSION 2025-01-02 14:57:33.049 -----------------------------------------------
eclipse.buildId=unknown
java.version=11.0.25
java.vendor=Eclipse Adoptium
BootLoader constants: OS=win32, ARCH=x86_64, WS=win32, NL=en_US
Command-line arguments:  -os win32 -ws win32 -arch x86_64

!ENTRY my.app.app 4 0 2025-01-02 14:57:33.665
!MESSAGE FrameworkEvent ERROR
!STACK 0
org.osgi.framework.BundleException: Could not resolve module: my.app.app [9]
  Unresolved requirement: Require-Capability: osgi.ee; filter:="(&(osgi.ee=JavaSE)(version=11))"

    at org.eclipse.osgi.container.Module.start(Module.java:444)
    at org.eclipse.osgi.container.ModuleContainer$ContainerStartLevel.incStartLevel(ModuleContainer.java:1634)
    at org.eclipse.osgi.container.ModuleContainer$ContainerStartLevel.incStartLevel(ModuleContainer.java:1613)
    at org.eclipse.osgi.container.ModuleContainer$ContainerStartLevel.doContainerStartLevel(ModuleContainer.java:1585)
    at org.eclipse.osgi.container.ModuleContainer$ContainerStartLevel.dispatchEvent(ModuleContainer.java:1528)
    at org.eclipse.osgi.container.ModuleContainer$ContainerStartLevel.dispatchEvent(ModuleContainer.java:1)
    at org.eclipse.osgi.framework.eventmgr.EventManager.dispatchEvent(EventManager.java:230)
    at org.eclipse.osgi.framework.eventmgr.EventManager$EventThread.run(EventManager.java:340)

!ENTRY my.app.app 2 0 2025-01-02 14:57:33.861
!MESSAGE Could not resolve module: my.app.app [9]
  Unresolved requirement: Require-Capability: osgi.ee; filter:="(&(osgi.ee=JavaSE)(version=11))"


!ENTRY org.eclipse.osgi 4 0 2025-01-02 14:57:33.862
!MESSAGE Application error
!STACK 1
org.eclipse.core.runtime.CoreException: Plug-in "org.eclipse.fx.ui.workbench.fx" was unable to instantiate class "org.eclipse.fx.ui.workbench.fx.E4MainThreadApplication".
    at org.eclipse.core.internal.registry.osgi.RegistryStrategyOSGI.throwException(RegistryStrategyOSGI.java:194)
    at org.eclipse.core.internal.registry.osgi.RegistryStrategyOSGI.createExecutableExtension(RegistryStrategyOSGI.java:188)
    at org.eclipse.core.internal.registry.ExtensionRegistry.createExecutableExtension(ExtensionRegistry.java:905)
    at org.eclipse.core.internal.registry.ConfigurationElement.createExecutableExtension(ConfigurationElement.java:243)
    at org.eclipse.core.internal.registry.ConfigurationElementHandle.createExecutableExtension(ConfigurationElementHandle.java:55)
    at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:191)
    at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:134)
    at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:104)
    at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:388)
    at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:243)
    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:566)
    at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:653)
    at org.eclipse.equinox.launcher.Main.basicRun(Main.java:590)
    at org.eclipse.equinox.launcher.Main.run(Main.java:1499)
Caused by: java.lang.NoClassDefFoundError: com/sun/javafx/application/PlatformImpl$FinishListener
    at java.base/java.lang.Class.getDeclaredConstructors0(Native Method)
    at java.base/java.lang.Class.privateGetDeclaredConstructors(Class.java:3137)
    at java.base/java.lang.Class.getConstructor0(Class.java:3342)
    at java.base/java.lang.Class.newInstance(Class.java:556)
    at org.eclipse.core.internal.registry.osgi.RegistryStrategyOSGI.createExecutableExtension(RegistryStrategyOSGI.java:184)
    ... 15 more
Caused by: java.lang.ClassNotFoundException: com.sun.javafx.application.PlatformImpl$FinishListener cannot be found by org.eclipse.fx.ui.workbench.fx_3.4.1.201810030600
    at org.eclipse.osgi.internal.loader.BundleLoader.findClassInternal(BundleLoader.java:484)
    at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:395)
    at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:387)
    at org.eclipse.osgi.internal.loader.ModuleClassLoader.loadClass(ModuleClassLoader.java:150)
    at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:527)
    ... 20 more
 
Hallo Björn,

bekommst du den Fehler nur, wenn du die fertig gebaute EXE Starten willst, oder kommt der Fehler auch, wenn du das Product in der IDE starten willst? Wenn es in der IDE funktioniert, dann muss es zwischen der gebauten Anwendung und der IDE irgendeinen Unterschied geben:

Läuft die IDE mit demselben Java, wie die fertige Anwendung? Wenn nicht wäre es einen Versuch Wert, das mal anzupassen und zu schauen, was passiert.

Von den Logausgaben zu Urteilen kann es auch sein, dass Abhängigkeiten vom JavaFX fehlen. Ich habe die Anleitung nicht komplett gelesen, aber mir ist aufgefallen, dass da die Run Configuration um bestimmte Abhängigkeiten erweitert wird. Abhängigkeiten in der Run Configuration hinzuzufügen ist nicht dasselbe, wie Abhängigkeiten im Product einzutragen. Wenn es in der IDE funktioniert und im fertig gebauten nicht, dann kann gut sein, dass entweder im Product oder in der POM Abhängigkeiten fehlen, die in der Run Configuration manuell ausgewählt wurden.
 
Ich habe jetzt noch einiges probiert, mich aber dann kurzerhand entschieden das Projekt in ein plain JavaFX Projekt umzuwandeln. Das hat gut funktioniert, da ich nicht (mehr) viel von RCP verwendet habe. Anfangs hatte ich noch den Event Bus, jetzt war es aber hauptsächlich wegen Perspectives und Views. Plugins etc. habe ich nie gebraucht. Jetzt habe ich erst mal ein vorübergehend etwas statischeres UI mit Tab Panes gebaut um die e4 Views abzulösen.

Der Hinweis mit Product / POM vs Run Configuration hat geholfen, vielen Dank!

Ich bin mir recht sicher dass es daran lag, habe versucht noch etwas zu ergänzen was ich auf https://maven.bestsolution.at/ gefunden habe es aber nicht geschafft. Ich habe es auch mit diesem "Sample using pure maven for e4 application" (https://github.com/BestSolution-at/e4-efxclipse-maven-sample) versucht und gehofft das dies mit "download und build" klappt, jedoch auch ohne Erfolg.

Jedenfalls habe ich dabei mehr über Maven gelernt, mir jetzt mit Hilfe der JavaFX Tutorials alle POMs selbst gebaut und verstehe wie es aufgebaut ist. Bei der früheren RCP / e(fx)clipse Version habe ich die vom Project Wizard generierten verwendet.
 

Zurück
Oben