<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>erylee</title>
    <description></description>
    <link>http://erylee.javaeye.com</link>
    <language>UTF-8</language>
    <copyright>Copyright 2003-2008, JavaEye.com</copyright>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <generator>JavaEye - 做最棒的软件开发交流社区</generator>
      <item>
        <title>Windows Vista: PC时代的殉葬品</title>
        <author>erylee</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://erylee.javaeye.com">erylee</a>&nbsp;
          链接：<a href="http://erylee.javaeye.com/blog/52365" style="color:red;">http://erylee.javaeye.com/blog/52365</a>&nbsp;
          发表时间: 2007年02月05日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p style="margin-bottom: 0in;"><font face="Bitstream Vera Sans"><span lang="zh-CN">本来的标题可能是：&ldquo;</span></font>Windows Vista：M$<font face="Bitstream Vera Sans"><span lang="zh-CN">葬礼的开始&rdquo;，或者&ldquo;</span></font>Windows Vista：<font face="Bitstream Vera Sans"><span lang="zh-CN">逃离的时刻&rdquo;。后来，想想大家都是出来混的，人家</span></font>M$<font face="Bitstream Vera Sans"><span lang="zh-CN">也砸进去</span></font>60<font face="Bitstream Vera Sans"><span lang="zh-CN">亿的美金才搞出来的东西，所以就换了这个相对温和公正的标题：&ldquo;</span></font>Windows Vista: PC<font face="Bitstream Vera Sans"><span lang="zh-CN">时代的殉葬品&rdquo;。换了标题后，一直没写东西，因为觉得没有太大必要了，从</span></font>95<font face="Bitstream Vera Sans"><span lang="zh-CN">年到现在，人类的认知能力在进步，即使生活在中国这片神奇土地上的人类也应该在进步，但昨晚电视上看到</span></font>Bill Gates<font face="Bitstream Vera Sans"><span lang="zh-CN">要砸五亿美金作广告，还情绪激昂的宣称</span></font>Windows Vista<font face="Bitstream Vera Sans"><span lang="zh-CN">是一场技术革命，不免有些担心，还是写点东西。</span></font></p>
<h2><strong>Windows Vista</strong><font face="Bitstream Vera Sans"><span lang="zh-CN"><strong>是不是一场技术革命？</strong></span></font></h2>
<p style="margin-bottom: 0in;"><font face="Bitstream Vera Sans"><span lang="zh-CN">用我日常的说话方式来总结：革他妈鸟的命，出来卖的就好好的卖，不要立着&ldquo;技术革命&rdquo;的牌坊来卖！已经半老徐娘，不要因为你多擦些粉，就把自己当成十八岁的大姑娘；更不能因为你自己擦粉投入的钱</span></font>$<font face="Bitstream Vera Sans"><span lang="zh-CN">太多，就要把自己卖大姑娘的价，这他妈的是欺诈。</span></font><br />
</p>
<p style="margin-bottom: 0in;"><font face="Bitstream Vera Sans"><span lang="zh-CN">我们总爱受这种欺骗，看完了《英雄》，看《无极》，看《夜宴》，看《黄金甲》！智商就不能提高点，满屏幕黄黄的像一坨坨大便似的，除了权谋、杀戮，没有任何属于&ldquo;人&rdquo;的东西，怎么就卖了几个亿？有位教授</span></font>(<font face="Bitstream Vera Sans"><span lang="zh-CN">不是叫兽</span></font>)<font face="Bitstream Vera Sans"><span lang="zh-CN">总结的好：那是得了手的骗子。所以，我非常担心</span></font>Windows Vista在中国<font face="Bitstream Vera Sans"><span lang="zh-CN">成为下一个&ldquo;得了手的骗子&rdquo;。</span></font><br />
</p>
<p style="margin-bottom: 0in;"><font face="Bitstream Vera Sans"><span lang="zh-CN">说</span></font>M$<font face="Bitstream Vera Sans"><span lang="zh-CN">是骗子有些过分，我们客观承认</span></font>M$<font face="Bitstream Vera Sans"><span lang="zh-CN">是</span></font>PC<font face="Bitstream Vera Sans"><span lang="zh-CN">时代的领导者，这一点毫无疑问。但</span></font>M$<font face="Bitstream Vera Sans"><span lang="zh-CN">是不是</span></font>PC<font face="Bitstream Vera Sans"><span lang="zh-CN">时代技术变革的推动者，还需要讨论。今天，我们确实面对一场技术变革，但</span></font>Windows Vista<font face="Bitstream Vera Sans"><span lang="zh-CN">不是这场变革的发起者，而是这场技术变革的&ldquo;被革命对象&rdquo;。这场技术变革就是：个人电脑</span></font>(PC)<font face="Bitstream Vera Sans"><span lang="zh-CN">时代的终结，网络就是计算机时代的来临。</span></font><br />
</p>
<p style="margin-bottom: 0in;">SUN<font face="Bitstream Vera Sans"><span lang="zh-CN">是一个伟大的公司，他们在多年前就提出&ldquo;网络就是计算机&rdquo;的概念，当时大多数人都以为那是一个比较遥远的时代。可事情的发展往往超出人们的想象，今天&ldquo;网络就是计算机&rdquo;的时代正在来临。我们看到了太多的互联网技术、应用开启了新时代的大门，例如</span></font>Google<font face="Bitstream Vera Sans"><span lang="zh-CN">的</span></font>Docs<font face="Bitstream Vera Sans"><span lang="zh-CN">、</span></font>Calendar<font face="Bitstream Vera Sans"><span lang="zh-CN">、</span></font>GMap<font face="Bitstream Vera Sans"><span lang="zh-CN">等等，我们今天所讨论的</span></font>WEB2.0<font face="Bitstream Vera Sans"><span lang="zh-CN">也许只是这场变革的开始，这个<strong>开始</strong>的特征是：</span></font><strong>WEB</strong><font face="Bitstream Vera Sans"><span lang="zh-CN"><strong>即平台</strong>，<strong>软件即服务</strong>！未来几年，大量的</span></font>PC<font face="Bitstream Vera Sans"><span lang="zh-CN">应用将迅速向</span></font>WEB<font face="Bitstream Vera Sans"><span lang="zh-CN">迁移，这不是从所谓的</span></font>C/S<font face="Bitstream Vera Sans"><span lang="zh-CN">向</span></font>B/S<font face="Bitstream Vera Sans"><span lang="zh-CN">的迁移，而是由原来独立的、封闭的、单一的</span></font>PC<font face="Bitstream Vera Sans"><span lang="zh-CN">应用，向开放的、在线托管的、可协作的</span></font>WEB<font face="Bitstream Vera Sans"><span lang="zh-CN">服务和应用迁移。这个迁移最终将导致网络操作系统，或者有人称为</span></font>WEB<font face="Bitstream Vera Sans"><span lang="zh-CN">操作系统的诞生，进入&ldquo;网络就是计算机的时代&rdquo;。</span></font><br />
</p>
<p style="margin-bottom: 0in;"><font face="Bitstream Vera Sans"><span lang="zh-CN">我们很难准确定义和描述&ldquo;网络操作系统&rdquo;或&ldquo;</span></font>WEB<font face="Bitstream Vera Sans"><span lang="zh-CN">操作系统&rdquo;，但可以作一个简单的想象：</span></font></p>
<p style="margin-bottom: 0in;"><font face="Bitstream Vera Sans"><span lang="zh-CN"></span></font><font face="Bitstream Vera Sans"><span lang="zh-CN">一台瘦的互联网终端，非常小的操作系统，只负责基本的硬件管理、互联网连接和</span></font>WEB<font face="Bitstream Vera Sans"><span lang="zh-CN">浏览；不再有庞大的本地硬盘，所有的数据可以安全的存储在海量的互联网存储上；所有的应用，例如办公软件，都从互联网加载。全世界，只需要少量几个核心的计算和服务供应网络，终端用户只需要按需租赁。</span></font></p>
<p style="margin-bottom: 0in;"><font face="Bitstream Vera Sans"><span lang="zh-CN">尽管这一形态的&ldquo;网络操作系统&rdquo;还需时间，但这个方向是不可避免的。我们回头来看看</span></font>Windows Vista<font face="Bitstream Vera Sans"><span lang="zh-CN">这个鸟东西，个人终端操作系统应该越来越瘦小、便宜，个人终端用户应该越来越多的使用在线服务的时候，</span></font>Windows Vista<font face="Bitstream Vera Sans"><span lang="zh-CN">却朝着相反的方向，把个人终端变得庞大、复杂且昂贵。根据网上的测评，据说需要</span></font>2G<font face="Bitstream Vera Sans"><span lang="zh-CN">内存和</span></font>N<font face="Bitstream Vera Sans"><span lang="zh-CN">多显存，才能平稳的运行</span></font>Vista<font face="Bitstream Vera Sans"><span lang="zh-CN">，这完全是与技术变革的方向背道而驰。</span></font><br />
</p>
<p style="margin-bottom: 0in;">Windows Vista<font face="Bitstream Vera Sans"><span lang="zh-CN">的项目本身异常庞大，开发周期非常长，并延期了</span></font>3<font face="Bitstream Vera Sans"><span lang="zh-CN">年时间。大家不要认为，</span></font>M$<font face="Bitstream Vera Sans"><span lang="zh-CN">之所以耗费如此大的开支，是想为用户推出一款完美的操作系统；事实上，我个人觉得，</span></font>M$<font face="Bitstream Vera Sans"><span lang="zh-CN">更多是为了实现对</span></font>PC<font face="Bitstream Vera Sans"><span lang="zh-CN">绝对统治的个人野心而已，他们想做一个无所不能的，可以一统</span></font>PC<font face="Bitstream Vera Sans"><span lang="zh-CN">江湖的家伙。从技术变革的角度将，</span></font>Windows Vista<font face="Bitstream Vera Sans"><span lang="zh-CN">本身是一款完全赌错了方向的产品，当</span></font>PC<font face="Bitstream Vera Sans"><span lang="zh-CN">时代即将终结的时候，&ldquo;一统</span></font>PC<font face="Bitstream Vera Sans"><span lang="zh-CN">时代&ldquo;的操作系统还有意义吗？顶多是</span></font>PC<font face="Bitstream Vera Sans"><span lang="zh-CN">时代的殉葬品！</span></font><br />
</p>
<p style="margin-bottom: 0in;"><font face="Bitstream Vera Sans"><span lang="zh-CN">从软件项目开发的角度讲，</span></font>Windows Vista<font face="Bitstream Vera Sans"><span lang="zh-CN">项目本是失败的。所有作软件开发的人，几乎都看过《人月神话》，我认为微软陷入了文中所说的&ldquo;焦油坑（</span></font>The Tar Pit<font face="Bitstream Vera Sans"><span lang="zh-CN">）&rdquo;，与&ldquo;</span></font>IBM 360<font face="Bitstream Vera Sans"><span lang="zh-CN">系统&rdquo;开发非常相似的困境。</span></font>Vista<font face="Bitstream Vera Sans"><span lang="zh-CN">在拖延了</span></font>3<font face="Bitstream Vera Sans"><span lang="zh-CN">年，砍掉了很多</span></font>Gates<font face="Bitstream Vera Sans"><span lang="zh-CN">认为的杀手级应用之后，也远远未达到产品级应用，更不用提完美和变革。</span></font>Vista<font face="Bitstream Vera Sans"><span lang="zh-CN">的开发无论预算和发布时间都严重超支，而且我相信后期的项目维护也会是一场噩梦。那么，我们能期望从一个失败的软件项目中诞生一个成功的软件产品，甚至是&ldquo;变革性&rdquo;的产品吗？</span></font><br />
</p>
<p style="margin-bottom: 0in;">Windows Vista<font face="Bitstream Vera Sans"><span lang="zh-CN">是不是一个技术变革的产品，只需要一点点时间去验证，但我相信下面一段话所预言的事：<span><span style="font-weight: bold;">有人的地方，就有江湖。江湖上，死的最惨的都是那些妄想一统江湖称霸武林的家伙，无论那些家伙打着什么旗号</span>。</span></span></font><br />
</p>
<h2><strong>Windows Vista: </strong><font face="Bitstream Vera Sans"><span lang="zh-CN"><strong>没有远景</strong></span></font></h2>
<p style="margin-bottom: 0in;"><font face="Bitstream Vera Sans"><span lang="zh-CN"><span style="font-weight: bold;">没有&ldquo;远景&rdquo;，连眼前的风景都没有</span>。昨晚东方卫视介绍</span></font>Windows Vista<font face="Bitstream Vera Sans"><span lang="zh-CN">，</span></font>Gates<font face="Bitstream Vera Sans"><span lang="zh-CN">在台上激动的&rdquo;</span></font>WOW&rdquo;<font face="Bitstream Vera Sans"><span lang="zh-CN">，然后主持人介绍了几个特性，没有一个让我&rdquo;</span></font>WOW&rdquo;<font face="Bitstream Vera Sans"><span lang="zh-CN">起来。另外，总感觉</span></font>Gates<font face="Bitstream Vera Sans"><span lang="zh-CN">的煽情很别扭，完全没有</span></font>Steve Jobs<font face="Bitstream Vera Sans"><span lang="zh-CN">令人信服。</span></font><br />
</p>
<p style="margin-bottom: 0in;"><font face="Bitstream Vera Sans"><span lang="zh-CN">首先，介绍了一个桌面</span></font>3D<font face="Bitstream Vera Sans"><span lang="zh-CN">切换，看似很炫。这他妈的在</span></font>MAC<font face="Bitstream Vera Sans"><span lang="zh-CN">上，</span></font>N<font face="Bitstream Vera Sans"><span lang="zh-CN">年前就有了，</span></font>MAC<font face="Bitstream Vera Sans"><span lang="zh-CN">不仅可以</span></font>3D<font face="Bitstream Vera Sans"><span lang="zh-CN">切换窗口，你还可以</span></font>3D<font face="Bitstream Vera Sans"><span lang="zh-CN">切换四个桌面。</span></font><br />
</p>
<p style="margin-bottom: 0in;"><font face="Bitstream Vera Sans"><span lang="zh-CN">然后，介绍了一个小功能，好像是有个鸟工具，可以支持你直接用命令行启动桌面程序，号称&ldquo;不需要在菜单中寻找，快速启动应用程序&rdquo;。这也能拿出来秀，不是电视台的编辑脑袋有问题，就是微软市场人员的脑袋有问题。从</span></font>Linux/Unix<font face="Bitstream Vera Sans"><span lang="zh-CN">诞生开始，你就可以用命令行启动任何应用程序，通过脚本自由的组合应用程序。</span></font>Ubuntu<font face="Bitstream Vera Sans"><span lang="zh-CN">的桌面栏，可以让你在一个入口启动应用程序、打开文件、查阅字典、网络搜索关键字。</span></font><br />
</p>
<p style="margin-bottom: 0in;"><font face="Bitstream Vera Sans"><span lang="zh-CN">其他功能的介绍，就不太记得了，反正始终没有&rdquo;</span></font>WOW&rdquo;<font face="Bitstream Vera Sans"><span lang="zh-CN">起来，没看到远景，也没有任何风景。</span></font><br />
</p>
<p style="margin-bottom: 0in;"><font face="Bitstream Vera Sans"><span lang="zh-CN">今天，打开</span></font>Windows Vista<font face="Bitstream Vera Sans"><span lang="zh-CN">中国的主页，特意去看看</span></font>M$<font face="Bitstream Vera Sans"><span lang="zh-CN">罗列的可以让用户&rdquo;</span></font>WOW&ldquo;<font face="Bitstream Vera Sans"><span lang="zh-CN">的理由，顺便拷贝几条过来分析分析。</span></font><br />
</p>
<p style="margin-bottom: 0in;"><font face="Bitstream Vera Sans"><span lang="zh-CN">第三条：</span></font><br />
</p>
<table class="zeroBorder" cellspacing="0" border="0" cellpadding="0" width="693">
    <colgroup><col width="693" /></colgroup>
    <tbody>
        <tr>
            <td width="693">
            <p><strong>3. </strong><font face="Bitstream Vera Sans"><span lang="zh-CN"><strong>迄今为止最为安全的 </strong></span></font><strong>Windows </strong><font face="Bitstream Vera Sans"><span lang="zh-CN"><strong>版本</strong></span></font></p>
            </td>
        </tr>
        <tr>
            <td width="693">
            <p>Windows Vista <font face="Bitstream Vera Sans"><span lang="zh-CN">具有 </span></font><strong>Windows Defender</strong><font face="Bitstream Vera Sans"><span lang="zh-CN">、反垃圾邮件软件、仿冒网站筛选以及<strong>家长控制</strong>等新的安全工具，因此它可以为您的 </span></font>PC<font face="Bitstream Vera Sans"><span lang="zh-CN">、个人信息和家人提供比之前任何的 </span></font>Windows <font face="Bitstream Vera Sans"><span lang="zh-CN">版本都安全的保护。 自动备份、<strong>性能自行配置</strong>和内置诊断帮助您保护数据并确保 </span></font>PC <font face="Bitstream Vera Sans"><span lang="zh-CN">正常运行。</span></font></p>
            </td>
        </tr>
    </tbody>
</table>
<p style="margin-bottom: 0in;"><font face="Bitstream Vera Sans"><span lang="zh-CN">有一点分析能力的人都会觉得这是非常无耻的一条，难道</span></font>Windows<font face="Bitstream Vera Sans"><span lang="zh-CN">以前是裸体跑的？以前如此<strong>不</strong>安全的</span></font>Windows<font face="Bitstream Vera Sans"><span lang="zh-CN">拿出来卖，算什么？算欺诈？那个鸟逼的</span></font>IE<font face="Bitstream Vera Sans"><span lang="zh-CN">、</span></font>IIS<font face="Bitstream Vera Sans"><span lang="zh-CN">害了多少用户，每个中国的</span></font>Windows<font face="Bitstream Vera Sans"><span lang="zh-CN">用户都被木马、流氓软件插过，</span></font>80<font face="Bitstream Vera Sans"><span lang="zh-CN">％是通过</span></font>IE<font face="Bitstream Vera Sans"><span lang="zh-CN">插进来的。现在，你穿了衣服，不裸奔了（我们还不确认是不是半裸），居然厚颜无耻的让我们来&rdquo;</span></font>WOW&rdquo;<font face="Bitstream Vera Sans"><span lang="zh-CN">。另外，你什么时候听说&ldquo;这是目前为止最安全的</span></font>Unix\Linux&ldquo;<font face="Bitstream Vera Sans"><span lang="zh-CN">，或者</span></font>Jobs<font face="Bitstream Vera Sans"><span lang="zh-CN">说&ldquo;这是目前为止最安全的</span></font>MAC&rdquo;<font face="Bitstream Vera Sans"><span lang="zh-CN">？</span></font></p>
<p style="margin-bottom: 0in;"><font face="Bitstream Vera Sans"><span lang="zh-CN">第十条：</span></font><br />
</p>
<table class="zeroBorder" cellspacing="0" border="0" cellpadding="0" width="693">
    <colgroup><col width="693" /></colgroup>
    <tbody>
        <tr>
            <td width="693">
            <p><strong>10. </strong><font face="Bitstream Vera Sans"><span lang="zh-CN"><strong>更安全地进行网上冲浪</strong></span></font></p>
            </td>
        </tr>
        <tr>
            <td width="693">
            <p><font face="Bitstream Vera Sans"><span lang="zh-CN">在您联机时，</span></font><strong>Windows Internet Explorer 7 </strong><font face="Bitstream Vera Sans"><span lang="zh-CN">中的<strong>动态安全保护</strong>帮助保护您的 </span></font>PC <font face="Bitstream Vera Sans"><span lang="zh-CN">和个人信息的安全。 </span></font>Internet Explorer 7 <font face="Bitstream Vera Sans"><span lang="zh-CN">还包括很多设计用于防止恶意软件的新功能。</span></font></p>
            </td>
        </tr>
    </tbody>
</table>
<p style="margin-bottom: 0in;"><font face="Bitstream Vera Sans"><span lang="zh-CN">鉴于</span></font>IE<font face="Bitstream Vera Sans"><span lang="zh-CN">种种恶劣的历史记录，包括其过去以卑鄙的手段击败</span></font>Netscape<font face="Bitstream Vera Sans"><span lang="zh-CN">，现在阻挠</span></font>Canvas<font face="Bitstream Vera Sans"><span lang="zh-CN">标签以及</span></font>SVG<font face="Bitstream Vera Sans"><span lang="zh-CN">的应用与技术创新等，这一条基本上可以忽略。从我半年前试用那个</span></font>Bug<font face="Bitstream Vera Sans"><span lang="zh-CN">百出的</span></font>IE7 Beta<font face="Bitstream Vera Sans"><span lang="zh-CN">的经验上看，</span></font>IE7<font face="Bitstream Vera Sans"><span lang="zh-CN">无论在性能、稳定性、安全上，仍然无法与</span></font>Opera<font face="Bitstream Vera Sans"><span lang="zh-CN">、</span></font>Fire Fox<font face="Bitstream Vera Sans"><span lang="zh-CN">相提并论，</span></font>IE7<font face="Bitstream Vera Sans"><span lang="zh-CN">所谓的新功能在</span></font>Opera<font face="Bitstream Vera Sans"><span lang="zh-CN">、</span></font>FireFox<font face="Bitstream Vera Sans"><span lang="zh-CN">上早以实现。</span></font>Opera9.x 5M<font face="Bitstream Vera Sans"><span lang="zh-CN">左右的安装文件，却实现了业界最高效的</span></font>WEB<font face="Bitstream Vera Sans"><span lang="zh-CN">浏览，最易用的</span></font>EMAIL<font face="Bitstream Vera Sans"><span lang="zh-CN">客户端，以及</span></font>IRC<font face="Bitstream Vera Sans"><span lang="zh-CN">、新闻组、</span></font>RSS<font face="Bitstream Vera Sans"><span lang="zh-CN">、</span></font>BT<font face="Bitstream Vera Sans"><span lang="zh-CN">下载集成，还可支持小</span></font>Widget<font face="Bitstream Vera Sans"><span lang="zh-CN">控件，更不用提弹出窗口拦截、恶意脚本检测、反钓鱼网站等安全特性。</span></font></p>
<p style="margin-bottom: 0in;"><font face="Bitstream Vera Sans"><span lang="zh-CN">第</span></font>XXX<font face="Bitstream Vera Sans"><span lang="zh-CN">条：</span></font><br />
</p>
<table class="zeroBorder" cellspacing="0" border="0" cellpadding="0" width="693">
    <colgroup><col width="3" /><col width="690" /></colgroup>
    <tbody>
        <tr>
            <td rowspan="3" valign="top" width="3"><br />
            </td>
            <td width="690">
            <p><strong>12. </strong><font face="Bitstream Vera Sans"><span lang="zh-CN"><strong>按您的时间安排节目</strong></span></font></p>
            </td>
        </tr>
        <tr>
            <td width="690">
            <p><strong>Windows </strong><font face="Bitstream Vera Sans"><span lang="zh-CN"><strong>媒体中心</strong></span></font><a href="http://www.microsoft.com/china/windows/products/windowsvista/footnotes.mspx"><sup>M</sup></a></p>
            </td>
        </tr>
    </tbody>
</table>
<p style="margin-bottom: 0in;"> </p>
<table class="zeroBorder" cellspacing="0" border="0" cellpadding="0" width="295">
    <colgroup><col width="295" /></colgroup>
    <tbody>
        <tr>
            <td width="295">
            <p><strong>14. </strong><font face="Bitstream Vera Sans"><span lang="zh-CN"><strong>使任意房间都可以成为一个媒体中心</strong></span></font></p>
            </td>
        </tr>
        <tr>
            <td width="295">
            <p><font face="Bitstream Vera Sans"><span lang="zh-CN">拥有 </span></font><strong>Windows </strong><font face="Bitstream Vera Sans"><span lang="zh-CN"><strong>媒体中心</strong></span></font><a href="http://www.microsoft.com/china/windows/products/windowsvista/footnotes.mspx"><sup>M</sup></a></p>
            </td>
        </tr>
    </tbody>
</table>
<table class="zeroBorder" cellspacing="0" border="0" cellpadding="0" width="194">
    <colgroup><col width="194" /></colgroup>
    <tbody>
        <tr>
            <td width="194">
            <p><strong>19. </strong><font face="Bitstream Vera Sans"><span lang="zh-CN"><strong>在 </strong></span></font><strong>PC </strong><font face="Bitstream Vera Sans"><span lang="zh-CN"><strong>上观看实况电视</strong></span></font></p>
            </td>
        </tr>
        <tr>
            <td width="194">
            <p><strong>Windows </strong><font face="Bitstream Vera Sans"><span lang="zh-CN"><strong>媒体中心</strong></span></font><a href="http://www.microsoft.com/china/windows/products/windowsvista/footnotes.mspx"><sup>M</sup></a></p>
            </td>
        </tr>
    </tbody>
</table>
<p style="margin-bottom: 0in;"><br />
</p>
<p style="margin-bottom: 0in;"><font face="Bitstream Vera Sans"><span lang="zh-CN">很多条上，</span></font>Windows Vista<font face="Bitstream Vera Sans"><span lang="zh-CN">都在宣传它的&ldquo;多媒体中心&rdquo;。看看</span></font>MAC<font face="Bitstream Vera Sans"><span lang="zh-CN">吧，</span></font><a href="http://www.apple.com/macosx/leopard/index.html">http://www.apple.com/macosx/leopard/index.html<font face="Bitstream Vera Sans"><span lang="zh-CN"> </span></font></a><font face="Bitstream Vera Sans">否则你还以为</font>M$<font face="Bitstream Vera Sans"><span lang="zh-CN">干了多了不起的事情。抄不是错，抄的像原创一样就有点恶心了。</span></font><br />
</p>
<p style="margin-bottom: 0in;">M$<font face="Bitstream Vera Sans"><span lang="zh-CN">总共罗列了</span></font>100<font face="Bitstream Vera Sans"><span lang="zh-CN">条，我没有耐心去看下去，感觉上基本是对以前</span></font>Windows缺陷<font face="Bitstream Vera Sans"><span lang="zh-CN">的改进，抄袭</span></font>MAC<font face="Bitstream Vera Sans"><span lang="zh-CN">的功能等等，没有看到什么&ldquo;变革性&rdquo;的可以让人眼前一亮，可以&rdquo;</span></font>WOW&rdquo;<font face="Bitstream Vera Sans"><span lang="zh-CN">的东西。</span></font><br />
</p>
<h2><strong>Windows Vista</strong><font face="Bitstream Vera Sans"><span lang="zh-CN"><strong>：逃离的开始</strong></span></font></h2>
<p style="margin-bottom: 0in;">Windows Vista<font face="Bitstream Vera Sans"><span lang="zh-CN">漫长的开发期间里，</span></font>Linux<font face="Bitstream Vera Sans"><span lang="zh-CN">社区诞生了</span></font>Ubuntu<font face="Bitstream Vera Sans"><span lang="zh-CN">；</span></font>MAC<font face="Bitstream Vera Sans"><span lang="zh-CN">发布了</span></font>Tiger<font face="Bitstream Vera Sans"><span lang="zh-CN">，接下来是</span></font>Leopard<font face="Bitstream Vera Sans"><span lang="zh-CN">；互联网迎来了</span></font>WEB2.0<font face="Bitstream Vera Sans"><span lang="zh-CN">，</span></font>Google<font face="Bitstream Vera Sans"><span lang="zh-CN">发布了无数的在线应用，包括在线</span></font>Office<font face="Bitstream Vera Sans"><span lang="zh-CN">。</span></font>Windows Vista<font face="Bitstream Vera Sans"><span lang="zh-CN">的来临，也许是我们逃离</span></font>Windows<font face="Bitstream Vera Sans"><span lang="zh-CN">，奔向这些新世界的开始。</span></font></p>
<h3><strong>Ubuntu</strong><font face="Bitstream Vera Sans"><span lang="zh-CN"><strong>：拥抱</strong></span></font><strong>Linux</strong><font face="Bitstream Vera Sans"><span lang="zh-CN"><strong>的自由世界</strong></span></font></h3>
<p style="margin-bottom: 0in;"><font face="Bitstream Vera Sans"><span lang="zh-CN">几个月前，我将笔记本的操作系统从</span></font>Windows XP<font face="Bitstream Vera Sans"><span lang="zh-CN">切换到</span></font>Ubuntu<font face="Bitstream Vera Sans"><span lang="zh-CN">，加入</span></font>Linux<font face="Bitstream Vera Sans"><span lang="zh-CN">的自由世界。</span></font>Ubuntu<font face="Bitstream Vera Sans"><span lang="zh-CN">在</span></font>Linux<font face="Bitstream Vera Sans"><span lang="zh-CN">桌面易用性方面，确实有了非常大的改进。无论安装，兼容性，系统升级都非常简单。基于</span></font>Debian<font face="Bitstream Vera Sans"><span lang="zh-CN">的集中软件管理系统尤其值得称道，大量的</span></font>GNU<font face="Bitstream Vera Sans"><span lang="zh-CN">应用程序可以直接从网络安装，自动升级，并安全卸载。完全避免了</span></font>Windows<font face="Bitstream Vera Sans"><span lang="zh-CN">上独立安装卸载应用程序，和维护令人发指的注册表的烦恼。我觉得不在</span></font>Windows<font face="Bitstream Vera Sans"><span lang="zh-CN">操作系统上开发什么鸟</span></font>.NET<font face="Bitstream Vera Sans"><span lang="zh-CN">之类的程序员，都可以转向</span></font>Ubuntu<font face="Bitstream Vera Sans"><span lang="zh-CN">，享受一个集成了易用的桌面，</span></font>Linux<font face="Bitstream Vera Sans"><span lang="zh-CN">命令行和</span></font>Shell<font face="Bitstream Vera Sans"><span lang="zh-CN">脚本，大量</span></font>GNU<font face="Bitstream Vera Sans"><span lang="zh-CN">应用包括</span></font>LAMP<font face="Bitstream Vera Sans"><span lang="zh-CN">的操作系统。</span></font></p>
<h3><strong>Google</strong><font face="Bitstream Vera Sans"><span lang="zh-CN"><strong>在线服务：</strong></span></font><strong>WEB</strong><font face="Bitstream Vera Sans"><span lang="zh-CN"><strong>即平台，软件即服务的世界</strong></span></font></h3>
<p style="margin-bottom: 0in;"><font face="Bitstream Vera Sans"><span lang="zh-CN">然后，我们把很多文档上传至</span></font>http://docs.google.com<font face="Bitstream Vera Sans"><span lang="zh-CN">，由</span></font>Goolge Docs<font face="Bitstream Vera Sans"><span lang="zh-CN">来在线管理这些文档。我和同事们开始在线编写各种文档，然后不需要再通过</span></font>PC<font face="Bitstream Vera Sans"><span lang="zh-CN">共享，或</span></font>EMAIL<font face="Bitstream Vera Sans"><span lang="zh-CN">的方式发布文档，只需要通过&ldquo;</span></font>Collaborate&rdquo;<font face="Bitstream Vera Sans"><span lang="zh-CN">在线协作。我们可以在任何有互联网的地方自由访问这些文档，不再需要</span></font>U<font face="Bitstream Vera Sans"><span lang="zh-CN">盘等拷贝文档的方式。我觉得</span></font>Google Docs<font face="Bitstream Vera Sans"><span lang="zh-CN">开启了所有</span></font>PC<font face="Bitstream Vera Sans"><span lang="zh-CN">应用向互联网迁移的大门，如果</span></font>Office<font face="Bitstream Vera Sans"><span lang="zh-CN">都可以迁移到</span></font>WEB<font face="Bitstream Vera Sans"><span lang="zh-CN">上，那还有什么应用不可以呢？这也许是&ldquo;网络就是计算机&rdquo;的雏形应用。</span></font></p>
<h3><strong>OS X Leopard</strong><font face="Bitstream Vera Sans"><span lang="zh-CN"><strong>：完美主义者的操作系统</strong></span></font></h3>
<p style="margin-bottom: 0in;"><font face="Bitstream Vera Sans"><span lang="zh-CN">如果你一定要一个华丽而又完美的操作系统，任何一款</span></font>Windows<font face="Bitstream Vera Sans"><span lang="zh-CN">都不是，包括</span></font>Windows Vista<font face="Bitstream Vera Sans"><span lang="zh-CN">在内。</span></font>M$<font face="Bitstream Vera Sans"><span lang="zh-CN">的价值观与完美主义相去甚远，你知道最初的</span></font>DOS<font face="Bitstream Vera Sans"><span lang="zh-CN">是什么缩写吗？是&rdquo;</span></font>Quick and Dirty Operation System&rdquo;<font face="Bitstream Vera Sans"><span lang="zh-CN">，</span></font>Gates<font face="Bitstream Vera Sans"><span lang="zh-CN">拿过来把</span></font>Quick<font face="Bitstream Vera Sans"><span lang="zh-CN">去掉然后卖给</span></font>IBM<font face="Bitstream Vera Sans"><span lang="zh-CN">。现在，一个陷入泥潭软件项目，一个错误方向赌博，一个充满野心的产品</span></font>Vista<font face="Bitstream Vera Sans"><span lang="zh-CN">，距完美更远！</span></font>Windows Vista<font face="Bitstream Vera Sans"><span lang="zh-CN">的界面华丽吗？易用吗？去试试</span></font>Apple<font face="Bitstream Vera Sans"><span lang="zh-CN">的</span></font>OS X<font face="Bitstream Vera Sans"><span lang="zh-CN">后在说！</span></font><br />
</p>
<p style="margin-bottom: 0in;"><font face="Bitstream Vera Sans"><span lang="zh-CN">我们在</span></font>Gates<font face="Bitstream Vera Sans"><span lang="zh-CN">身上永远找不到</span></font>Steve Jobs<font face="Bitstream Vera Sans"><span lang="zh-CN">偏执的完美主义信仰，苹果产品做得美轮美奂，简单易用，其实都带有</span></font>Jobs<font face="Bitstream Vera Sans"><span lang="zh-CN">个人性格的烙印。</span></font>Gates<font face="Bitstream Vera Sans"><span lang="zh-CN">只是一个实用主义者，所有的</span></font>Windows<font face="Bitstream Vera Sans"><span lang="zh-CN">产品也同样都有这样的烙印。所以，我们只要期望</span></font>Windows Vista<font face="Bitstream Vera Sans"><span lang="zh-CN">能用就可以了，不要提什么完美与&ldquo;变革&rdquo;，基本上是扯谈。如果你想要一个完美的操作系统，就去向</span></font>Steve Jobs<font face="Bitstream Vera Sans"><span lang="zh-CN">要。</span></font><br />
</p>
<p style="margin-bottom: 0in;"><font face="Bitstream Vera Sans"><span lang="zh-CN">重要一点，按目前</span></font>Windows Vista<font face="Bitstream Vera Sans"><span lang="zh-CN">的配置需求，我觉得安装</span></font>Vista<font face="Bitstream Vera Sans"><span lang="zh-CN">的</span></font>PC<font face="Bitstream Vera Sans"><span lang="zh-CN">或笔记本在价格上应该与</span></font>MAC<font face="Bitstream Vera Sans"><span lang="zh-CN">的价格相差不多。既然如此，如果你追求完美主义，为何不直奔</span></font>MAC<font face="Bitstream Vera Sans"><span lang="zh-CN">而去！这也是我们身边很多人的想法，在今年春季拥有一台</span></font>OS X Leopard<font face="Bitstream Vera Sans"><span lang="zh-CN">操作系统的</span></font>MAC<font face="Bitstream Vera Sans"><span lang="zh-CN">，在</span></font>Vista<font face="Bitstream Vera Sans"><span lang="zh-CN">发布的时候逃离</span></font>Windows<font face="Bitstream Vera Sans"><span lang="zh-CN">。</span></font></p>
<h2 style="margin-bottom: 0in;">结尾<br />
</h2>
总的来讲，看过《无极》之后，我就再也不看国内所谓的大片；用了这么多年的Windows之后，我也不再有任何兴趣去尝试Vista，何况是一个或许成为PC时代殉葬品的Vista。
          <br/>
          <span style="color:red;">
            <a href="http://erylee.javaeye.com/blog/52365#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 05 Feb 2007 21:50:07 +0800</pubDate>
        <link>http://erylee.javaeye.com/blog/52365</link>
        <guid>http://erylee.javaeye.com/blog/52365</guid>
      </item>
      <item>
        <title>MVC模式变化讨论</title>
        <author>erylee</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://erylee.javaeye.com">erylee</a>&nbsp;
          链接：<a href="http://erylee.javaeye.com/blog/50690" style="color:red;">http://erylee.javaeye.com/blog/50690</a>&nbsp;
          发表时间: 2007年01月26日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p style="margin-bottom: 0in;">MVC<font face="AR PL ShanHeiSun Uni"><span lang="zh-CN">根据不同的应用场景，有各种不同的变化，本文列举了我们整理的几个</span></font>MVC<font face="AR PL ShanHeiSun Uni"><span lang="zh-CN">应用形式，用于大家讨论补充。<span style="font-weight: bold;"><br />
</span></span></font></p>
<h3><strong>MCV(Standard):</strong></h3>
<p align="left" style="margin-bottom: 0in; font-style: normal; text-decoration: none;"> <img src="http://docs.google.com/File?id=ajb63mf8qh8d_116dqgh7q" height="269" align="left" alt="" width="584" /><br clear="left" />
</p>
<br />
<h3>MVC(Swing):</h3>
<p style="margin-bottom: 0in; font-style: normal; text-decoration: none;"> <img src="http://docs.google.com/File?id=ajb63mf8qh8d_120g6jdf8" height="227" align="left" alt="" width="523" /><br clear="left" />
</p>
<br />
<p style="margin-bottom: 0in;"> </p>
<h3>MVC(JFace Data Binding):</h3>
<p style="margin-bottom: 0in;"><img src="http://docs.google.com/File?id=ajb63mf8qh8d_117fbzm7c" height="149" align="left" alt="" width="605" /><br clear="left" />
</p>
<p style="margin-bottom: 0in;"><br />
</p>
<br />
<h3>MVC(Rails):</h3>
<p style="margin-bottom: 0in;"><img src="http://docs.google.com/File?id=ajb63mf8qh8d_118hnkpcw" align="left" alt="" /><br clear="left" />
</p>
<br />
<h3>MVC(DataSource for GWT):</h3>
<p style="margin-bottom: 0in;"><img src="http://docs.google.com/File?id=ajb63mf8qh8d_1192rmzfm" height="226" align="left" alt="" width="636" /><br clear="left" />
<br />
</p>
<p style="margin-bottom: 0in;"><br />
</p>
          <br/>
          <span style="color:red;">
            <a href="http://erylee.javaeye.com/blog/50690#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 26 Jan 2007 16:19:03 +0800</pubDate>
        <link>http://erylee.javaeye.com/blog/50690</link>
        <guid>http://erylee.javaeye.com/blog/50690</guid>
      </item>
      <item>
        <title>OpenCore:基于OSGi开发纯插件体系结构的WEB应用程序</title>
        <author>erylee</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://erylee.javaeye.com">erylee</a>&nbsp;
          链接：<a href="http://erylee.javaeye.com/blog/50624" style="color:red;">http://erylee.javaeye.com/blog/50624</a>&nbsp;
          发表时间: 2007年01月26日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          随着OSGi/Equinox逐渐成为Java EE服务端的基础软件架构，OSGi上部署WEB应用程序的解决方案日渐成熟。这里介绍三种目前我们所知的解决方案，前两种是Equinox组织提出的方案，后一种是OpenCore平台采取的解决方案。<br />
<h3>解决方案一: 部署OSGi/Equinox在Servlet容器中</h3>
具体实现: 把OSGi/equinox打包在WAR中，当Servlet容器加载WAR时，启动OSGi框架。<br />
WEB-INF的目录结构大致如下(大致如此):<br />
<div class="dp-highlighter">
<ol class="dp-j" start="1">
    <li class="alt"><span><span>*&nbsp;/WEB-INF&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;o&nbsp;/web.xml&nbsp;(with&nbsp;one&nbsp;servlet&nbsp;entry&nbsp;assigning&nbsp;all&nbsp;incoming&nbsp;requests&nbsp;to&nbsp;the&nbsp;BridgeServlet)&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;o&nbsp;/lib/servletbridge.jar&nbsp;(the&nbsp;classes&nbsp;associated&nbsp;with&nbsp;the&nbsp;equinox.servletbridge)&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;o&nbsp;/eclipse&nbsp;(the&nbsp;eclipse&nbsp;platform&nbsp;directory)&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+&nbsp;launch.ini&nbsp;(contains&nbsp;framework&nbsp;properties&nbsp;that&nbsp;will&nbsp;allow&nbsp;override&nbsp;of&nbsp;any&nbsp;eclipse&nbsp;specific&nbsp;System&nbsp;Properties)&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+&nbsp;/configuration&nbsp;(contains&nbsp;config.ini&nbsp;which&nbsp;lists&nbsp;the&nbsp;bundles&nbsp;you&nbsp;want&nbsp;to&nbsp;have&nbsp;available)&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+&nbsp;/features&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+&nbsp;/plugins&nbsp;&nbsp;</span></li>
</ol>
</div>
<br />
部署结构如下图(<strong>转载</strong>):<br />
<br />
<br />
<img title="OSGi/Equinox部署在Servlet容器内" src="http://docs.google.com/File?id=ajb63mf8qh8d_111f4cv2s" alt="" style="height: 254px; width: 576px;" /><br />
<br />
个人感觉这个解决方案使用价值不大。<br />
<br />
<h3>解决方案二: Web服务器与Servlet容器嵌入在OSGi/Equinox</h3>
具体实现: 把Jetty当作一个插件嵌入到OSGi/Equinox中，并基于Jetty实现OSGi标准中的HTTP服务，其他插件可以通过该服务注册Servlet和静态页面。<br />
<br />
OSGi标准中的HTTP服务接口如下：<br />
<br />
<span style="color: rgb(102, 51, 255);"></span>
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol class="dp-j" start="1">
    <li class="alt"><span><span class="keyword">package</span><span>&nbsp;org.osgi.service.http;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="keyword">import</span><span>&nbsp;javax.servlet.Servlet;&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="keyword">import</span><span>&nbsp;javax.servlet.ServletException;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="keyword">import</span><span>&nbsp;java.util.Dictionary;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">interface</span><span>&nbsp;HttpService&nbsp;{&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;registerServlet(String&nbsp;alias,&nbsp;Servlet&nbsp;servlet,&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Dictionary&nbsp;initparams,&nbsp;HttpContext&nbsp;context)&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">throws</span><span>&nbsp;ServletException,&nbsp;NamespaceException;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;registerResources(String&nbsp;alias,&nbsp;String&nbsp;name,&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HttpContext&nbsp;context)&nbsp;<span class="keyword">throws</span><span>&nbsp;NamespaceException;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;unregister(String&nbsp;alias);&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">public</span><span>&nbsp;HttpContext&nbsp;createDefaultHttpContext();&nbsp;&nbsp;</span></span></li>
    <li class=""><span>}&nbsp;&nbsp;</span></li>
</ol>
</div>
<br />
<br />
部署结构图(<span style="font-weight: bold;">转载</span>):<br />
<br />
<img title="嵌入Servlet容器到OSGi/Equinox中" src="http://docs.google.com/File?id=ajb63mf8qh8d_112hmf5js" alt="" style="height: 135px; width: 576px;" /><br />
<br />
因为OSGi是最早为嵌入式系统设计，所以OSGi标准中的HTTP服务只提供了有限的Servlet与静态资源的发布功能，没有一个完整的WEB容器概念，这种模式更适合通过WEB方式暴露(Export)服务，不太适合开发展现层的WEB应用。<br />
<br />
通过Equinox提供的扩展/扩展点功能可以简化这种方式WEB应用的开发，就是通过plugin.xml来配置Servlet和静态页面的注册。<br />
<br />
<h3>解决方案三: 设计适合OSGi环境的Servlet容器，构建纯插件体系结构的WEB层</h3>
具体实现：&quot;插件&quot;与我们通常所说软件&quot;模块&quot;的一个区别是：插件能自我描述，加载运行在插件容器中。那么，我们可以分层扩展一个插件的自我描述，用类似Decorator的模式为插件增加&ldquo;特征&rdquo;描述。 所以，我们在OpenCore中定义了三种特征的插件，如下图：<br />
<br />
<img src="http://docs.google.com/File?id=ajb63mf8qh8d_72f3ngnj" alt="" style="width: 191px; height: 116px;" /><br />
<br />
这三种插件类型间关系类似Decorator模式，从内到外增加&quot;特征&quot;描述：<br />
<ol>
    <li>     OSGi标准插件，自描述文件&quot;META-INF/MANIFEST.MF&quot;     </li>
    <li>       OpenCore插件，增加自描述文件&quot;META-INF/opencore.xml&quot;，实现符合OSGi环境的依赖注册(IoC)与动态扩展点       </li>
    <li>         OpenCore Web插件，增加自描述文件&quot;WEB-INF/web.xml&quot;(符合Servlet规范)，WEB特性的插件，可以部署在Servlet容器内</li>
</ol>
<br />
这样我们可以把一个应用的WEB层像业务层一样，分割为多个插件，部署在OSGi/Equinox的框架中.<br />
<br />
部署结构图:<br />
<br />
<img src="http://docs.google.com/File?id=ajb63mf8qh8d_73gnt2jc" alt="" style="width: 478px; height: 343px;" /> <br />
<br />
<br />
<img src="http://docs.google.com/File?id=ajb63mf8qh8d_74cssz7s" alt="" style="width: 513px; height: 347px;" /><br />
<br />
我 们觉得这种方式以合适的力度将WEB层分割为插件部署在OSGi框架上，充分的发挥了OSGi体系结构的强大之处，也提高了WEB层开发部署的灵活性。目 前，业界好像也有很多项目是采用这中方式部署。这种部署方式的缺点是，不得不修改Jetty容器的实现，以使其适应OSGi的环境，我们希望Jetty以 后能支持这个功能:)<br />
<br />
Google Code上发布了一个基于OpenCore的示例项目linktalk，一个基于GWT、Equinox、OpenCore的Ajax聊天室。<br />
<br style="font-family: Arial;" />
<span style="font-family: Arial;">项目地址: http://code.google.com/p/lintkalk<br />
<br style="font-family: Arial;" />
</span><span style="font-family: Arial;">源码下载: svn checkout https://linktalk.googlecode.com/svn/trunk/project<br />
<br />
程序下载: svn checkout https://linktalk.googlecode.com/svn/trunk/release<br />
<br />
</span>
<h3>相关资源:</h3>
<a href="http://www.eclipse.org/equinox/server/http_quickstart.php" target="_blank">http://www.eclipse.org/equinox/server/http_quickstart.php</a>  <span style="margin: 1em; font-size: 120%; font-family: Arial;"><span style="font-family: Arial;"></span><span style="margin: 1em; font-size: 120%; font-family: Arial;"></span><br style="font-family: Arial;" /></span>
          <br/>
          <span style="color:red;">
            <a href="http://erylee.javaeye.com/blog/50624#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 26 Jan 2007 14:15:50 +0800</pubDate>
        <link>http://erylee.javaeye.com/blog/50624</link>
        <guid>http://erylee.javaeye.com/blog/50624</guid>
      </item>
      <item>
        <title>Equinox Launcher的启动配置参数</title>
        <author>erylee</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://erylee.javaeye.com">erylee</a>&nbsp;
          链接：<a href="http://erylee.javaeye.com/blog/46746" style="color:red;">http://erylee.javaeye.com/blog/46746</a>&nbsp;
          发表时间: 2007年01月12日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          Eclipse Equinox OSGi平台的启动方式一般有两种：一种是直接通过startup.jar启动，另一种是通过Equinox提供的可执行的加载器(Launcher)启动。两种方式都是通过读取config.ini文件初始化系统，只是配置方式有所不同。<br />
<br />
<h2>通过startup.jar启动</h2>
命令: java -jar startup.jar -console -clean<br />
<br />
configuration/config.ini的配置很简单，只需要在osgi.bundles参数加入你需要启动的插件，示例配置如下：<br />
<div class="code_title">INI 代码</div>
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol class="dp-j" start="1">
    <li class="alt"><span><span>osgi.bundles=</span><span class="annotation"></span><span>org.eclipse.osgi.services</span><span class="annotation">@1</span><span>:start,&nbsp;org.eclipse.osgi.util</span><span class="annotation">@1</span><span>:start,&nbsp;org.eclipse.equinox.common</span><span class="annotation">@1</span><span>:start, ...</span><strong><font color="#0000ff"><span>你的插件</span></font></strong><span class="annotation"></span><span></span><span class="annotation"></span><span></span><span class="annotation"></span><span></span><span class="annotation"></span><span></span><span class="annotation"></span><span><br />
    </span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>eclipse.ignoreApp=<span class="keyword">true</span><span> //<strong>重要：让equinox平台不检查eclipse.product和eclipse.application配置<br />
    </strong></span></span></li>
    <li class=""><strong><span>&nbsp;&nbsp;</span></strong></li>
    <li class="alt"><span>osgi.clean=<span class="keyword">true</span><span>&nbsp; //保证每次启动清除cache<br />
    </span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>osgi.console=&nbsp; //显示控制台，以便查询系统、插件、服务状态</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>osgi.noShutdown=<span class="keyword">true</span><span>&nbsp; //<strong>重要:缺省情况下，Equinox启动后马上shutdown;通过该参数配置equinox启动后不关闭</strong></span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>eclipse.buildId=<span class="annotation">@build</span><span>@&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>eof=eof&nbsp;&nbsp;</span></li>
</ol>
</div>
<br />
<h2>通过可执行的Launcher启动</h2>
命令: eclipse.exe (Window平台下)<br />
<br />
configuration/config.ini的配置文件中除了自己的插件，还需要增加很多Eclipse/Equinox的插件，示例配置如下:<br />
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol class="dp-j" start="1">
    <li class="alt"><span><span>osgi.bundles=</span><span class="annotation"></span><span>org.eclipse.osgi.services</span><span class="annotation">@1</span><span>:start,&nbsp;org.eclipse.osgi.util</span><span class="annotation">@1</span><span>:start, <br />
    </span></span></li>
    <li class="alt"><span><span>org.eclipse.equinox.common</span><span class="annotation">@1</span><span>:start,&nbsp;org.eclipse.equinox.preferences</span><span class="annotation">@1</span><span>:start, <br />
    </span></span></li>
    <li class="alt"><span><span>org.eclipse.equinox.registry</span><span class="annotation">@1</span><span>:start,&nbsp;org.eclipse.equinox.app</span><span class="annotation">@1</span><span>:start, <br />
    </span></span></li>
    <li class="alt"><span><span>org.eclipse.core.jobs</span><span class="annotation">@1</span><span>:start,&nbsp;org.eclipse.core.contenttype</span><span class="annotation">@1</span><span>:start, <br />
    </span></span></li>
    <li class="alt"><span><span>org.eclipse.update.configurator</span><span class="annotation">@1</span><span>:start,&nbsp;org.eclipse.core.runtime</span><span class="annotation">@1</span><span>:start, <br />
    </span></span></li>
    <li class="alt"><span><span>org.eclipse.core.runtime.compatibility</span><span class="annotation">@1</span><span>,&nbsp;org.eclipse.core.runtime.compatibility.auth</span><span class="annotation">@1</span><span>, <br />
    </span></span></li>
    <li class="alt"><span><span>org.eclipse.core.runtime.compatibility.registry</span><span class="annotation">@1</span><span>, </span><span class="annotation"></span><span></span><span class="annotation"></span><span></span><span class="annotation"></span><span></span><span class="annotation"></span><span></span><span class="annotation"></span><span></span><span class="annotation"></span><span></span><span class="annotation"></span><span></span><span class="annotation"></span><span></span><span class="annotation"></span><span><span></span></span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>eclipse.ignoreApp=<span class="keyword">true</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>osgi.noShutdown=<span class="keyword">true</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>osgi.console=&nbsp;&nbsp;</span></li>
    <li class=""><span>osgi.clean=<span class="keyword">true</span><span>&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<br />
<br />
Equinox的启动参数见下面文档： <br />
<a href="http://help.eclipse.org/help32/index.jsp?topic=/org.eclipse.platform.doc.isv/reference/misc/index.html">http://help.eclipse.org/help32/index.jsp?topic=/org.eclipse.platform.doc.isv/reference/misc/index.html</a>
          <br/>
          <span style="color:red;">
            <a href="http://erylee.javaeye.com/blog/46746#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 12 Jan 2007 18:09:18 +0800</pubDate>
        <link>http://erylee.javaeye.com/blog/46746</link>
        <guid>http://erylee.javaeye.com/blog/46746</guid>
      </item>
      <item>
        <title>OpenCore中的核心概念：服务(Service)与插件(Plugin)的定义</title>
        <author>erylee</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://erylee.javaeye.com">erylee</a>&nbsp;
          链接：<a href="http://erylee.javaeye.com/blog/43303" style="color:red;">http://erylee.javaeye.com/blog/43303</a>&nbsp;
          发表时间: 2007年01月05日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <font size="3" face="Times New Roman"><span style="font-size: 10pt; font-family: Verdana;">OpenCore纯插件体系结构中的核心概念包括：</span></font><font size="3" face="Times New Roman"><span style="font-size: 10pt; font-family: Verdana;">微内核</span><span lang="EN-US" style="font-size: 10pt; font-family: Verdana;"></span></font><font size="3" face="Times New Roman"><span style="font-size: 10pt; font-family: Verdana;">、插件与服务。<br />
<br />
<strong>微内核</strong></span><strong><span lang="EN-US" style="font-size: 10pt; font-family: Verdana;">(MicroKernel)</span></strong><span style="font-size: 10pt; font-family: Verdana;"><strong>： </strong>提供基础的插件与服务架构；负责插件的生命周期管理，包括插件的安装<span lang="EN-US">(Install)</span>、启用<span lang="EN-US">(Activate)</span>、停止<span lang="EN-US">(Deactivate)</span>与卸载<span lang="EN-US">(Uninstall)</span>；负责服务的生命周期管理，包括服务的注册<span lang="EN-US">(Register)</span>、发现<span lang="EN-US">(Lookup)</span>、启动<span lang="EN-US">(Start)</span>、停止<span lang="EN-US">(Stop)</span>，服务间的依赖绑定。<br />
<br />
OpenCore微内核分两层：<br />
</span></font>
<ol>
    <li>     <font size="3" face="Times New Roman"><span style="font-size: 10pt; font-family: Verdana;">应用系统的</span><span style="font-size: 10pt; font-family: Verdana;">核心层：以</span><span style="font-size: 10pt; font-family: Verdana;"><span lang="EN-US">OSGi为基础</span></span></font>   </li>
    <li>     <font size="3" face="Times New Roman"><span style="font-size: 10pt; font-family: Verdana;">增强层：<span lang="EN-US"></span><span lang="EN-US">IoC</span>实现、扩展点机制与RMI插件</span></font></li>
</ol>
<br />
<font size="3" face="Times New Roman"><strong><span style="font-size: 10pt; font-family: Verdana;"></span><span style="font-size: 10pt; font-family: Verdana;"></span><span style="font-size: 10pt; font-family: Verdana;"></span><span style="font-size: 10pt; font-family: Verdana;">插件</span><span lang="EN-US" style="font-size: 10pt; font-family: Verdana;">(Plugin)</span></strong><span style="font-size: 10pt; font-family: Verdana;"><strong>：</strong>OpenCore是一个纯插件结构的系统，包括内核在内的所有特性都由插件构成。插件是对系统</span><span style="font-size: 10pt; font-family: Verdana;">中静态结构方面的抽象，满足某种约束并提供自描述的物理软件模块。</span><span lang="EN-US" style="font-size: 10pt; font-family: Garamond;">OSGi</span><span style="font-size: 10pt; font-family: Verdana;">中插件叫</span><span lang="EN-US" style="font-size: 10pt; font-family: Garamond;">Bundle</span><span style="font-size: 10pt; font-family: Verdana;">，物理上是一个提供自描述文件（</span><span lang="EN-US" style="font-size: 10pt; font-family: Garamond;">MANIFEST.MF</span><span style="font-size: 10pt; font-family: Verdana;">）的</span><span lang="EN-US" style="font-size: 10pt; font-family: Garamond;">Jar</span><span style="font-size: 10pt; font-family: Verdana;">文件。插件可以被动态的安装、激活、去激活与卸载。插件包含多个服务</span><span lang="EN-US" style="font-size: 10pt; font-family: Garamond;">(Service)</span><span style="font-size: 10pt; font-family: Verdana;">对象。<br />
<br />
插件间的依赖关系包括两种：<br />
</span></font>
<ol>
    <li>     <font size="3" face="Times New Roman"><span style="font-size: 10pt; font-family: Verdana;">物理依赖，即插件间的Class依赖，例如A插件Import B插件的Class</span></font>   </li>
    <li>     <font size="3" face="Times New Roman"><span style="font-size: 10pt; font-family: Verdana;">逻辑依赖，插件A中的服务依赖插件B中的服务。</span></font>   </li>
</ol>
<font size="3" face="Times New Roman"><span style="font-size: 10pt; font-family: Verdana;">插件的概念描述图如</span></font><span style="font-size: 10pt; font-family: Verdana;"><font size="3" face="Times New Roman">下：</font><br />
</span><span style="font-size: 10pt; font-family: Verdana;"><br />
</span>
<div style="text-align: center;">   <img src="http://docs.google.com/File?id=ajb63mf8qh8d_36g74kxs" alt="" style="width: 335px; height: 305px;" /><br />
</div>
<br />
<p>   <strong><span style="font-size: 10pt; font-family: Verdana;">服务</span><span lang="EN-US" style="font-size: 10pt; font-family: Garamond;">(Service)</span></strong><span style="font-size: 10pt; font-family: Verdana;"><strong>：</strong><span style="font-weight: normal;">系统中动态结构方面的抽象，是运行时的概念，是具有良好接口与自我描述的业务功能提供者。</span></span><span lang="EN-US" style="font-weight: normal; font-size: 10pt; font-family: Garamond;">Java</span><span style="font-weight: normal; font-size: 10pt; font-family: Verdana;">平台上是一个具有良好接口对象实例。服务可以被注册、发现、启动与停止。运行时，服务间在同一</span><span lang="EN-US" style="font-weight: normal; font-size: 10pt; font-family: Garamond;">JVM</span><span style="font-weight: normal; font-size: 10pt; font-family: Verdana;">内通过传引用（</span><span lang="EN-US" style="font-weight: normal; font-size: 10pt; font-family: Garamond;">By-Reference</span><span style="font-weight: normal; font-size: 10pt; font-family: Verdana;">）依赖协作，在不同</span><span lang="EN-US" style="font-weight: normal; font-size: 10pt; font-family: Garamond;">JVM</span><span style="font-weight: normal; font-size: 10pt; font-family: Verdana;">内通过</span><span lang="EN-US" style="font-weight: normal; font-size: 10pt; font-family: Garamond;">RMI</span><span style="font-weight: normal; font-size: 10pt; font-family: Verdana;">、</span><span lang="EN-US" style="font-weight: normal; font-size: 10pt; font-family: Garamond;">JMS</span><span style="font-weight: normal; font-size: 10pt; font-family: Verdana;">、</span><span lang="EN-US" style="font-weight: normal; font-size: 10pt; font-family: Garamond;">REST</span><span style="font-weight: normal; font-size: 10pt; font-family: Verdana;">等传值方式（</span><span lang="EN-US" style="font-weight: normal; font-size: 10pt; font-family: Garamond;">By-Value</span><span style="font-weight: normal; font-size: 10pt; font-family: Verdana;">）通信协作。</span></p>
<h1> </h1>
<h1> </h1>
<p>   <span style="font-weight: normal; font-size: 10pt; font-family: Verdana;">服务的概念描述图如下：</span> </p>
<h1> </h1>
<div style="text-align: center;">   <img src="http://docs.google.com/File?id=ajb63mf8qh8d_39g55r5k" alt="" style="width: 380px; height: 286px;" /><br />
</div>
<br />
服务间依赖关系(Dependency and Relations)有三种：<br />
<br />
<ol>
    <li>     进程间通过连接器(Connector)以传值(By-Value)方式通信和协作   </li>
    <li>     进程内通过Java接口调用以传引用(By-Reference)方式通信协作   </li>
    <li>     进程内一个服务可以作为对另一服务的扩展   </li>
</ol>
<br />
服务间关系的概念描述图：<br />
<br />
<div style="text-align: center;">   <img src="http://docs.google.com/File?id=ajb63mf8qh8d_40g996tt" alt="" style="width: 383px; height: 304px;" /><br />
</div>
          <br/>
          <span style="color:red;">
            <a href="http://erylee.javaeye.com/blog/43303#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 05 Jan 2007 22:00:11 +0800</pubDate>
        <link>http://erylee.javaeye.com/blog/43303</link>
        <guid>http://erylee.javaeye.com/blog/43303</guid>
      </item>
      <item>
        <title>OpenCore: OSGi上实现IoC容器</title>
        <author>erylee</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://erylee.javaeye.com">erylee</a>&nbsp;
          链接：<a href="http://erylee.javaeye.com/blog/43302" style="color:red;">http://erylee.javaeye.com/blog/43302</a>&nbsp;
          发表时间: 2007年01月05日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          Martin Fowler有一篇文章里称：说一个面向对象系统框架或结构是基于IoC的，就好像说汽车有四个轮子一样。非常精辟 ，IoC或者DI更多的是一个设计原则，一个设计良好的面向对象的系统或多或少都有这方面的特点，这与是否有一个IoC容器的关系不大，IoC容器的作用 是简化开发，强制系统遵循IoC原则而已。<br />
<br />
OpenCore在最初设计的时候，没有考虑IoC容器的问题，主要是解决服务端的WEB开发、数据库访问、与REST远程通信等问题，我们完全使用 OSGi本身的服务注册机制，在插件启动时用代码实现依赖注射。直到今年8月份左右，我们把依赖注射的职责分离出来，在OSGi上实现了一个分级的IoC 容器，以简化开发，避免在插件启动类写依赖注射的代码。<br />
<br />
OpenCore IoC容器有下面几个特性：<br />
<ol>
    <li>完全基于OSGi的插件体系结构。</li>
    <li>     简单，远没有Spring IoC容器复杂，支持属性注射(Property Injection)与构造函数注册(Constructor Injection)。   </li>
    <li>     分级IoC容器，分为插件级、应用程序级、网络级   </li>
    <li>     IoC容器管理的服务与OSGi框架管理的服务可以互访，这样保证了OpenCore IoC不会屏蔽OSGi本身的模型，使得基于OpenCore IoC的插件与大量第三方基于完全基于OSGi服务模型的插件可以协作。</li>
    <li>支持通过动态扩展点实现1对多的依赖注册机制。<br />
    </li>
</ol>
OpenCore IoC的实现机制：<br />
<br />
1. 每个插件(bundle)增加一个IoC的自描述文件META-INF/OPENCORE.XML，例如org.opengoss.web.core中，该文件的配置如下：<br />
<font color="#3366ff"><br />
<font color="#0000ff">
<plugin id="WebCore" version="1.0"></plugin>
</font></font>
<div class="code_title">xml 代码</div>
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol class="dp-xml" start="1">
    <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">plugin</span><span>&nbsp;</span><span class="attribute">id</span><span>=</span><span class="attribute-value">&quot;WebCore&quot;</span><span>&nbsp;</span><span class="attribute">version</span><span>=</span><span class="attribute-value">&quot;1.0&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">service</span><span>&nbsp;</span><span class="attribute">id</span><span>=</span><span class="attribute-value">&quot;WebServerConfiguration&quot;</span><span>&nbsp;</span><span class="attribute">scope</span><span>=</span><span class="attribute-value">&quot;application&quot;</span><span>&nbsp;</span><span class="attribute">class</span><span>=</span><span class="attribute-value">&quot;org.opengoss.web.internal.WebServerConfiguration&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">interface</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;org.opengoss.web.core.IWebServerConfiguration&quot;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">service</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">service</span><span>&nbsp;</span><span class="attribute">id</span><span>=</span><span class="attribute-value">&quot;MarshallerRegistry&quot;</span><span>&nbsp;</span><span class="attribute">scope</span><span>=</span><span class="attribute-value">&quot;application&quot;</span><span>&nbsp;</span><span class="attribute">class</span><span>=</span><span class="attribute-value">&quot;org.opengoss.web.internal.MarshallerRegistry&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">interface</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;org.opengoss.web.service.IMarshallerRegistry&quot;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">service</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">service</span><span>&nbsp;</span><span class="attribute">id</span><span>=</span><span class="attribute-value">&quot;WSContainer&quot;</span><span>&nbsp;</span><span class="attribute">scope</span><span>=</span><span class="attribute-value">&quot;application&quot;</span><span>&nbsp;</span><span class="attribute">class</span><span>=</span><span class="attribute-value">&quot;org.opengoss.web.internal.WSContainer&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">interface</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;org.opengoss.web.service.IWSContainer&quot;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">property</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;marshallerRegistry&quot;</span><span>&nbsp;</span><span class="attribute">ref</span><span>=</span><span class="attribute-value">&quot;MarshallerRegistry&quot;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">service</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">service</span><span>&nbsp;</span><span class="attribute">id</span><span>=</span><span class="attribute-value">&quot;WSExporter&quot;</span><span>&nbsp;</span><span class="attribute">scope</span><span>=</span><span class="attribute-value">&quot;application&quot;</span><span>&nbsp;</span><span class="attribute">class</span><span>=</span><span class="attribute-value">&quot;org.opengoss.web.internal.WSExporter&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">interface</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;org.opengoss.web.service.IWSExporter&quot;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">constructor</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">param</span><span>&nbsp;</span><span class="attribute">ref</span><span>=</span><span class="attribute-value">&quot;WSContainer&quot;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">constructor</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">service</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">extension-point</span><span>&nbsp;</span><span class="attribute">id</span><span>=</span><span class="attribute-value">&quot;Marshaller&quot;</span><span>&nbsp;</span><span class="attribute">target</span><span>=</span><span class="attribute-value">&quot;MarshallerRegistry&quot;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="attribute">bindMethod</span><span>=</span><span class="attribute-value">&quot;addMarshaller&quot;</span><span>&nbsp;</span><span class="attribute">unbindMethod</span><span>=</span><span class="attribute-value">&quot;removeMarshaller&quot;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">extension-point</span><span>&nbsp;</span><span class="attribute">id</span><span>=</span><span class="attribute-value">&quot;WebService&quot;</span><span>&nbsp;</span><span class="attribute">target</span><span>=</span><span class="attribute-value">&quot;WSExporter&quot;</span><span>&nbsp;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="attribute">bindMethod</span><span>=</span><span class="attribute-value">&quot;export&quot;</span><span>&nbsp;</span><span class="attribute">unbindMethod</span><span>=</span><span class="attribute-value">&quot;unexport&quot;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">extension-point</span><span>&nbsp;</span><span class="attribute">id</span><span>=</span><span class="attribute-value">&quot;Class&quot;</span><span>&nbsp;</span><span class="attribute">target</span><span>=</span><span class="attribute-value">&quot;MarshallerRegistry&quot;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="attribute">bindMethod</span><span>=</span><span class="attribute-value">&quot;addAliasClass&quot;</span><span>&nbsp;</span><span class="attribute">unbindMethod</span><span>=</span><span class="attribute-value">&quot;removeAliasClass&quot;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="tag">&lt;/</span><span class="tag-name">plugin</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<br />
<br />
2. 插件的激活类(Activator)不是直接实现OSGi本身的&quot;BundleActivator&quot;接口，而是继承由OpenCore提供的 &quot;org.opengoss.core.PluginActivator&quot;，启动时，PluginActivator负责完成XML文件解析与依赖注射。 例如org.opengoss.web.core中的Activator代码如下：<br />
<br />
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol class="dp-j" start="1">
    <li class="alt"><span><span class="keyword">import</span><span>&nbsp;org.opengoss.core.IPluginContext;&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="keyword">import</span><span>&nbsp;org.opengoss.core.PluginActivator;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="comment">/**</span>&nbsp;</span></li>
    <li class=""><span><span class="comment">&nbsp;*&nbsp;Plugin&nbsp;activator.</span>&nbsp;</span></li>
    <li class="alt"><span><span class="comment">&nbsp;*</span>&nbsp;</span></li>
    <li class=""><span><span class="comment">&nbsp;*&nbsp;@author&nbsp;Ery&nbsp;Lee(ery.lee@gmail.com)</span>&nbsp;</span></li>
    <li class="alt"><span><span class="comment">&nbsp;*&nbsp;@version&nbsp;1.0&nbsp;2006-11-20</span>&nbsp;</span></li>
    <li class=""><span><span class="comment">&nbsp;*&nbsp;@since&nbsp;1.0</span>&nbsp;</span></li>
    <li class="alt"><span><span class="comment">&nbsp;*/</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;Activator&nbsp;</span><span class="keyword">extends</span><span>&nbsp;PluginActivator&nbsp;{&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="annotation">@Override</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">protected</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;startPlugin(IPluginContext&nbsp;pluginContext)&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">throws</span><span>&nbsp;Exception&nbsp;{&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="annotation">@Override</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">protected</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;stopPlugin(IPluginContext&nbsp;pluginContext)&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">throws</span><span>&nbsp;Exception&nbsp;{&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;</span></li>
    <li class=""><span>}&nbsp;&nbsp;&nbsp;</span></li>
</ol>
</div>
<br />
<br />
3. 我们注意到上的的服务配置中有&quot;scope&quot;的属性，该属性定义一个服务的使用范围，确定一个服务注册到哪一级IoC容器。<br />
<br />
4. 另外一点，我们在IoC基础上增加了动态扩展点功能，实现多对1的注射。<br />
<br />
OpenCore整个项目代码发布在www.sf.net/projects/opengoss与code.google.com/p/opengoss下。
          <br/>
          <span style="color:red;">
            <a href="http://erylee.javaeye.com/blog/43302#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 05 Jan 2007 21:49:21 +0800</pubDate>
        <link>http://erylee.javaeye.com/blog/43302</link>
        <guid>http://erylee.javaeye.com/blog/43302</guid>
      </item>
      <item>
        <title>C语言已经死了，5个需要忘却的理由?!  叶江出品！</title>
        <author>erylee</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://erylee.javaeye.com">erylee</a>&nbsp;
          链接：<a href="http://erylee.javaeye.com/blog/43207" style="color:red;">http://erylee.javaeye.com/blog/43207</a>&nbsp;
          发表时间: 2007年01月05日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          我一直认为CSDN是中国软件领域傻逼文章最多的地方，但这篇文章的傻逼程度还是超出了我们的想象...<br />
<br />
<a href="http://news.csdn.net/n/20070104/100312.html">http://news.csdn.net/n/20070104/100312.html</a><br />
<br />
虽然，我认为讨论语言的优劣是最无聊的事情，但这种误导开发者的傻逼文章，实在让人无法忍受。计算机内存模型没有根本变化的前提下，任何时候说C死掉，都有点过早。 无论任何语言，做了如何的封装，最终程序操作的还是堆栈，C仍然是最锐利、高效的操作堆栈的语言。<br />
<br />
文章中的傻逼语录：<br />
<br />
1. 发明垃圾处理器那人真应该得诺贝尔奖。<br />
2. 分配内存和释放内存在C语言中都是很慢的，非常慢。<br />
3. 指针太难以控制了，太阴险了;我甚至没有委婉一点的方式去形容它。<br />
4. 除非你使用新的javax.concurrent，否则也只能在那些巨大的平行摆放的机器们面前崩溃。<br />
<br />
.............<br />
<br />
<br />
<br />
<br />
<br />
<br />
          <br/>
          <span style="color:red;">
            <a href="http://erylee.javaeye.com/blog/43207#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 05 Jan 2007 12:04:20 +0800</pubDate>
        <link>http://erylee.javaeye.com/blog/43207</link>
        <guid>http://erylee.javaeye.com/blog/43207</guid>
      </item>
      <item>
        <title>Google Code for Educators: http://code.google.com/edu/</title>
        <author>erylee</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://erylee.javaeye.com">erylee</a>&nbsp;
          链接：<a href="http://erylee.javaeye.com/blog/41878" style="color:red;">http://erylee.javaeye.com/blog/41878</a>&nbsp;
          发表时间: 2006年12月31日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          Google Code发布的一些技术介绍资料和课件，还可搜索一些学术方面的资料。
          <br/>
          <span style="color:red;">
            <a href="http://erylee.javaeye.com/blog/41878#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 31 Dec 2006 17:58:56 +0800</pubDate>
        <link>http://erylee.javaeye.com/blog/41878</link>
        <guid>http://erylee.javaeye.com/blog/41878</guid>
      </item>
      <item>
        <title>OpenCore1.0.0M1 Released: Really Move OSGi to Server Side!</title>
        <author>erylee</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://erylee.javaeye.com">erylee</a>&nbsp;
          链接：<a href="http://erylee.javaeye.com/blog/41855" style="color:red;">http://erylee.javaeye.com/blog/41855</a>&nbsp;
          发表时间: 2006年12月31日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          OpenCore是基于OSGi/Equinox构建的纯插件体系结构的服务端平台，主要功能是在OSGi基础上支持分级IoC、B/S结构、数据库访问等服务端特性，是我们开发的opengoss平台与产品的内核。<br />
<br />
OpenCore1.0.0M1的发布只是一个很小的起点，但我们相信这是一个正确的技术方向，Java领域无论服务端还是客户端都将基于纯插件体系构建，并在同一业务领域(如我们开发的网络管理系统）实现组件级的复用与协作。<br />
<br />
OpenCore1.0.0M1将在光缆修复后发布在www.sf.net/projects/opengoss 或者 code.google.com/p/opengoss下，目前，我们上传了PetStore在ftp.javaeye.com上，作为给javaeye上朋友们的新年礼物:)<br />
<br />
ftp到ftp.javaeye.com获取opencore-petstore-bin.tar.gz，解压后运行./startup启动，然后访问http://localhost:8080/PetStoreWeb/index.html。还可以通过Equinox控制台命令，如ss/bundle/services，来查询插件与服务信息。<br />
<br />
我们集成Google发布的GWT-PetStore，整个系统结构:<br />
<br />
GWT-PetStore&lt;-------&gt;OpenCore&lt;--------&gt;HSQLDB<br />
<br />
文档和代码在光缆修复后发布在sourceforge或者google，希望有朋友加入进来一起开发，纯插件结构的服务端与组件级软件复用是一个令人无比激动的即将来临的未来，这比鼓吹垃圾的SOAP协议和庞杂的WS*规范要真实的多。<br />
<br />
祝所有朋友，新年快乐:)
          <br/>
          <span style="color:red;">
            <a href="http://erylee.javaeye.com/blog/41855#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 31 Dec 2006 15:42:18 +0800</pubDate>
        <link>http://erylee.javaeye.com/blog/41855</link>
        <guid>http://erylee.javaeye.com/blog/41855</guid>
      </item>
      <item>
        <title>OSGi技术预测: 未来几年60%的Java虚拟机上将部署OSGi</title>
        <author>erylee</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://erylee.javaeye.com">erylee</a>&nbsp;
          链接：<a href="http://erylee.javaeye.com/blog/41524" style="color:red;">http://erylee.javaeye.com/blog/41524</a>&nbsp;
          发表时间: 2006年12月29日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <meta content="text/html; charset=utf-8" http-equiv="CONTENT-TYPE" />
<title></title>
<meta name="GENERATOR" content="OpenOffice.org 2.0  (Linux)" />
<meta name="AUTHOR" content="Ery Lee" />
<meta name="CREATED" content="20061228;23093300" />
<meta name="CHANGEDBY" content="Ery Lee" />
<meta name="CHANGED" content="20061229;11381300" /> 	 	 	 	 	 	 	<style type="text/css">
	<!--
		@page { size: 21cm 29.7cm; margin: 2cm }
		P { margin-bottom: 0.21cm }
	-->
	</style>
<p style="margin-bottom: 0cm;">尽管我在一年前曾预测<font face="STHeiti, serif">OSGi</font>最终将部署在<font face="STHeiti, serif">60%</font>的<font face="STHeiti, serif">Java</font>虚拟机上，但<font face="STHeiti, serif">OSGi</font>的发展速度还是超出了我们的想象。一直认为<font face="STHeiti, serif">OSGi</font>规范是<font face="STHeiti, serif">Java</font>领域被埋没的一颗明珠，它优美的组件体系结构正是<font face="STHeiti, serif">Java</font>平台不可或缺的部分，应该直接纳入到<font face="STHeiti, serif">JDK</font>中。<br />
</p>
<p style="margin-bottom: 0cm;">众所周知，<font face="STHeiti, serif">Java</font>平台有庞大的开源框架、类库支持，但我们却一直停留在类与<font face="STHeiti, serif">API</font>层次的复用，一个较大的<font face="STHeiti, serif">Java</font>项目往往有大量的<font face="STHeiti, serif">Jar</font>包混乱的堆积在<font face="STHeiti, serif">classpath</font>下。所以<font face="STHeiti, serif">Java</font>领域迫切需要一个实现<strong>组件级复用</strong>的解决方案，将所有这些混乱不堪的类库与<font face="STHeiti, serif">API</font>以组件的形式发布，在统一的容器内组装协作，<font face="STHeiti, serif">OSGi</font>规范无疑是目前最为出色的候选者。</p>
<p style="margin-bottom: 0cm;"><font face="STHeiti, serif">OSGi</font>的规范已经提出<font face="STHeiti, serif">5</font>、<font face="STHeiti, serif">6</font>年的时间，到现在被业界广泛认可，其发展过程很有趣。<font face="STHeiti, serif">OSGi</font>规范最初定位于嵌入式系统，如家电、汽车、手机、家庭网关，满足单一<font face="STHeiti, serif">Java</font>虚拟机上启动多个<font face="STHeiti, serif">Java</font>应用程序和动态从网络安装卸载应用程序的需求。但那时嵌入式<font face="STHeiti, serif">Java</font>虚拟机还不成熟，更不用提<font face="STHeiti, serif">OSGi</font>的应用，尽管有宝马等知名公司的应用，但一直没有在<font face="STHeiti, serif">Java</font>嵌入式领域获得广泛的应用。<br />
</p>
<p style="margin-bottom: 0cm;">随后的发展一定超出了<font face="STHeiti, serif">OSGi</font>委员会<font face="STHeiti, serif">(<a href="http://www.osgi.org/">www.osgi.org</a>)</font>的想象，<font face="STHeiti, serif">OSGi</font>居然被<font face="STHeiti, serif">Eclipse</font>应用到了客户端。  <font face="STHeiti, serif">Eclipse</font>原本插件体系结构是一个基于<font face="STHeiti, serif">XML</font>的静态扩展结构，即扩展<font face="STHeiti, serif">(Extension)</font>与<font face="STHeiti, serif">(Extension Point)</font>，不知道当初基于什么样的考虑，<font face="STHeiti, serif">Eclipse</font>组织在<font face="STHeiti, serif">3.0</font>版本选择<font face="STHeiti, serif">OSGi</font>作为插件体系的内核，这样由<font face="STHeiti, serif">OSGi</font>负责插件体系架构中<font face="STHeiti, serif">ClassLoading</font>机制，由扩展与扩展点负责业务层面的扩展架构，这是一个很完美的结合。但我认为这实际上并不是<font face="STHeiti, serif">OSGi</font>的最佳实践，<font face="STHeiti, serif">Eclipse</font>原本的静态扩展架构限制了<font face="STHeiti, serif">OSGi</font>的动态性，也没有应用<font face="STHeiti, serif">OSGi</font>的服务层模型，而是大量基于单例<font face="STHeiti, serif">(Singleton) Plugin</font>调用协作，开发<font face="STHeiti, serif">RCP</font>客户端时，你会发现很少需要注册<font face="STHeiti, serif">OSGi</font>的服务，往往一个<font face="STHeiti, serif">Plugin</font>的入口类提供很多静态方法。当然，这也可能与<font face="STHeiti, serif">Eclipse</font>的延迟加载<font face="STHeiti, serif">(Lazy load)</font>机制有关。<br />
</p>
<p style="margin-bottom: 0cm;">尽管<font face="STHeiti, serif">Eclipse</font>不是<font face="STHeiti, serif">OSGi</font>的一个最佳实践，但随着<font face="STHeiti, serif">Eclipse</font>的成功，<font face="STHeiti, serif">OSGi</font>迅速普及与成熟，最终将<font face="STHeiti, serif">OSGi</font>推向它最擅长但一直被忽略的领域：<strong>企业级应用软件的服务端，纯插件体系架构的服务端！</strong><span style="">目前，大量的服务端开源架构与商业产品向</span><font face="STHeiti, serif"><span style="">OSGi</span></font><span style="">迁移，</span><font face="STHeiti, serif"><span style="">2007</span></font><span style="">年将是</span><font face="STHeiti, serif"><span style="">OSGi</span></font><span style="">服务端应用的开始。</span><br />
</p>
<p style="margin-bottom: 0cm;">随着<font face="STHeiti, serif">OSGi</font>在胖客户端<font face="STHeiti, serif">(RCP)</font>、服务端<font face="STHeiti, serif">(Server Side)</font>与嵌入式<font face="STHeiti, serif">Java</font>虚拟机上的广泛应用，相信未来几年内，<font face="STHeiti, serif">60%</font>的<font face="STHeiti, serif">Java</font>虚拟机上部署<font face="STHeiti, serif">OSGi</font>的目标并不是遥不可及。</p>
          <br/>
          <span style="color:red;">
            <a href="http://erylee.javaeye.com/blog/41524#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 29 Dec 2006 11:48:36 +0800</pubDate>
        <link>http://erylee.javaeye.com/blog/41524</link>
        <guid>http://erylee.javaeye.com/blog/41524</guid>
      </item>
      <item>
        <title>OSGi Pure Plugin Architecture Introduction</title>
        <author>erylee</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://erylee.javaeye.com">erylee</a>&nbsp;
          链接：<a href="http://erylee.javaeye.com/blog/41180" style="color:red;">http://erylee.javaeye.com/blog/41180</a>&nbsp;
          发表时间: 2006年12月28日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <h2>   OSGi体系结构 </h2>
<a href="http://www.osgi.org/" title="OSGi">OSGi</a> 的初衷是面向嵌入式系统的应用，支持在一个Java虚拟机上加载和启动多个Java应用程序。随着OSGi在Eclipse3.0上的应用成功，其逐渐成为构建纯插件结构的企业级应用软件系统的首选平台。<br />
<br />
<a href="http://www.osgi.org/" title="OSGi">OSGi</a> 是一个纯插件的体系结构，<a href="http://www.osgi.org/" title="OSGi">OSGi</a> 框架实现是一个最为核心的插件，逻辑实现分层见下面两张图：<br />
<br />
<br />
<div style="text-align: center;">   <img title="OSGi Architecture" src="http://docs.google.com/File?id=ajb63mf8qh8d_46cwd34v" alt="" style="width: 240px; height: 201px;" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <img src="http://docs.google.com/File?id=ajb63mf8qh8d_53cd6tc2" alt="" style="width: 193px; height: 193px;" /><br />
</div>
<h3>   L0层Java执行环境 </h3>
OSGi最初规范定位到嵌入式系统，例如家电、汽车、手机等执行环境，所以插件要配置适合的运行环境与Policy。当OSGi框架加载插件时会对插件要求的执行环境做校验。例如，Eclipse中可以配置下图中的执行环境：<br />
<br />
<div style="text-align: center;">   <img src="http://docs.google.com/File?id=ajb63mf8qh8d_55fft2xt" alt="" style="width: 324px; height: 371px;" /><br />
</div>
<br />
<h3>   L1模块层(组件或插件层)<br />
</h3>
L1模块层(插件层 或 组件层)定义插件的ClassLoading策略(Policy)，这也是OSGi最为出色和吸引人的地方。我们知道，任何一个Java平台的插件体系结 构，首先要解决的是ClassLoading的问题。OSGi在Java动态ClassLoading基础之上，提供了完美的插件 ClassLoading解决方案。传统J2SE程序，有单一的Classpath包含所有的classes与resources，L1插件层为每个 OSGi插件提供了私有的Classpath和独立的Classloader，有效的控制了插件间的Class隔离、依赖与协作。<br />
<br />
插件间的Class依赖关系见下图(版权归www.osgi.org)：<br />
<br />
<div style="text-align: center;">   <img src="http://docs.google.com/File?id=ajb63mf8qh8d_57h4pppf" alt="" style="width: 705px; height: 386px;" /><br />
</div>
插件的类空间(Class Space)见下图(版权归www.osgi.org)：<br />
<br />
<div style="text-align: center;">   <img src="http://docs.google.com/File?id=ajb63mf8qh8d_58hmf5xz" alt="" style="width: 546px; height: 414px;" /><br />
</div>
插件的类加载过程：<br />
<br />
<div style="text-align: center;">   <img src="http://docs.google.com/File?id=ajb63mf8qh8d_59dqvscw" alt="" style="width: 339px; height: 529px;" /><br />
</div>
<br />
<h3>   L2插件生命周期管理层 </h3>
L2层负责运行时动态安装(Install)、启动(Start)、停止(Stop)、更新(Update)或卸载(Uninstall)插件。<br />
<br />
插件的生命周期见下图(版权归www.osgi.org)：<br />
<br />
<div style="text-align: center;">   <img src="http://docs.google.com/File?id=ajb63mf8qh8d_60fcdjqf" alt="" style="width: 375px; height: 265px;" /><br />
</div>
<h3>   L3服务注册层 </h3>
L3提供了一个动态的服务注册模型，插件可以注册(register)、发现(lookup)、使用(reference)服务。<br />
<br />
该层的服务注册采用ServiceLocator模式，见下面图示：<br />
<br />
<div style="text-align: center;">   <img src="http://docs.google.com/File?id=ajb63mf8qh8d_61g7v8cb" alt="" style="width: 564px; height: 476px;" /><br />
</div>
<br />
该层的实现由于没有直接的IoC容器支持，被很多过分相信IoC作用的人所批评。Martin Fowler曾经说过，&ldquo;说一个系统是基于IoC的，就好像说一个汽车有四个轮子&rdquo;，IoC只不过是一种模式和设计原则，任何一个设计得比较好的面向对象 系统都或多或少的具备这样的特征，这与存不存在一个独立的IoC容器关系不大，尽管IoC容器在开发上带来很大的便利与优势。另外一个方面，IoC容器本 质上还是一个Service Registry，只不过增加依赖装配功能，所以在OSGi的服务注册模型上，可以很容易的支持IoC。<br />
<br />
OpenCore在该层的服务模型下实现了非常灵活的分级IoC容器，支持插件级、应用程序级、网络级的IoC功能。
          <br/>
          <span style="color:red;">
            <a href="http://erylee.javaeye.com/blog/41180#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 28 Dec 2006 14:06:31 +0800</pubDate>
        <link>http://erylee.javaeye.com/blog/41180</link>
        <guid>http://erylee.javaeye.com/blog/41180</guid>
      </item>
      <item>
        <title>OpenCore:OSGi上部署Apache Common Log</title>
        <author>erylee</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://erylee.javaeye.com">erylee</a>&nbsp;
          链接：<a href="http://erylee.javaeye.com/blog/40699" style="color:red;">http://erylee.javaeye.com/blog/40699</a>&nbsp;
          发表时间: 2006年12月25日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          Apache Common Log提供的动态Logger发现机制实在损害Apache基金会的声誉，这是一个看似巧妙实际上画蛇添足的设计。这种机制无法保证在有多 ClassLoader的JEE或OSGi环境下正常工作，这几天收到了Spring-OSGi google群组发出的&ldquo;Commons logging madness&rdquo;信件超过20封，今天又在java-blog上收到&ldquo;common log woes&quot;的文章，估计这个问题把很多人搞疯了:)<br />
<br />
最后，这帮家伙终于讨论出了解决方案，就是用SLF4J来替换Apache Common Log的实现。我们今天用这个方案替换掉了OpenCore原来的common log插件，静态帮定到Log4J，工作良好。<br />
<br />
具体插件实现如下：<br />
<br />
lib目录加入：<br />
jcl104-over-slf4j-1.1.0.jar<br />
log4j-1.2.13.jar&nbsp; <br />
slf4j-api-1.1.0.jar&nbsp; <br />
slf4j-log4j12-1.1.0.jar<br />
<br />
插件的自描述文件(MANIFEST.MF)配置:<br />
<span style="color: rgb(102, 51, 255);">Manifest-Version: 1.0</span><br style="color: rgb(102, 51, 255);" />
<span style="color: rgb(102, 51, 255);">Bundle-ManifestVersion: 2</span><br style="color: rgb(102, 51, 255);" />
<span style="color: rgb(102, 51, 255);">Bundle-Name: %pluginName</span><br style="color: rgb(102, 51, 255);" />
<span style="color: rgb(102, 51, 255);">Bundle-SymbolicName: org.apache.commons.log</span><br style="color: rgb(102, 51, 255);" />
<span style="color: rgb(102, 51, 255);">Bundle-Version: 2.0.0</span><br style="color: rgb(102, 51, 255);" />
<font color="#0000ff"><span style="color: rgb(102, 51, 255);">Bundle-ClassPath: .,</span><br style="color: rgb(102, 51, 255);" />
<span style="color: rgb(102, 51, 255);">&nbsp;lib/slf4j-api-1.1.0.jar,</span><br style="color: rgb(102, 51, 255);" />
<span style="color: rgb(102, 51, 255);">&nbsp;lib/log4j-1.2.13.jar,</span><br style="color: rgb(102, 51, 255);" />
<span style="color: rgb(102, 51, 255);">&nbsp;lib/jcl104-over-slf4j-1.1.0.jar,</span><br style="color: rgb(102, 51, 255);" />
<span style="color: rgb(102, 51, 255);">&nbsp;lib/slf4j-log4j12-1.1.0.jar</span> </font>   <br style="color: rgb(102, 51, 255);" />
<span style="color: rgb(102, 51, 255);">Bundle-Vendor: %pluginProvider</span><br style="color: rgb(102, 51, 255);" />
<span style="color: rgb(102, 51, 255);">Bundle-Localization: plugin</span><br style="color: rgb(102, 51, 255);" />
<span style="color: rgb(102, 51, 255);">Export-Package: <span style="font-weight: bold; color: rgb(51, 51, 255);">org.apache.commons.logging</span>;version=&quot;1.1.0&quot;</span><br style="color: rgb(102, 51, 255);" />
<span style="color: rgb(102, 51, 255);">Bundle-RequiredExecutionEnvironment: J2SE-1.5</span><br style="color: rgb(102, 51, 255);" />
<span style="color: rgb(102, 51, 255);">Import-Package: org.osgi.framework</span><br style="color: rgb(102, 51, 255);" />
<span style="color: rgb(102, 51, 255);">Bundle-Activator: org.apache.commons.log.osgi.Activator</span><br style="color: rgb(102, 51, 255);" />
<br />
然后实现一个简单的Activator，根据自己需求配置Log4j:<br />
<br />
<span style="color: rgb(102, 0, 204);">package org.apache.commons.log.osgi;</span><br style="color: rgb(102, 0, 204);" />
<br style="color: rgb(102, 0, 204);" />
<span style="color: rgb(102, 0, 204);">import java.io.File;</span><br style="color: rgb(102, 0, 204);" />
<br style="color: rgb(102, 0, 204);" />
<span style="color: rgb(102, 0, 204);">import org.apache.log4j.PropertyConfigurator;</span><br style="color: rgb(102, 0, 204);" />
<span style="color: rgb(102, 0, 204);">import org.osgi.framework.BundleActivator;</span><br style="color: rgb(102, 0, 204);" />
<span style="color: rgb(102, 0, 204);">import org.osgi.framework.BundleContext;</span><br style="color: rgb(102, 0, 204);" />
<br style="color: rgb(102, 0, 204);" />
<span style="color: rgb(102, 0, 204);">public class Activator implements BundleActivator {</span><br style="color: rgb(102, 0, 204);" />
<br style="color: rgb(102, 0, 204);" />
<span style="color: rgb(102, 0, 204);">&nbsp;&nbsp;&nbsp; public void start(BundleContext context) throws Exception {</span><br style="color: rgb(102, 0, 204);" />
<span style="color: rgb(102, 0, 204);">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; File file = new File(&quot;./etc/log4j.properties&quot;);</span><br style="color: rgb(102, 0, 204);" />
<span style="color: rgb(102, 0, 204);">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; PropertyConfigurator.configure(file.toURI().toURL());</span><br style="color: rgb(102, 0, 204);" />
<span style="color: rgb(102, 0, 204);">&nbsp;&nbsp;&nbsp; }</span><br style="color: rgb(102, 0, 204);" />
<br style="color: rgb(102, 0, 204);" />
<span style="color: rgb(102, 0, 204);">&nbsp;&nbsp;&nbsp; public void stop(BundleContext context) throws Exception {</span><br style="color: rgb(102, 0, 204);" />
<span style="color: rgb(102, 0, 204);">&nbsp;&nbsp;&nbsp; }</span><br style="color: rgb(102, 0, 204);" />
<br style="color: rgb(102, 0, 204);" />
<span style="color: rgb(102, 0, 204);">}</span><br style="color: rgb(102, 0, 204);" />
          <br/>
          <span style="color:red;">
            <a href="http://erylee.javaeye.com/blog/40699#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 25 Dec 2006 21:13:08 +0800</pubDate>
        <link>http://erylee.javaeye.com/blog/40699</link>
        <guid>http://erylee.javaeye.com/blog/40699</guid>
      </item>
      <item>
        <title>OpenCore: OSGi上部署Hibernate的四种方式</title>
        <author>erylee</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://erylee.javaeye.com">erylee</a>&nbsp;
          链接：<a href="http://erylee.javaeye.com/blog/40364" style="color:red;">http://erylee.javaeye.com/blog/40364</a>&nbsp;
          发表时间: 2006年12月22日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p style="">   OpenCore: OSGi<font face="AR PL ShanHeiSun Uni"><span lang="zh-CN">上部署</span></font>Hibernate<font face="AR PL ShanHeiSun Uni"><span lang="zh-CN">的四种方式</span></font> </p>
<p style="">   OpenCore<font face="AR PL ShanHeiSun Uni"><span lang="zh-CN">是在</span></font>OSGi<font face="AR PL ShanHeiSun Uni"><span lang="zh-CN">规范上构建的微内核</span></font>(Microkenerl)<font face="AR PL ShanHeiSun Uni"><span lang="zh-CN">，基于纯组件</span></font>(Pure Plugin)<font face="AR PL ShanHeiSun Uni"><span lang="zh-CN">开放源码企业应用软件平台。</span></font>OpenCore<font face="AR PL ShanHeiSun Uni"><span lang="zh-CN">数据层实现</span></font>OSGi<font face="AR PL ShanHeiSun Uni"><span lang="zh-CN">上集成</span></font>Hibernate<font face="AR PL ShanHeiSun Uni"><span lang="zh-CN">，</span></font>Hibernate<font face="AR PL ShanHeiSun Uni"><span lang="zh-CN">及其依赖库作为一个单独的插件，这样带来一个问题，就是</span></font>OSGi<font face="AR PL ShanHeiSun Uni"><span lang="zh-CN">平台的插件类加载机制使得</span></font>Hibernate<font face="AR PL ShanHeiSun Uni"><span lang="zh-CN">无法正确加载分布在不同插件内部的模型对象与</span></font>O/R<font face="AR PL ShanHeiSun Uni"><span lang="zh-CN">映射文件。本文讨论四种解决方案</span></font>: </p>
<ol>
    <li>
    <p style="">       <font face="AR PL ShanHeiSun Uni"><span lang="zh-CN"><strong>模型对象</strong></span></font><strong>(Domain Objects)</strong><font face="AR PL ShanHeiSun Uni"><span lang="zh-CN"><strong>插件</strong></span></font>     </p>
    </li>
</ol>
<p style="">   <font face="AR PL ShanHeiSun Uni"><span lang="zh-CN">模型对象</span></font>(Domain Objects)<font face="AR PL ShanHeiSun Uni"><span lang="zh-CN">集中到独立的插件</span></font>(Bundle)<font face="AR PL ShanHeiSun Uni"><span lang="zh-CN">内，</span></font>Hibernate<font face="AR PL ShanHeiSun Uni"><span lang="zh-CN">插件依赖这些模型对象插件。这是最简单的，也是比较糟糕的方式，比较小的基于</span></font>OSGi<font face="AR PL ShanHeiSun Uni"><span lang="zh-CN">的项目可以这也作做。</span></font> </p>
<font face="AR PL ShanHeiSun Uni"><span lang="zh-CN">依赖方式:<br />
<br />
业务插件－－－－－－－&gt;Hibernate插件<br />
&nbsp;&nbsp;&nbsp; &nbsp; |  &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;  ｜<br />
&nbsp;&nbsp;&nbsp; &nbsp; |  &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp; \  &nbsp;&nbsp; \| /<br />
&nbsp;&nbsp;&nbsp; &nbsp; |－－－－－－－－－－－&nbsp; 模型插件<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;&nbsp; /<br />
<br />
</span></font>
<ol start="2">
    <li>
    <p style="">       <font face="AR PL ShanHeiSun Uni"><span lang="zh-CN"><strong>改进的模型对象</strong></span></font><strong>(Domain Objects)</strong><font face="AR PL ShanHeiSun Uni"><span lang="zh-CN"><strong>插件</strong></span></font>     </p>
    </li>
</ol>
<p style="">   <font face="AR PL ShanHeiSun Uni"><span lang="zh-CN">把模型对象插件当作</span></font>Hibernate<font face="AR PL ShanHeiSun Uni"><span lang="zh-CN">插件的</span></font>Fragments<font face="AR PL ShanHeiSun Uni"><span lang="zh-CN">，依赖方式如图：</span></font> </p>
<p style="">   <font face="AR PL ShanHeiSun Uni"><span lang="zh-CN"><br />
业务插件－－－－－－－&gt;Hibernate插件<br />
&nbsp;&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp; /｜\<br />
&nbsp;&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;&nbsp; | <br />
&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 模型插件<br />
&nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></font> </p>
<br />
<ol start="3">
    <li>
    <p style="">       <strong>Eclipse-BuddyPolicy</strong><font face="AR PL ShanHeiSun Uni"><span lang="zh-CN"><strong>与</strong></span></font><strong>Eclipse-RegisterBuddy</strong><font face="AR PL ShanHeiSun Uni"><span lang="zh-CN"><strong>方式</strong></span></font>     </p>
    </li>
</ol>
<p style="">   Equinox(Eclipse<font face="AR PL ShanHeiSun Uni"><span lang="zh-CN">提供的</span></font>OSGi<font face="AR PL ShanHeiSun Uni"><span lang="zh-CN">实现</span></font>)<font face="AR PL ShanHeiSun Uni"><span lang="zh-CN">平台特有的方式，允许插件</span></font>(Bundle)<font face="AR PL ShanHeiSun Uni"><span lang="zh-CN">声明自己的伙伴，让&ldquo;伙伴插件&rdquo;来动态加载本插件的类，这也是</span></font>Hiberate<font face="AR PL ShanHeiSun Uni"><span lang="zh-CN">与</span></font>Equinox<font face="AR PL ShanHeiSun Uni"><span lang="zh-CN">集成的官方解决方案。这种方式模型对象无需部署在单独的插件内，与业务插件部署在一起即可，</span></font>Hibernate<font face="AR PL ShanHeiSun Uni"><span lang="zh-CN">插件也无须依赖模型对象。</span></font> </p>
<p style="">   <font face="AR PL ShanHeiSun Uni"><span lang="zh-CN">具体做法如下：</span></font> </p>
<p style="">   <font face="AR PL ShanHeiSun Uni"><span lang="zh-CN">首先，</span></font>Hibernate<font face="AR PL ShanHeiSun Uni"><span lang="zh-CN">插件</span></font>(<font face="AR PL ShanHeiSun Uni"><span lang="zh-CN">名称，例如</span></font>org.opengoss.orm.hibernate)<font face="AR PL ShanHeiSun Uni"><span lang="zh-CN">声明自身可以作为伙伴插件，自描述文件</span></font>(MANIFEST.MF)&nbsp;<font face="AR PL ShanHeiSun Uni"><span lang="zh-CN">加入描述：</span></font> </p>
<p style="">   <font color="#9966cc"><strong><span style="background: transparent none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">Eclipse-BuddyPolicy: registered</span></strong></font> </p>
<p style="">   <font face="AR PL ShanHeiSun Uni"><span lang="zh-CN">然后，模型对象的业务插件中把</span></font>Hibernate<font face="AR PL ShanHeiSun Uni"><span lang="zh-CN">插件加入为伙伴，自描述文件</span></font>(MANIFEST.MF) <font face="AR PL ShanHeiSun Uni"><span lang="zh-CN">加入描述：</span></font> </p>
<p style="">   <font color="#9966cc"><strong><span style="background: transparent none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">Eclipse-RegisterBuddy:org.opengoss.orm.hibernate</span></strong></font> </p>
<p style="">   <font face="AR PL ShanHeiSun Uni"><span lang="zh-CN">具体说明文档：</span></font> </p>
<p style="">   <a href="http://www.hibernate.org/311.html">http://www.hibernate.org/311.html</a> </p>
<p style="">   <a name="DDE_LINK1"></a><font color="#000000"><span style="background: transparent none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><a href="http://www.ibm.com/developerworks/cn/opensource/os-ecl-osgi/index.html">http://www.ibm.com/developerworks/cn/opensource/os-ecl-osgi/index.html</a></span></font> </p>
<p style="">   <font color="#ff0000"><span style="background: transparent none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><font face="AR PL ShanHeiSun Uni"><span lang="zh-CN">注意：这种方式无法保证在</span></font>Hibernate<font face="AR PL ShanHeiSun Uni"><span lang="zh-CN">最新版本中应用成功。大家可以再试试</span></font>:)</span></font><br />
<br />
</p>
<ol start="4">
    <li>
    <p style="">       <strong><font color="#000000"><span style="background: transparent none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">Eclipse Extension Point<font face="AR PL ShanHeiSun Uni"><span lang="zh-CN">方式</span></font></span></font></strong>     </p>
    </li>
</ol>
<p style="">   <font color="#000000"><span style="background: transparent none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><font face="AR PL ShanHeiSun Uni"><span lang="zh-CN">这是我们目前实现的方式，通过标准的</span></font>Eclipse<font face="AR PL ShanHeiSun Uni"><span lang="zh-CN">扩展点与扩展机制，我们在</span></font>Hibernate<font face="AR PL ShanHeiSun Uni"><span lang="zh-CN">插件中</span></font>plugin.xml<font face="AR PL ShanHeiSun Uni"><span lang="zh-CN">配置文件中声明下述扩展点：</span></font></span></font> </p>
<p style="">   <font color="#000080"><font face="Monospace"><font size="2"><strong><span style="background: transparent none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
<plugin></plugin>
</span></strong></font></font></font> </p>
<p align="left" style=""><font color="#000080"></font><font color="#000000"><font face="Monospace"><font size="2"><strong><font color="#000080">&lt;extension-point id=</font><font color="#008000">&quot;org.opengoss.database.domain.object&quot;</font><font color="#000000"> </font><font color="#000080">name=</font><font color="#008000">&quot;domainObject&quot;</font><font color="#000080">/&gt;</font></strong></font></font> </font></p>
<p align="left" style="">   <font color="#000080"><font face="Monospace"><font size="2"><strong></strong></font></font></font> </p>
<p style="">   <font color="#000000"><span style="background: transparent none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><font face="AR PL ShanHeiSun Uni"><span lang="zh-CN">在模型对象插件中声明扩展，例如：</span></font></span></font> </p>
<p style="">   <font color="#000080"><font face="Monospace"><font size="2"><strong><span style="background: transparent none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
<plugin></plugin>
</span></strong></font></font></font> </p>
<p align="left" style="">   <font color="#000000"> </font><font face="Monospace"><font size="2"><strong><font color="#000080"><extension></extension></font><font color="#000000"> </font><font color="#000080">&lt;extension point=</font><font color="#008000">&quot;org.opengoss.database.domain.object&quot;</font><font color="#000080">&gt;</font></strong></font></font> </p>
<p align="left" style="">   <font face="Monospace"><font size="2"><strong><font color="#000000"> </font><font color="#000080"><domainobject></domainobject></font><font color="#000000"> </font><font color="#000080">&lt;domainObject class=</font><font color="#008000">&quot;org.opengoss.alarm.core.Alarm&quot;</font><font color="#000080">/&gt;</font></strong></font></font></p>
<p align="left" style=""><font face="Monospace"><font size="2"><strong><font color="#000080">&lt;/extension&gt;</font></strong></font></font> </p>
<p align="left" style="">   <font color="#000000"> </font><font face="Monospace"><font size="2"><strong><font color="#000080"></font></strong></font></font> </p>
<p align="left" style="">   <font color="#000080"><font face="Monospace"><font size="2"><strong></strong></font></font></font> </p>
<p style="">   <font color="#000000"><span style="background: transparent none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">Hibernate<font face="AR PL ShanHeiSun Uni"><span lang="zh-CN">插件的启动中，用代码配置生成</span></font>SessionFactory<font face="AR PL ShanHeiSun Uni"><span lang="zh-CN">，代码如下：</span></font></span></font> </p>
<p style="">   <font color="#000000"><font face="Monospace"><font size="2"><span style="background: transparent none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><font color="#000000"> </font><strong><font color="#7f0055">public</font></strong><font color="#000000"> </font><strong><font color="#7f0055">void</font></strong><font color="#000000"> start(BundleContext context) </font><strong><font color="#7f0055">throws</font></strong><font color="#000000"> Exception {</font></span></font></font></font> </p>
<p align="left" style="">   <font face="Monospace"><font size="2"><font color="#000000"> Configuration configuration = </font><strong><font color="#7f0055">new</font></strong><font color="#000000"> Configuration().configure(</font><strong><font color="#7f0055">new</font></strong><font color="#000000"> File(</font></font></font> </p>
<p align="left" style="">   <font face="Monospace"><font size="2"><font color="#000000"> </font><font color="#2a00ff">&quot;./etc/org.opengoss.database.hibernate/hibernate.cfg.xml&quot;</font><font color="#000000">));</font></font></font> </p>
<p align="left" style="">   <font color="#000000"><font face="Monospace"><font size="2"> Class[] domainClasses = getDomainClasses();</font></font></font> </p>
<p align="left" style="">   <font face="Monospace"><font size="2"><font color="#000000"> </font><strong><font color="#7f0055">for</font></strong><font color="#000000"> (Class domainClass : domainClasses) {</font></font></font> </p>
<p align="left" style="">   <font color="#000000"><font face="Monospace"><font size="2"> configuration.addClass(domainClass);</font></font></font> </p>
<p align="left" style="">   <font color="#000000"><font face="Monospace"><font size="2"> }</font></font></font> </p>
<p align="left" style="">   <font face="Monospace"><font size="2"><font color="#000000"> </font><font color="#0000c0">sessionFactory</font><font color="#000000"> = configuration.buildSessionFactory();</font></font></font> </p>
<p align="left" style="">   <font face="Monospace"><font size="2"><font color="#000000"> Dictionary</font><strong><font color="#7f0055">new</font></strong><font color="#000000"> Hashtable</font></font></font> </p>
<p align="left" style="">   <font face="Monospace"><font size="2"><font color="#000000"> props.put(</font><font color="#2a00ff">&quot;scope&quot;</font><font color="#000000">, </font><font color="#2a00ff">&quot;APPLICATION&quot;</font><font color="#000000">);</font></font></font> </p>
<p align="left" style="">   <font face="Monospace"><font size="2"><font color="#000000"> props.put(</font><font color="#2a00ff">&quot;uid&quot;</font><font color="#000000">, </font><font color="#2a00ff">&quot;Hibernate:SessionFactory&quot;</font><font color="#000000">);</font></font></font> </p>
<p align="left" style="">   <font face="Monospace"><font size="2"><font color="#000000"> </font><font color="#0000c0">registration</font><font color="#000000"> = context.registerService(</font></font></font> </p>
<p align="left" style="">   <font face="Monospace"><font size="2"><font color="#000000"> SessionFactory.</font><strong><font color="#7f0055">class</font></strong><font color="#000000">.getName(), </font><font color="#0000c0">sessionFactory</font><font color="#000000">, props);</font></font></font> </p>
<p align="left" style="">   <font color="#000000"><font face="Monospace"><font size="2"> }</font></font></font> </p>
<p align="left" style="">   <br />
</p>
<p align="left" style="">   <font color="#000000"><font face="Monospace"><font size="2"> <strong><font color="#7f0055">private</font></strong> Class[] getDomainClasses() <strong><font color="#7f0055">throws</font></strong> Exception {</font></font></font> </p>
<p align="left" style="">   <font face="Monospace"><font size="2"><font color="#000000"> List<class> domainClasses = </class></font><strong><font color="#7f0055">new</font></strong><font color="#000000"> ArrayList<class>();</class></font></font></font> </p>
<p align="left" style="">   <font face="Monospace"><font size="2"><font color="#000000"> IExtensionPoint point = </font><font color="#0000c0">registry</font></font></font> </p>
<p align="left" style="">   <font face="Monospace"><font size="2"><font color="#000000"> .getExtensionPoint(IConstants.</font><em><font color="#0000c0">DOMAIN_OBJECT_EXTENSION_POINT</font></em><font color="#000000">);</font></font></font> </p>
<p align="left" style="">   <font color="#000000"><font face="Monospace"><font size="2"> IExtension[] extensions = point.getExtensions();</font></font></font> </p>
<p align="left" style="">   <font face="Monospace"><font size="2"><font color="#000000"> </font><strong><font color="#7f0055">for</font></strong><font color="#000000"> (IExtension extension : extensions) {</font></font></font> </p>
<p align="left" style="">   <font color="#000000"><font face="Monospace"><font size="2"> IConfigurationElement[] elements = extension</font></font></font> </p>
<p align="left" style="">   <font color="#000000"><font face="Monospace"><font size="2"> .getConfigurationElements();</font></font></font> </p>
<p align="left" style="">   <font face="Monospace"><font size="2"><font color="#000000"> </font><strong><font color="#7f0055">for</font></strong><font color="#000000"> (IConfigurationElement configurationElement : elements) {</font></font></font> </p>
<p align="left" style="">   <font face="Monospace"><font size="2"><font color="#000000"> Bundle bundle = </font><font color="#0000c0">pluginContext</font><font color="#000000">.getBundleBySymbolId(extension</font></font></font> </p>
<p align="left" style="">   <font color="#000000"><font face="Monospace"><font size="2"> .getNamespaceIdentifier());</font></font></font> </p>
<p align="left" style="">   <font color="#000000"><font face="Monospace"><font size="2"> Class domainClass = bundle.loadClass(configurationElement</font></font></font> </p>
<p align="left" style="">   <font face="Monospace"><font size="2"><font color="#000000"> .getAttribute(</font><font color="#2a00ff">&quot;class&quot;</font><font color="#000000">));</font></font></font> </p>
<p align="left" style="">   <font color="#000000"><font face="Monospace"><font size="2"> domainClasses.add(domainClass);</font></font></font> </p>
<p align="left" style="">   <font color="#000000"><font face="Monospace"><font size="2"> }</font></font></font> </p>
<p align="left" style="">   <font color="#000000"><font face="Monospace"><font size="2"> }</font></font></font> </p>
<p align="left" style="">   <font face="Monospace"><font size="2"><font color="#000000"> </font><strong><font color="#7f0055">return</font></strong><font color="#000000"> domainClasses.toArray(</font><strong><font color="#7f0055">new</font></strong><font color="#000000"> Class[domainClasses.size()]);</font></font></font> </p>
<p align="left" style="">   <font color="#000000"><font face="Monospace"><font size="2"> }</font></font></font> </p>
<p style="">   <font color="#ff0000"><span style="background: transparent none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><font face="AR PL ShanHeiSun Uni"><span lang="zh-CN">注意：</span></font>Hibernate<font face="AR PL ShanHeiSun Uni"><span lang="zh-CN">内部的类加载机制实在无法令人满意，尽管我们在这种方式中已经加载所有的模型类对象，但</span></font>Hibernate<font face="AR PL ShanHeiSun Uni"><span lang="zh-CN">内部仍然会调用</span></font>Class.forName()<font face="AR PL ShanHeiSun Uni"><span lang="zh-CN">去试图加载。所以，我们不得不在其自描述文件</span></font>(MANIFEST.MF)&nbsp;<font face="AR PL ShanHeiSun Uni"><span lang="zh-CN">中加入描述</span></font>:</span></font> </p>
<p style="">   <font color="#9966cc"><font face="STHeiti"><font size="3"><strong><span style="background: transparent none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -m