破門點滴(Java技術版)

          在日常學習和工作中記錄

            BlogJava :: 首頁 ::  :: 聚合  :: 管理
            15 Posts :: 7 Stories :: 36 Comments :: 0 Trackbacks
           

          關于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?


           1org.eclipse.osgi.framework.adaptor.core. AbstractFrameworkAdaptor
           2
           3/**
           4
           5        * The BundleClassLoader parent to use when creating BundleClassLoaders.
           6
           7        * The behavior of the ParentClassLoader will load classes
           8
           9        * from the boot strap classloader.
          10
          11        */

          12
          13       protected static ClassLoader bundleClassLoaderParent;
          14
          15 
          16
          17       static {
          18
          19              // check property for specified parent
          20
          21              String type = 
          22
          23System.getProperty(PROP_PARENT_CLASSLOADER, PARENT_CLASSLOADER_BOOT);
          24
          25              if (PARENT_CLASSLOADER_FWK.equalsIgnoreCase(type))
          26
          27                     bundleClassLoaderParent = FrameworkAdaptor.class.getClassLoader();
          28
          29              else if (PARENT_CLASSLOADER_APP.equalsIgnoreCase(type))
          30
          31                     bundleClassLoaderParent = ClassLoader.getSystemClassLoader();
          32
          33              else if (PARENT_CLASSLOADER_EXT.equalsIgnoreCase(type)) {
          34
          35                     ClassLoader appCL = ClassLoader.getSystemClassLoader();
          36
          37                     if (appCL != null)
          38
          39                            bundleClassLoaderParent = appCL.getParent();
          40
          41              }

          42
          43 
          44
          45              // default to boot classloader
          46
          47              if (bundleClassLoaderParent == null)
          48
          49                     bundleClassLoaderParent = new ParentClassLoader();
          50
          51       }

          52
          53


          如果使用了了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 作為OSGiparent classloader

          bundleClassLoaderParent = FrameworkAdaptor.class.getClassLoader();



          不得窺道門,不得悟佛門,不得入窄門,實乃破門。
          posted on 2005-11-28 16:25 破門 閱讀(549) 評論(0)  編輯  收藏 所屬分類: Triones
          主站蜘蛛池模板: 东方市| 镇巴县| 威宁| 博野县| 湘潭市| 长阳| 巩义市| 古田县| 鹤峰县| 宁夏| 柳江县| 红桥区| 全椒县| 江油市| 桐庐县| 内黄县| 开原市| 平遥县| 慈溪市| 延安市| 阳江市| 铜鼓县| 屯门区| 临潭县| 枣阳市| 呼玛县| 沐川县| 扎鲁特旗| 遂平县| 右玉县| 天水市| 来宾市| 辉南县| 枝江市| 云浮市| 道真| 鄂尔多斯市| 肇州县| 新邵县| 竹溪县| 晋江市|