在OSGi包中使用JavaFX 2.2

时间:2012-11-05 21:38:39

标签: osgi javafx-2 apache-felix

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

我已经阅读了有关重新打包jfx库但有关eclispe插件项目的内容。

只是在bundle Manifest中导入javafx包创建了一个缺少的需求osgi.wiring.package Exception。

3 个答案:

答案 0 :(得分:11)

可能有点帮助你,但是我想记录一种在OSGi环境中启用JavaFX的简单方法,以防任何像我这样的人仍然无法做到这一点......

问题是,您需要允许JavaFX加载和使用它想要的任何类(JavaFX使用JRE的内部使得它很难捆绑),所以你真正想要的是给它访问权限到OSGi boostraping classpath ...

我不是专家,但是在这个博客中,来自SpringSource的Costin Leau解释了如何做到这一点(对于任何假设完全访问系统类加载器而不仅仅是JavaFX的jar,有三种不同的方式:

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的deploy文件夹中找到了它,它自动将它变成一个包,然后看看生成的Manifest)...顺便说一下,我试图使用Karaf生成的包(使用pax-wrap来完成)但是由于JavaFX尝试加载类的方式(这样做)在尝试的JavaFX包中看不到,更不用说JavaFX试图访问的所有JRE包了。

我怀疑并非所有我添加的软件包都是实际需要的,但为了安全起见,我将它们全部留在Karaf的包装器中生成,并且因为它有效,除非有充分的理由,否则我不会改变它。 / p>

现在,只要JRE lib文件夹中存在jfxrt.jar,我的任何捆绑包都可以使用JavaFX。

答案 1 :(得分:7)

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

根据e(fx)clipse site

  

不幸的是,JavaFX并不是用OSGi编写的,因此在OSGi内部运行时会出现各种问题,从JavaFX-Binaries位于用户系统的某个位置,到类加载的问题,因为OSGi的可见性规则。 e(fx)clipse提供了帮助库来处理所有这些问题,并使得在Eclipse Equinox上编写JavaFX应用程序感觉就像使用SWT和Swing一样简单

答案 2 :(得分:6)

不是JavaFX的捆绑包,但将javafx类添加到boot-classloader会起作用。 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)。