[英]Loading javaFx into Apache felix
I'm trying to load javafx into a swing based software that follows the OSGi implementation. 我正在尝试将javafx加载到遵循OSGi实现的基于swing的软件中。 The thing is, whenever i try to instanciate any class from FX it gives me ClassDefNotFoundException.
问题是,每当我尝试从FX实例化任何类时,它都会给我ClassDefNotFoundException。
I already tried some solutions from other posts but nothing changes. 我已经尝试过其他帖子的一些解决方案但没有任何变化
This is part of my POM: 这是我POM的一部分:
<plugin>
<groupId>org.apache.felix</groupId>
<artifactId>maven-bundle-plugin</artifactId>
<configuration>
<instructions>
<Import-Package>!javafx.embed.swing.JFXPanel,*</Import-Package>
<Embed-Dependency>
*;scope=compile;inline=true,
javafx.embed.swing.JFXPanel;scope=compile;inline=true
</Embed-Dependency>
<Embed-StripVersion>true</Embed-StripVersion>
</instructions>
</configuration>
</plugin>
This is the command that gives me the exception: 这是给我例外的命令:
JFXPanel J = new JFXPanel();
And this is the exception: 这是例外:
Exception in thread "AWT-EventQueue-0" java.lang.NoClassDefFoundError: javafx/embed/swing/JFXPanel
at br.com.test.SampleTool.<init>(SampleTool.java:87)
at br.com.test.SampleToolFactory.createDataExplorerView(SampleToolFactory.java:62)
at org.weasis.base.ui.internal.Activator.dataExplorerChanged(Activator.java:118)
at org.weasis.base.ui.internal.Activator.lambda$serviceChanged$2(Activator.java:110)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:311)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:756)
at java.awt.EventQueue.access$500(EventQueue.java:97)
at java.awt.EventQueue$3.run(EventQueue.java:709)
at java.awt.EventQueue$3.run(EventQueue.java:703)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:80)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:726)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:82) Caused by: java.lang.ClassNotFoundException: javafx.embed.swing.JFXPanel
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at org.apache.felix.framework.ExtensionManager$ExtensionManagerWiring.getClassByDelegation(ExtensionManager.java:1010)
at org.apache.felix.framework.BundleWiringImpl.searchImports(BundleWiringImpl.java:1595)
at org.apache.felix.framework.BundleWiringImpl.findClassOrResourceByDelegation(BundleWiringImpl.java:1525)
at org.apache.felix.framework.BundleWiringImpl.access$400(BundleWiringImpl.java:79)
at org.apache.felix.framework.BundleWiringImpl$BundleClassLoader.loadClass(BundleWiringImpl.java:2018)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
... 18 more
This instruction need to be fixed: 该指令需要修复:
<Embed-Dependency>
*;scope=compile;inline=true,
javafx.embed.swing.JFXPanel;scope=compile;inline=true
</Embed-Dependency>
Embed-Dependency works with artifacts , but javafx.embed.swing.JFXPanel
is a class . Embed-Dependency与工件一起使用 ,但
javafx.embed.swing.JFXPanel
是一个类 。
Therefore, you need to specify artifacts that have all the JavaFX classes you need. 因此,您需要指定包含所需JavaFX类的工件。
Then you should remove this line : 然后你应该删除这一行:
<Import-Package>!javafx.embed.swing.JFXPanel,*</Import-Package>
Because you want to import this class. 因为您要导入此类。
I believe, you are looking for something like this: 我相信,你正在寻找这样的东西:
<build>
<plugins>
<plugin>
<groupId>org.apache.felix</groupId>
<artifactId>maven-bundle-plugin</artifactId>
<extensions>true</extensions>
<configuration>
<instructions>
<Embed-Dependency>groupId=javafx;artifactId=jfxrt;version=8.0;inline=true</Embed-Dependency>
</instructions>
</configuration>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>javafx</groupId>
<artifactId>jfxrt</artifactId>
<version>8.0</version>
<type>jar</type>
<scope>system</scope>
<systemPath>${java.home}/lib/ext/jfxrt.jar</systemPath>
</dependency>
</dependencies>
Alternatively, you can add JavaFX as system packages: like this 或者,您可以将JavaFX添加为系统包: 像这样
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.