« | August 2025 | » | 日 | 一 | 二 | 三 | 四 | 五 | 六 | | | | | | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | | | | | | | |
| 公告 |
不得窥道门,不得悟佛门,不得入窄门,实乃破门。 |
Blog信息 |
blog名称:破门点滴 日志总数:161 评论数量:404 留言数量:-2 访问次数:1420757 建立时间:2004年11月13日 |

| |
[开发笔记]Triones:关于ClassLoader 问题的分析及解决 原创空间, 软件技术 破门 发表于 2004/12/16 16:13:44 |
关于ClassLoader 问题的分析:
EclipeClassLoader 创建:
org.eclipse.core.runtime.adaptor.EclipseElementFactory
public org.eclipse.osgi.framework.adaptor.BundleClassLoader createClassLoader
(ClassLoaderDelegate delegate, ProtectionDomain domain, S
tring[] bundleclasspath, AbstractBundleData data) {
return new EclipseClassLoader(delegate, domain,
bundleclasspath, data.getAdaptor().getBundleClassLoaderParent(), data);
}
获取ClassLoaderParent 的方法,使用了EclipseAdaptor
Adaptor 的getBundleClassLoaderParent() 如何去定 bundleClassLoaderParent?
org.eclipse.osgi.framework.adaptor.core. AbstractFrameworkAdaptor
/**
* The BundleClassLoader parent to use when creating BundleClassLoaders.
* The behavior of the ParentClassLoader will load classes
* from the boot strap classloader.
*/
protected static ClassLoader bundleClassLoaderParent;
static {
// check property for specified parent
String type =
System.getProperty(PROP_PARENT_CLASSLOADER, PARENT_CLASSLOADER_BOOT);
if (PARENT_CLASSLOADER_FWK.equalsIgnoreCase(type))
bundleClassLoaderParent = FrameworkAdaptor.class.getClassLoader();
else if (PARENT_CLASSLOADER_APP.equalsIgnoreCase(type))
bundleClassLoaderParent = ClassLoader.getSystemClassLoader();
else if (PARENT_CLASSLOADER_EXT.equalsIgnoreCase(type)) {
ClassLoader appCL = ClassLoader.getSystemClassLoader();
if (appCL != null)
bundleClassLoaderParent = appCL.getParent();
}
// default to boot classloader
if (bundleClassLoaderParent == null)
bundleClassLoaderParent = new ParentClassLoader();
}
如果使用了了boot Classloader 则 ParentClassLoader 是新建的 boot,这里分析看来应该使用framework 或者系统的ClassLoader吧。根据以上的分析,对Triones的启动环境进行了调整:
1、直接引用 org.eclipse.osgi 中的启动包,避免使用反射。注:可以直接调用EclipseStarter.run(null) 了。
2、将Triones Runtime 拆分成为 triones-core.jar (包括主要的服务接口 ItrionesFramework 等)和 triones-runtime.jar (Triones Runtime Eclipse插件)。
3、修改 Eclipse 的 config.ini 配置。
# osgi classloader :
osgi.parentClassloader = fwk
根据上面的分析, fwk 表示使用 FrameworkAdaptor 的ClassLoader 作为OSGi的parent classloader。
bundleClassLoaderParent = FrameworkAdaptor.class.getClassLoader(); | |
以下是测试程序输出 原创空间, 软件技术 破门发表评论于2004/12/16 16:18:21 | [JUnit]Testing The Triones Framework ....Time to load bundles: 20Starting application: 1342------------------------------------Triones Framework: Started!Triones Framework: Hello!Triones Job: begin...Triones Job: idle-0[JUnit]Triones Framework Instance:org.softme.triones.runtime.TrionesFramework@14c194dTriones Job: idle-1Triones Job: done.[JUnit]Testing The Triones Framework OK!!![JUnit]Testing The Triones Framework ....[JUnit]Close the Triones Framework By Shutdown....Triones Framework: Stoped!------------------------------------[JUnit]Testing The Triones Framework OK!!! | |
» 1 »
|