如何在 OSGi 包中使用 JavaFX 2.2?我正在使用 Apache Felix,所以它不是 eclispe 项目。它必须在安装了 Java7 的 Mac OSX 上运行(Java6 会很酷但不是必需的)。
我已经阅读了一些关于重新打包 jfx 库的内容,但对于 eclispe 插件项目。
仅在 bundle Manifest 中导入 javafx 包就创建了缺少需求 osgi.wiring.package 异常。
如何在 OSGi 包中使用 JavaFX 2.2?我正在使用 Apache Felix,所以它不是 eclispe 项目。它必须在安装了 Java7 的 Mac OSX 上运行(Java6 会很酷但不是必需的)。
我已经阅读了一些关于重新打包 jfx 库的内容,但对于 eclispe 插件项目。
仅在 bundle Manifest 中导入 javafx 包就创建了缺少需求 osgi.wiring.package 异常。
可能有点晚了,但我想记录一种在 OSGi 环境中启用 JavaFX 的简单方法,以防像我这样的任何人仍然无法做到这一点......
问题是,您需要允许 JavaFX 有可能加载和使用它想要的任何类(JavaFX 使用 JRE 的内部结构,这使得它很难捆绑),所以您真正想要的是让它访问 OSGi提升类路径...
我不是专家,但在这篇博客中,来自 SpringSource 的 Costin Leau 以 3 种不同的方式解释了如何做到这一点(对于假定完全访问系统类加载器的任何 jar,而不仅仅是 JavaFX):
http://blog.springsource.org/2009/01/19/exposing-the-boot-classpath-in-osgi/
我选择使用选项 A,这基本上意味着在 OSGi 容器的配置文件中设置 OSGi 指定的属性(不特定于任何实现!):
org.osgi.framework.system.packages.extra =javafx.application;version=0.0.0 ...
您可以在我创建的这个 Gist 中看到该属性的全部价值:
https://gist.github.com/renatoathaydes/5021107
我基本上将它设置为 JavaFX 2.2 jar 可以导出的所有包(我通过简单地将 JavaFX jar 放入我的 Apache Karaf 的部署文件夹中发现了这一点,它会自动将其打包成一个包,然后查看生成的清单)...顺便说一句,我尝试使用由 Karaf 生成的包(它使用 pax-wrap 来执行此操作),但是由于 JavaFX 尝试加载您的类的方式(这是不可见的),这将不起作用在尝试的 JavaFX 包中,更不用说 JavaFX 尝试访问的所有 JRE 包)。
我怀疑并不是我添加的所有软件包实际上都是必需的,但为了安全起见,我将它们全部保留为由 Karaf 的包装器生成的,并且由于它有效,除非有充分的理由,否则我不会更改它。
现在,只要 JRE lib 文件夹中存在 jfxrt.jar,我的任何包都可以使用 JavaFX。
尝试使用 e(fx)clipse 运行时工具,其中包括允许 JavaFX 在 OSGi 环境中正常工作的库。
不幸的是,JavaFX 不是用 OSGi 编写的,所以在 OSGi 中运行时有很多地方会导致问题,从 JavaFX-Binaries 位于用户系统的某处,到由于 OSGi 的可见性规则而导致的类加载问题. e(fx)clipse 提供了帮助库来处理所有这些问题,并使在 Eclipse Equinox 上编写 JavaFX 应用程序就像使用 SWT 和 Swing 一样容易
不是与 JavaFX 捆绑在一起,而是将 javafx 类添加到引导类加载器中会起作用。Apache Felix 示例:
Map<String,String> properties = new HashMap<String, String>();
properties.put(Constants.FRAMEWORK_BOOTDELEGATION, "javafx.*,com.sun.javafx.*");
properties.put(Constants.FRAMEWORK_BUNDLE_PARENT, Constants.FRAMEWORK_BUNDLE_PARENT_APP);
FrameworkFactory factory = new org.apache.felix.framework.FrameworkFactory();
org.osgi.framework.launch.Framework framework = factory.newFramework(properties);
framework.init();
现在只需使用任何包中的 javafx 类(如果客户端计算机上安装了 JavaFX)。