java - 将 javaFx 加载到 Apache felix 中

标签 java swing maven javafx apache-felix

我正在尝试将 javafx 加载到遵循 OSGi 实现的基于 swing 的软件中。 问题是,每当我尝试实例化 FX 中的任何类时,它都会出现 ClassDefNotFoundException。

我已经尝试了其他帖子中的一些解决方案,但没有任何变化。

这是我的 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>

这是给我带来异常的命令:

JFXPanel J = new JFXPanel();

这是一个异常(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

最佳答案

此指令需要修复:

<Embed-Dependency>
*;scope=compile;inline=true,
javafx.embed.swing.JFXPanel;scope=compile;inline=true
</Embed-Dependency>

嵌入依赖可与 Artifact 配合使用,但javafx.embed.swing.JFXPanel是一个

因此,您需要指定包含您需要的所有 JavaFX 类的 Artifact 。

那么你应该删除这一行:

<Import-Package>!javafx.embed.swing.JFXPanel,*</Import-Package>

因为你想导入这个类。

我相信,您正在寻找这样的东西:

    <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>

或者,您可以将 JavaFX 添加为系统包:like this

关于java - 将 javaFx 加载到 Apache felix 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41945199/

相关文章:

java - Android http连接无法连接到本地主机可以连接到外部网站

具有重试和故障转移功能的 Java 线程/进程

java - DefaultTreeModel 和 Wicket 树 : setAsksAllowsChildren doesn't work

java - 在 GUI 上切换 'always on top'

Java Swing 图像幻灯片显示为什么图片不改变

eclipse - 安装Maven Integration for Eclipse WTP时出错

java - 我如何确定一个点是否在我的三角形内?

java - 使用对象标识符作为变量名

java - 在启动预集成和后集成时分别运行单元测试和 IT 测试

java - hibernate 一对多单向