Eclipse机制以及OSGI的体会

论坛 期权论坛     
选择匿名的用户   2021-5-28 02:20   67   0
<p class="MsoTitle"> </p>
<p>此文档是总结性文档,较宽泛,适合对<span lang="en-us">Eclipse</span> 插件开发有一定了解的同事查阅。 </p>
<p>始终忙于插件开发,对<span lang="en-us">eclipse</span> 得本质并未深入研究,在这段时间的<span lang="en-us">studio</span> 技术总结期间,梳理代码时,对已底层的机制认识不清,借此机会深入研究了一下。 </p>
<p><span lang="en-us"> </span> </p>
<p class="MsoNormal">在网上<span lang="en-us">google</span> 了下,对<span lang="en-us">OSGI</span> 的定义如下: </p>
<p><span lang="en-us">OSGi</span> 是什么,<span lang="en-us">OSGi</span> 是一种服务运行平台。通过实现能够提供服务的符合<span lang="en-us">OSGi</span> 规范的组件,用户可以将其组件发布到<span lang="en-us">OSGi</span> 运行平台,供用户和其他组件使用。<span lang="en-us">OSGi</span> 组件提供的服务具有两个层面的含义:系统层面,即一个组件为其他组件提供服务,这些服务体现为<span lang="en-us">Java</span> 接口的实现;业务层面,即一个组件为外部系统或用户提供某种业务服务实现。 </p>
<p><span lang="en-us"> </span> </p>
<p>这种解释比较抽象不太好理解,我总结下了粗浅得概念以及好处:<span class="hilite1"></span>  </p>
<p class="MsoNormal"><span lang="en-us">OSGi</span> 可以控制访问范围,这方面<span lang="en-us">Java</span> 本身控制得不够细,比如我某个类只希望供某些指定的类使用,<span lang="en-us">Java</span> 是无法做到的(<span lang="en-us">Proptected</span> 只能供同包和子类用)。一句话:<span lang="en-us">osgi</span> 其实就是个<span lang="en-us">classloader</span> (刘成帮语)。 </p>
<p>拿<span lang="en-us">J2EE</span> 来说,一个<span lang="en-us">web</span> 应用通常只由一个<span lang="en-us">project</span> 来完成,所有得实现均在此<span lang="en-us">project</span> 中完成,<span lang="en-us">web</span> 应用发布后,若以后新增功能,那么只能在此工程下添加包、类等等,然后再编译打包发布。 </p>
<p>而<span lang="en-us">OSGI</span> 框架是由多个<span lang="en-us">project</span> 组成,此<span lang="en-us">project</span> 被<span lang="en-us">OSGI</span> 命名为<span lang="en-us">Bundle</span> (包),每个<span lang="en-us">bundle</span> 有具体的服务或者功能,如果想增加一个全新的功能,那么你只需再开发一个<span lang="en-us">bundle</span> 并部署上就可以了(<span lang="en-us">OSGI</span> 支持热插拔),<span lang="en-us">Eclipse</span> 的插件化概念就是基于<span lang="en-us">OSGI</span> 的理念。 </p>
<p><span lang="en-us">OSGI</span> 理念,我认为是未来的一个方向,把软件开发转向模块块开发(构件化)的方向,同时这也是一种软件设计理念,<span lang="en-us">OSGI</span> 告诉我们,写软件的时候要把职责划分清楚,这是合理划分接口、类、包甚至是服务,组件的基础。以<span lang="en-us">R1Studio</span> 为例,我们在软件设计划分时从大块上划分为<span lang="en-us">Platform</span> ,以及各产品插件。<span lang="en-us">Platform</span> 是运行得基础,主要包括运行的核心包,例如<span lang="en-us">core</span> 包,<span lang="en-us">model</span> 包,<span lang="en-us">ui</span> 包等等。各产品插件包依赖于<span lang="en-us">platform</span> ,各个<span lang="en-us">bundle</span> 各司其职,职责清楚,如果想修改<span lang="en-us">DE-I</span> 的业务,那么只需到<span lang="en-us">DE-I</span> 的<span lang="en-us">bundle</span> 去修改。如果在底层新增个通用的功能,例如调用消息格式,那么只需在<span lang="en-us">platform</span> 里修改,其他产品插件就获得了这个调用功能。若新增了<span lang="en-us">XX</span> 产品插件,就需要再创建一个<span lang="en-us">bundle</span> 。 </p>
<p class="MsoNormal"><span lang="en-us"> </span> </p>
<p><span lang="en-us">Eclipse</span> 与<span lang="en-us">OSGI</span> 的关系以及实现 </p>
<p><span lang="en-us">    Eclipse</span> 插件开发在<span lang="en-us">OSGI</span> 的显现表现方式是,每个插件(<span lang="en-us">bundle</span> )里有个<span lang="en-us">META-INF\MANIFEST.MF</span> 文件,此文件的定义是符合<span lang="en-us">OSGI</span> 规范的,以<span lang="en-us">com.icss.ro.studio.xprocess</span> 为例,打开<span lang="en-us">MANIFEST.MF</span> ,节选一个片段,如下所示: </p>
<p><span lang="en-us"> </span> </p>
<p align="left" class="MsoNormal"><span lang="en-us">Manifest-Version</span> <span lang="en-us">: 1.0</span> </p>
<p align="left"><strong><span lang="en-us">Bundle-ManifestVersion</span> </strong> <span lang="en-us">: 2</span> </p>
<p align="l
分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP