Chr*_*erl 7 osgi apache-felix javafx-2
如何在OSGi包中使用JavaFX 2.2?我正在使用Apache Felix所以它不是eclispe项目.它必须在安装了Java7的Mac OSX上运行(Java6会很酷但不是必需的).
我已经阅读了有关重新打包jfx库但是针对eclispe插件项目的内容.
只是在bundle Manifest中导入javafx包创建了一个缺少的需求osgi.wiring.package Exception.
Ren*_*ato 11
可能会有点晚来帮助你,但是我想记录一种在OSGi环境中启用JavaFX的简单方法,以防任何像我这样的人仍然无法做到这一点....
问题是,您需要允许JavaFX加载和使用它想要的任何类(JavaFX使用JRE的内部,这使得它很难捆绑),所以你真正想要的是让它访问OSGi boostraping classpath ...
我不是专家,但是在这个博客中,来自SpringSource的Costin Leau解释了如何做到这一点(对于任何假设完全访问系统类加载器的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;版本= 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的包装器,并且因为它起作用,我不会改变它,除非有充分的理由.
现在,只要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类添加到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();
Run Code Online (Sandbox Code Playgroud)
现在只需使用任何bundle中的javafx类(如果客户端计算机上安装了JavaFX).