7

如何在 OSGi 包中使用 JavaFX 2.2?我正在使用 Apache Felix,所以它不是 eclispe 项目。它必须在安装了 Java7 的 Mac OSX 上运行(Java6 会很酷但不是必需的)。

我已经阅读了一些关于重新打包 jfx 库的内容,但对于 eclispe 插件项目。

仅在 bundle Manifest 中导入 javafx 包就创建了缺少需求 osgi.wiring.package 异常。

4

3 回答 3

11

可能有点晚了,但我想记录一种在 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。

于 2013-02-17T21:39:57.973 回答
7

尝试使用 e(fx)clipse 运行时工具,其中包括允许 JavaFX 在 OSGi 环境中正常工作的库。

根据e(fx)clipse 网站

不幸的是,JavaFX 不是用 OSGi 编写的,所以在 OSGi 中运行时有很多地方会导致问题,从 JavaFX-Binaries 位于用户系统的某处,到由于 OSGi 的可见性规则而导致的类加载问题. e(fx)clipse 提供了帮助库来处理所有这些问题,并使在 Eclipse Equinox 上编写 JavaFX 应用程序就像使用 SWT 和 Swing 一样容易

于 2012-11-05T23:28:11.857 回答
6

不是与 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)。

于 2012-11-13T14:58:09.510 回答