完成通过测试程序调用
Triones Framework Runtime
插件的工作:
1、
只需要利用
Eclipse
的核心插件包。
org.eclipse.core.runtime // Eclipse Plugin Runtime
org.eclipse.osgi // Eclipse OSGi Implemention
org.eclipse.update // Eclipse Plugin Loader/Updater
2、
平台启动就自动调用了
Triones
核心产品
org.softme.triones.runtime.framework
。部分输出如下:
Time to load bundles: 10
Starting application: 921
------------------------------------
Triones Framework: Started!
Triones Framework: Hello!
Triones Framework: Stoped!
------------------------------------
3、
EclipseStarter
设计为应用运行完毕就自动调用
shutdown
使得平台退出,
Triones
框架需要等待
ServletContext
的
Destroyed
事件,因此必须对此进行处理:
方案一:
创建
Triones
系统任务,并将其挂起直到获得
ContextDestroyed
事件。
方案二:
扩展
EclipseStarter
修改运行程序,不自动调用
shutdown
;等待
ContextDestroyed
事件由
TrionesContextListener
显式调用
shutdown
方法。
研究了一下午,方案一似乎不太合理,挂起的系统进程??郁闷中
…..
。
考虑方案二
….
以上,实现方案二:
通过反射直接调用
EclipseStarter
的
startup(String[], Runable)
和
run(Object)
方法以启动平台并保留在内存;关闭平台时调用
EclipseStarter
的
shutdown()
方法。
问题:
如何保留进程,如何与
Context
环境交互?
总不能全部使用反射吧?
方案:
通过反射取到
TrionesFramework
对象。
步骤一:
对
Triones Runtime
采取
分离接口模式
步骤二:
修改
launcher.EclipseLanucher
对象,通过反射获取
TrionesFramework
。
1)
需要通过
URLClassLoader
加载
Triones Runtime
插件;
2)
需要修改
DevPath
,增加
Triones Runtime
的插件路径。
3)
增加接口,取得
TrionesFramework
对象。
实现了对
TrionesStarter
的反射调用启动和关闭
Eclipse
平台,但是
对
getFramework
方法调用失败!!!!!
Get the Triones framework....
java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.softme.triones.launcher.TrionesEclipseLauncher.getFramework(TrionesEclipseLauncher.java:815)
…
Caused by: java.lang.NoClassDefFoundError: org/eclipse/core/runtime/Platform
at org.softme.triones.runtime.TrionesFramework.<init>(TrionesFramework.java:55)
at org.softme.triones.runtime.TrionesStarter.getFramework(TrionesStarter.java:52)
... 22 more
看来设计架构上还是出了问题,检查一下
URLClassLoader
的文档:
StartupClassLoader
仅仅包含启动包的类路径,而
Triones
必须将所有类路径加载到
context
中,才能够实现
Context
(
Servlet
)与框架的交互。
以上方案失败!!
Sign….. : (
):
改进方案,设法使得
OSGi
类路径加载到
Context
路径中!
(
虽然难度大了点,但是必须解决
)
。
不得窥道门,不得悟佛门,不得入窄门,实乃破门。