在OSGi捆绑包中使用JavaFX2.2

在OSGi捆绑包中使用JavaFX2.2,osgi,javafx-2,apache-felix,Osgi,Javafx 2,Apache Felix,如何在OSGi捆绑包中使用JavaFX2.2?我使用的是ApacheFelix,所以它不是eclispe项目。它必须在安装了Java7的MacOSX上运行(Java6很酷,但不是必需的) 我读过一些关于重新打包jfx库的内容,但没有针对eclispe插件项目 仅在捆绑包清单中导入javafx包就创建了缺少的需求osgi.willing.package异常。尝试使用e(fx)clipse运行时工具,其中包括允许javafx在osgi环境中正常工作的库 根据报告: 不幸的是,JavaFX并没有考虑O

如何在OSGi捆绑包中使用JavaFX2.2?我使用的是ApacheFelix,所以它不是eclispe项目。它必须在安装了Java7的MacOSX上运行(Java6很酷,但不是必需的)

我读过一些关于重新打包jfx库的内容,但没有针对eclispe插件项目

仅在捆绑包清单中导入javafx包就创建了缺少的需求osgi.willing.package异常。

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

根据报告:

不幸的是,JavaFX并没有考虑OSGi,所以在OSGi内部运行时会出现各种各样的问题,从JavaFX二进制文件位于用户系统的某个位置,到由于OSGi的可见性规则而导致的类加载问题。e(fx)clipse提供了帮助程序库来处理所有这些问题,并使在eclipseequinox上编写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();
Map properties=newhashmap();
properties.put(Constants.FRAMEWORK_bootdegration,“javafx.*,com.sun.javafx.*);
properties.put(Constants.FRAMEWORK\u BUNDLE\u PARENT,Constants.FRAMEWORK\u BUNDLE\u PARENT\u APP);
FrameworkFactory=new org.apache.felix.FrameworkFactory.FrameworkFactory();
org.osgi.framework.launch.framework=factory.newFramework(属性);
framework.init();

现在,只需使用任何捆绑包中的javafx类(如果客户端计算机上安装了javafx)。

帮助您可能有点晚了,但我想记录一种在OSGi环境中启用javafx的简单方法,以防像我这样的人在执行时遇到困难

问题是,您需要允许JavaFX加载和使用它想要的任何类(JavaFX使用JRE的内部结构,这使得绑定非常困难),所以您真正想要的是允许它访问OSGi boostraping类路径

我不是专家,但在这个博客中,来自SpringSource的Costin Leau解释了如何用3种不同的方式(对于任何假定完全访问系统类加载器的JAR,而不仅仅是JavaFX):

我选择使用选项A,这基本上意味着在OSGi容器的配置文件中设置OSGi指定的属性(不特定于任何实现!):

org.osgi.framework.system.packages.extra=javafx.application;版本=0.0.0

您可以在我创建的要点中看到该物业的全部价值:

我基本上用JavaFX2.2JAR可以导出的所有包来设置它(我发现了这一点,只需将JavaFXJAR放到我的ApacheKaraf的deploy文件夹中,它会自动将其放入一个包中,然后查看生成的清单)。。。顺便说一句,我尝试使用Karaf生成的包(它使用pax wrap来实现),但由于JavaFX尝试加载类的方式(在尝试的JavaFX包中不可见,更不用说JavaFX尝试访问的所有JRE包),所以这不会起作用

我怀疑并不是所有我添加的包都是必需的,但为了安全起见,我将它们都保留为Karaf的包装器生成的,并且在它工作时,除非有充分的理由,否则我不会更改它们


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

但我没有使用SWT和eclipse equinox。有没有一种更通用的方法来创建这样的OSGi助手库呢?我建议在OSGi包中询问关于JavaFX的问题仍然有点棘手。e(fx)clipse插件与equinox一起工作,但我没有让它与apachefelix一起工作,所以我不得不将javafx类添加到引导类加载器,而不是osgi包。希望更多的FX版本在此得到改进。该版本被声明为0.0.0,因为来自OSGi之外的包没有版本控制,所以您只需给它一个“空”版本号。这是一个好方法。只需要修改OSGI容器配置而不需要额外的代码就可以做到这一点吗?拥有ApacheKaraf的人可以尝试修改他们/etc目录中的jre.properties文件吗?