OSGi教程 – 06 – JavaFX库转化为Bundle

为了能在OSGi环境中引用JavaFX相关类,在上一章中我们采取的策略是把jfxrt.jar文件手工拷到了工程之中,然后添加到ClassPath下。但如果多个OSGi工程均需要依赖该jar包中的类,在每个工程中都放一个10M+的jar包显然不合适。那要怎么做呢?下文将为你介绍两种方式。

第一种方式:手工拷贝并导出包

此种方式的原理是把jfxrt.jar加入到某独立OSGi工程的classpath下,然后通过导出包(Export Package)的形式使得JavaFX相关的类加载到整个OSGi环境中,这样其它的OSGi工程就可以通过引入包(Import Package)的形式来调用JavaFX的类了。

具体操作步骤与上一章很类似,先将jfxrt.jar拷贝到某工程的lib目录下,然后在MANIFEST.MF文件的Runtime选项卡中,在右下侧Classpath区域将该jar包加入到classpath中,如图:

20160904_01

然后在Runtime选项卡的左侧Exported Packages区域,将所有外部需要的类都导出即可(你也可以直接把所有的包都导出),如下图:

20160904_02

进行上述操作以后,在OSGi环境中已能够找到JavaFX相关类了,需要引用JavaFX类的OSGi工程只需要在Dependencies选项卡下Import Package即可,此处不再赘述。

第二种方式:“官方”向导方式

本方法采用Eclipse自带的功能菜单,从已有的jar文件创建Plug-in工程。首先选择菜单NewàProject,在弹出的向导对话框里选择“Plug-in from Existing JAR Archives”,如图:

20160904_03

点击“Next”,在接下来的对话框中点击“Add External…”按钮,

20160904_04

在弹出的对话框中选择jfxrt.jar文件,并点击打开,如图:

20160904_05

点击“Next”,接下来就会出现你熟悉的界面了,请填写好工程的信息(本例中填写的是javafxrt),如下图:

20160904_06

点击“Finish”,稍等几秒工程即创建完毕,如图:

20160904_07

进行上述操作以后,在OSGi环境中已能够找到JavaFX相关类了,需要引用JavaFX类的OSGi工程只需要在Dependencies选项卡下Import Package即可,此处不再赘述。

另外,对于任何其它的第三方非Bundle形式的普通jar包,也都可以通过这种方式来将其转化为Bundle。

第三种方式:使用框架扩展模块(Framework Extension Bundles)

OSGi核心规范(目前最新版本为4.2版)的3.14章中介绍了一种叫做“Extension Bundles”的机制,通过该机制可以加载非Bundle形式的普通jar包中的类(参考资料:https://osgi.org/download/r4v42/r4.core.pdf)。而Equinox框架则是使用了一种称为“Adaptor Hooks”的机制对该规范进行了实现(参考资料:http://wiki.eclipse.org/Adaptor_Hooks)。

使用该机制需要自己编写一个类加载器,然后用OSGi的扩展机制让框架调用到你自己的类加载器即可。但是,JavaFX毕竟已经随Java8一起发布,因此Eclipse基金会成立了专门的项目e(fx)clipse来做Eclipse与JavaFX的兼容性研究,在该项目中已经提供了这样的类加载器。关于该项目的主页:http://www.eclipse.org/efxclipse/index.html ,我们团队也已经对其部分文档资料进行了翻译,请参考http://www.javafxchina.net/blog/efxclipse/。下载了e(fx)clipse的插件以后,其中有一个jar包,名为org.eclipse.fx.osgi_2.1.0.201508240501.jar,这个jar包中就提供了单独的类加载器来加载jfxrt.jar中的类。我们只需要在启动自己的OSGi程序时让框架调用到该类加载器即可,使用方式是在Launch Configuration 中加入-Dosgi.framework.extensions=org.eclipse.fx.osgi的VM参数即可,如图(注意不要漏了那个短横杠):

20161030_01

打赏一下
支付宝
微信
除非注明,博客文章均为原创,转载请标明文章地址
本文地址: http://www.javafxchina.net/blog/2016/09/osgi-06/
百度已收录