简述:
在OSGI框架中开发JAVAFX的C/S应用,主要处理点为如果把javafx运行环境的相关jar与dll文件引入到OSGI的bundle中,
本次处理为把javafx的运行环境的相关文件以一个plug-in Project 的形式加入其中,在该project中把javafx的所在
jar文件中的包全部导出然后在javafx bundle的应用中引入这些包,就可以找到javafx的API了,其它是把dll放到plug-in Project
的根目录下,用于JNI的调用。具体步骤如下:
1:建立一个用于依赖的bundle,在myeclisep9.1中:New-->Other-->Plug-in Development-->Plug-in Project
然后点击 next,输入一个工程名如:fxLibBundle(后续都称为fxLibBundle),在 Target Platform项中选中 an OSGI framework:下拉框中选择 standard,
点击next,在Properties项中可根据情况输入,也可默认,在Options项中取消 Generate an activator,...复选框。
点击next,取消 Create a Plug-in using one of the templates复选框,点击Finish完成插件工程建立向导。
2:在fxLibBundle的根目录中新建一个lib目录,用于存放jar文件,复制JavaFX Runtime 2.0\lib\jfxrt.jar到刚建的lib目录中,
复制JavaFX Runtime 2.0\bin所有的*.dll文件到fxLibBundle的根目录中。打开fxLibBundle工程中/META-INF/MANIFEST.MF文件,
切换到Runtime选项卡中,在Classpath项中点击Add按钮,定位到刚建立的lib目录中的jfxrt.jar文件,选中它然后点击ok按钮完
成jar加到Classpath的操作,然后在Classpath左边的Exported Packages项中,点击Add按钮,在弹出来的对话框中,包括了javafx
所有的包,全选后点击OK完成包的导出。
3:在javafx bundle应用中,打开其META-INF/MANIFEST.MF文件,切换到Dependencies选项卡中,在Required Plug-ins项中点击
Add按钮,在Slect a Plug-in输入框中可输入fxLibBundle来查找,找到后,选中它点击ok即可,接下来在Dependencies选项卡中的
Imported Packages项中点击Add按钮,选择在你的javafx bundle中用到的javafx包,选择完后占击OK完成包的导入。
4:右键你的javafx bundle,Run As-->Run Configurations 在打开的运行对话框中的左侧,双击(或右键)OSGI Framework菜单
新建一个OSGI Framework运行项,在右边出现的Bundles树形中,选择fxLibBundle与自身,在bundles树形右边点击Add Required Bundles
按钮,然后点击Apply按钮,再点击Run按钮运行应用。到此,基于OSGI的javafx应用操作步骤已全部完成。
可能会出现的问题:
。。。。java.lang.UnsatisfiedLinkError。。。。异常:
由于javafx引用不到其需要的dll或版本不对的原因引起。
解决:确定所用的javafx版本与fxLibBundle用的一致,确定dll都在fxLibBundle工程的根目录中。
续
在javafxbundle开发配置完成后,目前如何启动javafx bundle应用与更新、停止却又出现了问题。这些问题会在后续进一步进行解决,目前已
有解决的思路,等待测试。
续解决办法:
在启动javafx时不能直接用application.launch,而需要用如下代码启动:
PlatformImpl.startup(new Runnable() {
public void run() {
Stage stage = new Stage();
stage.setTitle("OSGI javaFx bundle");
stage.centerOnScreen();
//Scene scene = makeScene();
//stage.setScene(scene);
FIX_OSGI fix_osgi = new FIX_OSGI();
fix_osgi.start(stage);
}});
其中 FIX_OSGI 是一个自定义类,其start 方法部分如下:
public void start(Stage st) {
...
Scene scene = new Scene(new Group, 500, 200);
...
stage.setScene(scene);
...
}
这样启动后,对于javafx的bundle就可即时的更新、停止与启动了。
更多处理,请搜索javafx与swing整合相关资料。