﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-yuyee-随笔分类-osgi</title><link>http://www.blogjava.net/yuyee/category/46755.html</link><description /><language>zh-cn</language><lastBuildDate>Tue, 26 Oct 2010 16:43:10 GMT</lastBuildDate><pubDate>Tue, 26 Oct 2010 16:43:10 GMT</pubDate><ttl>60</ttl><item><title>bundle生命周期</title><link>http://www.blogjava.net/yuyee/archive/2010/10/27/336236.html</link><dc:creator>羔羊</dc:creator><author>羔羊</author><pubDate>Tue, 26 Oct 2010 16:35:00 GMT</pubDate><guid>http://www.blogjava.net/yuyee/archive/2010/10/27/336236.html</guid><description><![CDATA[bundle的生命周期分为installed,resovled,starting,active,stopping,unstalled
<div>install:解析bundle的MANIFEST.MF信息，校验格式，同时查看是否存在相同的bundle, 分配bundleid,生成bundle对象，并放入已安装的bundles集合中，状态为installed,可以通过命令bundle id来查看这个ID的bundle的关系图</div>
<div>resolve:寻找bundle中所需依赖的包和bundle是否存在以及被resolve，包括import-package,require-bundle，如寻找到则进入检查，检查完冲突后形成绑定关系，有个关系图直接定位，以便加载类时直接加载。</div>
<div>start:检查bundle状态，如未resolve,则先resolve，寻找MANIFEST.MF中配置的bundle-activator,找到后调用他的start方法，将bundle状态改为 active</div>
<div>stop:卸载当前bundle对外提供的service,并释放bundle引用的其他服务，之后调用activator类里的stop方法，改bundle状态为resovled</div>
<div>uninstall:</div>
<div>检查bundle状态，如果为active,则先stop,释放bundle对其他bundle的类依赖，如其他bundle依赖此bundle的类，则记录，如没有，则释放该bundle的classloader，最终修改bundle的状态为unstalled</div>
<div>update:</div>
<div>首先是停止当前bundle,</div>
<div>重新安装并resovle bundle,恢复到bundle更新之前的状态</div>
<div>如果希望更新bundle所引用到的类，则必须refresh动作，但refresh也值对unreslve状态以及uninstall时还有其他类依赖classloader还存活的bundle进行unresolve动作，并重新resolve对他们有依赖的bundle，建立新的绑定关系图，因此refresh可能会让某些bundle的classloader重建.</div>
<img src ="http://www.blogjava.net/yuyee/aggbug/336236.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yuyee/" target="_blank">羔羊</a> 2010-10-27 00:35 <a href="http://www.blogjava.net/yuyee/archive/2010/10/27/336236.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>OSGI小记</title><link>http://www.blogjava.net/yuyee/archive/2010/10/26/336202.html</link><dc:creator>羔羊</dc:creator><author>羔羊</author><pubDate>Tue, 26 Oct 2010 09:28:00 GMT</pubDate><guid>http://www.blogjava.net/yuyee/archive/2010/10/26/336202.html</guid><description><![CDATA[前几个人因为项目中考虑使用OSGI来开发，因此和同事调研了大概1个多月，当时没做记录，现在来弥补下
<div>OSIG，一个构件模块化，动态化系统的标准，众多应用服务器实现微核采用的技术，如weblogic,glassfish,最出名的是equinox,eclipse核心。</div>
<div>在OSGI环境中，体现模块化，动态化，</div>
<div>模块化：模块之间独立，部首其他模块影响。</div>
<div>其他模块只能访问该模块对外提供的服务</div>
<div>模块具备独立的生命周期，如启动，停止，更新</div>
<div>动态化：</div>
<div>对于模块的增加，修改，删除，不需要做 额外的处理。</div>
<div>OSGI中，每个模块就是在物理上就是一个bundle,一个JAR包，是OSGI部署的最小单位，需要在每个JAR包的MANIFEST.MF中给这个bundle标识，象bundle-name,Bundle-SymbolicName,Bundle-ClassPath,Bundle-Activator;</div>
<div>OSGI中bundle的隔离是通过java ClassLoader隔离性来完成的，JAVA中每个classloader空间都是隔离的，默认的classloader有bootStrap ClassLoader(jre/lib,jre/classes) extension classloader(jre/lib/ext),system classloader(-classpath),一般osgi框架还实现自己的应用类加载器。</div>
<div>bundle隔离机制实现：每个bundle都有一个独立的classloader,通过bundle-classpath指定JAR路径</div>
<div>java中通过双亲委托来加载类，寻找类首先是从parent classloader中寻找，如果找不到才在当前的clasloader中寻找</div>
<div>bundle类加载过程：</div>
<div>java.*开头的类委派给parent classloader加载；</div>
<div>bootdelegationcan参数中配置的也委派给parent classloader加载，parent classloader找不到则继续下面的操作；</div>
<div>是否在import-Package中，在则委派给导出他的bundle的classloader 加载，不在则继续下面</div>
<div>是否在require-bundle中，在则委派给相应的bundleloader加载，不在继续下面的</div>
<div>是否在自己的bundle-classpath 中，不在则继续下面的</div>
<div>是否在fragmentsbundle的classpath中寻找，不在则继续下面的(<span style="font-family: arial, nsimsun, sans-serif; font-size: 12px; "><span style="font-family: arial, nsimsun, sans-serif; font-size: 12px; ">&nbsp;</span></span><span style="font-family: arial, nsimsun, sans-serif; font-size: 12px; ">在 OSGi 框架中提供了一种称为 fragment 的特殊 bundle。在装载的过程中，这类 fragment 是被附加到被称为&#8220;宿主&#8221;的 bundle 上，最后作为一个整体 bundle 运行于 OSGi 环境中。最为典型的 fragment 应用场景是多语言包发布，将包含多语言包的 bundle 作为主体程序 bundle 的 fragment，这样可以将多语言包和主体 bundle 作为两个独立的部分来发布，但在运行时它们又是一个整体。</span>)</div>
<div>是否在export-package中，不在继续下面的</div>
<div>是否在dynamicimport-package中，在则加载，不在则抛classNotfoundexception</div>
<div>通过MANIFEST.MF定义import-package等，当要注意，最好定义包的版本 如：Import-Package: org.eclipse.osgi.framework.console;version="1.0.0",</div>
<div>&nbsp;org.osgi.framework;version="1.3.0"</div>
<div>Import-Package寻找机制：</div>
<div>resolved的优先未resolved</div>
<div>版本高的优先版本低的，如果版本一样，则比较bundle id,小的优先，也就是先安装的bundle优先</div>
<div><br />
</div>
<div><br />
</div>
<div><br />
</div>
<img src ="http://www.blogjava.net/yuyee/aggbug/336202.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yuyee/" target="_blank">羔羊</a> 2010-10-26 17:28 <a href="http://www.blogjava.net/yuyee/archive/2010/10/26/336202.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>