


<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet href="http://gocom.primeton.com/blog/styles/rss.css" type="text/css"?>
<rss version="2.0" 
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
>

 <channel>
  <title>三十乱弹</title>
  <link>http://gocom.primeton.com/blog/index.php?blogId=14</link>
  <description>晏斐的Blog (关于Eclipse,OSGI,SOA,Framework)</description>
  <pubDate>Fri, 03 Sep 2010 09:22:48</pubDate>
  <generator>http://www.plogworld.net</generator>
    <item>
   <title>OSGI错过了Geronimo </title>
   <description>
     &lt;br/&gt; &lt;p&gt;在OSGI联盟主席Peter.Kriens的博客上看到说他错过了Geronimo，不觉有几分惋惜。在网上看到说Geronimo准备迁移到OSGI上，估计是假的。&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Geronimo将50多个开源项目打包成了一个J2EE服务器，IBM网站上称它是一个洋葱式的容器嵌套结构，靠的就是它的GBean，GBean之间的引用和交互，则靠cglib生成的动态代理。&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 不过，有好事者已经将Geronimo迁移到了OSGI之上，这个网址介绍了他的做法：&lt;a rel=&quot;nofollow&quot; href=&quot;http://www.mail-archive.com/dev@geronimo.apache.org/msg10923.html&quot;&gt;http://www.mail-archive.com/dev@geronimo.apache.org/msg10923.html&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;不过看到ObjectWeb的JOnAS 5 的规划中, OSGi作为一个重要的基础设施被引入. 出于以下原因, JOnAS 5 将采用 OSGi 作为其架构和服务的基础。&lt;/p&gt;
&lt;p&gt;&amp;#132;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; OSGi enforce modularity with the Bundle concept&lt;/p&gt;
&lt;p&gt;&amp;#132;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; OSGi provide standard mechanism for Classes isolation and versionning&lt;/p&gt;
&lt;p&gt;&amp;#132;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; OSGi help us for remote artifacts deployment&lt;/p&gt;
&lt;p&gt;&amp;#132;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; OSGi is lightweight&lt;/p&gt;
&lt;p&gt;&amp;#132;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; OSGi handle dependencies issues (services inter-linking)&lt;/p&gt;
&lt;p&gt;&amp;#132;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; OSGi have large industry support&lt;/p&gt;
&lt;!--
&lt;rdf:RDF xmlns:rdf=&quot;http://www.w3.org/1999/02/22-rdf-syntax-ns#&quot;
         xmlns:dc=&quot;http://purl.org/dc/elements/1.1/&quot;
         xmlns:trackback=&quot;http://madskills.com/public/xml/rss/module/trackback/&quot;&gt;
&lt;rdf:Description
    rdf:about=&quot;http://192.168.1.28:8080/pages/viewpage.action?pageId=3114244&quot;
    dc:identifier=&quot;http://192.168.1.28:8080/pages/viewpage.action?pageId=3114244&quot;
    dc:title=&quot;OSGI错过了Geronimo&quot;
    trackback:ping=&quot;http://192.168.1.28:8080/rpc/trackback/3114244&quot;/&gt;
&lt;/rdf:RDF&gt;
--&gt;&lt;!--
    Root decorator: all decisions about how a page is to be decorated via the
                    inline decoration begins here.
--&gt;&lt;!--
    Switch based upon the context. However, for now, just delegate to a decorator
    identified directly by the context.
--&gt;
   </description>
   <link>http://gocom.primeton.com/blog/index.php?op=ViewArticle&amp;articleId=14806&amp;blogId=14</link>
   <comments>http://gocom.primeton.com/blog/index.php?op=ViewArticle&amp;articleId=14806&amp;blogId=14</comments>
   <guid>http://gocom.primeton.com/blog/index.php?op=ViewArticle&amp;articleId=14806&amp;blogId=14</guid>
      <dc:creator>yanfei</dc:creator>
      
    <category>乱弹</category>
         <pubDate>Wed, 05 Nov 2008 09:41:45</pubDate>
   <source url="http://gocom.primeton.com/blog/rss.php?blogId=14&amp;profile=rss20">三十乱弹</source>
     </item>
    <item>
   <title>Equinox OSGI平台中集成Tuscany SCA容器</title>
   <description>
    &lt;div&gt;本文介绍如何在Equinox中集成Tuscany，Tuscany容器作为OSGI环境中的一个Bundle存在。同时一个Contribution也对应为一个Bundle，此种方式使Tuscany的Contribution具有了热部署和动态修改替换的能力。这也是Tuscany邮件组中目前正在讨论的问题。&lt;/div&gt; &lt;br/&gt; &lt;div&gt;修改Tuscany：&lt;/div&gt;
&lt;div style=&quot;TEXT-INDENT: -18pt; 0cm: &quot;&gt;&lt;span&gt;1.&lt;span new=&quot;&quot; times=&quot;&quot;&gt;&lt;font size=&quot;3&quot;&gt; &lt;/font&gt;&lt;/span&gt;&lt;/span&gt;创建&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;OsgiSCADomain,&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;继承自&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;SCADomain. OsgiSCADoamin&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;参照&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;DefaultSCADomain,&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;做了少许改动。&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;TEXT-INDENT: -21pt; 0cm: &quot;&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;a)&lt;span new=&quot;&quot; times=&quot;&quot;&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;DefaultSCADomain&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;是在构造方法中加载&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;Contribution&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;的资源。修改&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;OsgiSCADomain&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;，添加&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;initContribution(Bundle bundle)&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;方法。代码片断如下：&lt;/span&gt;&lt;/div&gt;
&lt;table style=&quot;BORDER-RIGHT: medium none; BORDER-TOP: medium none; MARGIN: auto auto auto 42pt; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; border=&quot;1&quot;&gt;
    &lt;tbody&gt;
        &lt;tr&gt;
            &lt;td style=&quot;BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 426.1pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent&quot; valign=&quot;top&quot; width=&quot;568&quot;&gt;
            &lt;div align=&quot;left&quot;&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;ContributionService contributionService = &lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: #0000c0&quot;&gt;runtime&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;.getContributionService();&lt;/span&gt;&lt;/div&gt;
            &lt;div align=&quot;left&quot;&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;URL contributionURL;&lt;/span&gt;&lt;/div&gt;
            &lt;div align=&quot;left&quot;&gt;&lt;strong&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: #7f0055&quot;&gt;try&lt;/span&gt;&lt;/strong&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt; {&lt;/span&gt;&lt;/div&gt;
            &lt;div align=&quot;left&quot;&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;contributionURL = getContributionLocation(bundle);&lt;/span&gt;&lt;/div&gt;
            &lt;div align=&quot;left&quot;&gt;&lt;strong&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: #7f0055&quot;&gt;if&lt;/span&gt;&lt;/strong&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt; (contributionURL != &lt;/span&gt;&lt;strong&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: #7f0055&quot;&gt;null&lt;/span&gt;&lt;/strong&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;) {&lt;/span&gt;&lt;/div&gt;
            &lt;div align=&quot;left&quot;&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: #3f7f5f&quot;&gt;// Make sure the URL is correctly encoded (for example, escape the space characters) &lt;/span&gt;&lt;/div&gt;
            &lt;div align=&quot;left&quot;&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;contributionURL = contributionURL.toURI().toURL();&lt;/span&gt;&lt;/div&gt;
            &lt;div align=&quot;left&quot;&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;}&lt;/span&gt;&lt;/div&gt;
            &lt;div align=&quot;left&quot;&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;} &lt;/span&gt;&lt;strong&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: #7f0055&quot;&gt;catch&lt;/span&gt;&lt;/strong&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt; (Exception e) {&lt;/span&gt;&lt;/div&gt;
            &lt;div align=&quot;left&quot;&gt;&lt;strong&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: #7f0055&quot;&gt;throw&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: #7f0055&quot;&gt;new&lt;/span&gt;&lt;/strong&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt; ServiceRuntimeException(e);&lt;/span&gt;&lt;/div&gt;
            &lt;div&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;}&lt;/span&gt;&lt;/div&gt;
            &lt;/td&gt;
        &lt;/tr&gt;
    &lt;/tbody&gt;
&lt;/table&gt;
&lt;div&gt;以上代码，获取Bundle的META-INF目录下sca-contribution.xml的URL,并通过&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;ContributionService&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;的&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;contribute&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;加载&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;sca-contribution.xml&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;及其他资源文件。在实验代码中仅考虑&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;.composite&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;文件。&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;TEXT-INDENT: -21pt; 0cm: &quot;&gt;&lt;span&gt;b)&lt;span new=&quot;&quot; times=&quot;&quot;&gt;&lt;font size=&quot;3&quot;&gt; &lt;/font&gt;&lt;/span&gt;&lt;/span&gt;替换org.apache.tuscany.sca.host.embedded.SCADomain扩展点实现为&lt;span style=&quot;FONT-SIZE: 10pt&quot;&gt;org.apache.tuscany.sca.host.embedded.impl.OsgiSCADomain&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt&quot;&gt;。&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;TEXT-INDENT: -18pt; 0cm: &quot;&gt;&lt;span&gt;2.&lt;span new=&quot;&quot; times=&quot;&quot;&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt&quot;&gt;另一个主要问题是要考虑&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt&quot;&gt;ClassLoader&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt&quot;&gt;的问题。在&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt&quot;&gt;OSGI&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt&quot;&gt;中，不同的&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt&quot;&gt;Contribution&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt&quot;&gt;使用不同的&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt&quot;&gt;ClassLoader&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt&quot;&gt;。因此在&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt&quot;&gt;org.eclipse.equinox.tuscany&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt&quot;&gt;插件中对构件进行装配时，无法加载构件描述文件的的类。&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;TEXT-INDENT: -21pt; 0cm: &quot;&gt;&lt;span&gt;a)&lt;span new=&quot;&quot; times=&quot;&quot;&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt&quot;&gt;新建&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; BACKGROUND: white; COLOR: black&quot;&gt;BundleProxyClassLoader&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;，&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;Bundle&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;默认不对外提供&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;ClassLoader&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;，因此创建一个代理&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;ProxyClassLoader&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;。&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;BundleProxyClassLoader&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;的代码参见：&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;&lt;a href=&quot;http://wiki.eclipse.org/index.php/BundleProxyClassLoader_recip&quot;&gt;http://wiki.eclipse.org/index.php/BundleProxyClassLoader_recip&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;TEXT-INDENT: -18pt; 0cm: &quot;&gt;&lt;span&gt;3.&lt;span new=&quot;&quot; times=&quot;&quot;&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;BundleContext&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;在&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;Tuscany&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;中传递的问题。如果要将&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;BundleContext&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;直接在&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;Tuscany&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;中传递，需要修改大量已有代码，代价较大。采用折中方法。修改&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;Contribution&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;接口，添加&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;setBundle&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;和&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;getBundle&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;方法。&lt;/span&gt;&lt;/div&gt;
&lt;table style=&quot;BORDER-RIGHT: medium none; BORDER-TOP: medium none; MARGIN: auto auto auto 21pt; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; border=&quot;1&quot;&gt;
    &lt;tbody&gt;
        &lt;tr&gt;
            &lt;td style=&quot;BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 426.1pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent&quot; valign=&quot;top&quot; width=&quot;568&quot;&gt;
            &lt;div align=&quot;left&quot;&gt;&lt;span style=&quot;FONT-SIZE: 10pt; BACKGROUND: white; COLOR: black&quot;&gt;Bundle getBundle();&lt;/span&gt;&lt;/div&gt;
            &lt;div&gt;&lt;strong&gt;&lt;span style=&quot;FONT-SIZE: 10pt; BACKGROUND: white; COLOR: #7f0055&quot;&gt;void&lt;/span&gt;&lt;/strong&gt;&lt;span style=&quot;FONT-SIZE: 10pt; BACKGROUND: white; COLOR: black&quot;&gt; setBundle(Bundle bundle);&lt;/span&gt;&lt;/div&gt;
            &lt;/td&gt;
        &lt;/tr&gt;
    &lt;/tbody&gt;
&lt;/table&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div style=&quot;TEXT-INDENT: -18pt; 0cm: &quot;&gt;&lt;span&gt;4.&lt;span new=&quot;&quot; times=&quot;&quot;&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;修改&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;ContributionServiceImpl,&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;TEXT-INDENT: -21pt; 0cm: &quot;&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;a)&lt;span new=&quot;&quot; times=&quot;&quot;&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;添加&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;addContribution&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;方法，在此方法中将&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;Bundle&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;设置给&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;Contribution&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;。&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;TEXT-INDENT: -21pt; 0cm: &quot;&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;b)&lt;span new=&quot;&quot; times=&quot;&quot;&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;添加&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; BACKGROUND: white; COLOR: black&quot;&gt;readContributionMetadata&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;方法&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;。在此方法中将&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; BACKGROUND: yellow; COLOR: black&quot;&gt;BundleProxyClassLoader&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;传给&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; BACKGROUND: white; COLOR: black&quot;&gt;ContributionMetadataDocumentProcessor&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;，用户加载&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;sca-contribution.xml&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;文件。&lt;/span&gt;&lt;/div&gt;
&lt;table style=&quot;BORDER-RIGHT: medium none; BORDER-TOP: medium none; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; border=&quot;1&quot;&gt;
    &lt;tbody&gt;
        &lt;tr&gt;
            &lt;td style=&quot;BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 426.1pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent&quot; valign=&quot;top&quot; width=&quot;568&quot;&gt;
            &lt;div align=&quot;left&quot;&gt;&lt;strong&gt;&lt;span style=&quot;FONT-SIZE: 10pt; BACKGROUND: white; COLOR: #7f0055&quot;&gt;private&lt;/span&gt;&lt;/strong&gt;&lt;span style=&quot;FONT-SIZE: 10pt; BACKGROUND: white; COLOR: black&quot;&gt; Contribution readContributionMetadata(Bundle bundle) &lt;/span&gt;&lt;strong&gt;&lt;span style=&quot;FONT-SIZE: 10pt; BACKGROUND: white; COLOR: #7f0055&quot;&gt;throws&lt;/span&gt;&lt;/strong&gt;&lt;span style=&quot;FONT-SIZE: 10pt; BACKGROUND: white; COLOR: black&quot;&gt; ContributionException{&lt;/span&gt;&lt;/div&gt;
            &lt;div align=&quot;left&quot;&gt;&lt;span style=&quot;FONT-SIZE: 10pt; BACKGROUND: white; COLOR: black&quot;&gt;Contribution contributionMetadata = &lt;/span&gt;&lt;strong&gt;&lt;span style=&quot;FONT-SIZE: 10pt; BACKGROUND: white; COLOR: #7f0055&quot;&gt;null&lt;/span&gt;&lt;/strong&gt;&lt;span style=&quot;FONT-SIZE: 10pt; BACKGROUND: white; COLOR: black&quot;&gt;;&lt;/span&gt;&lt;/div&gt;
            &lt;div align=&quot;left&quot;&gt;&lt;/div&gt;
            &lt;div align=&quot;left&quot;&gt;&lt;span style=&quot;FONT-SIZE: 10pt; BACKGROUND: yellow; COLOR: black&quot;&gt;ClassLoader cl = &lt;/span&gt;&lt;strong&gt;&lt;span style=&quot;FONT-SIZE: 10pt; BACKGROUND: yellow; COLOR: #7f0055&quot;&gt;new&lt;/span&gt;&lt;/strong&gt;&lt;span style=&quot;FONT-SIZE: 10pt; BACKGROUND: yellow; COLOR: black&quot;&gt; BundleProxyClassLoader(bundle);&lt;/span&gt;&lt;/div&gt;
            &lt;div align=&quot;left&quot;&gt;&lt;/div&gt;
            &lt;div align=&quot;left&quot;&gt;&lt;span style=&quot;FONT-SIZE: 10pt; BACKGROUND: white; COLOR: black&quot;&gt;ContributionMetadataDocumentProcessor metadataDocumentProcessor =&lt;/span&gt;&lt;/div&gt;
            &lt;div align=&quot;left&quot;&gt;&lt;strong&gt;&lt;span style=&quot;FONT-SIZE: 10pt; BACKGROUND: white; COLOR: #7f0055&quot;&gt;new&lt;/span&gt;&lt;/strong&gt;&lt;span style=&quot;FONT-SIZE: 10pt; BACKGROUND: white; COLOR: black&quot;&gt; ContributionMetadataDocumentProcessor(cl, staxProcessor, assemblyFactory, contributionFactory,&lt;/span&gt;&lt;/div&gt;
            &lt;div align=&quot;left&quot;&gt;&lt;span style=&quot;FONT-SIZE: 10pt; BACKGROUND: white; COLOR: black&quot;&gt;xmlFactory);&lt;/span&gt;&lt;/div&gt;
            &lt;div align=&quot;left&quot;&gt;&lt;span style=&quot;FONT-SIZE: 10pt; BACKGROUND: white; COLOR: black&quot;&gt;contributionMetadata = contributionFactory.createContribution();&lt;/span&gt;&lt;/div&gt;
            &lt;div align=&quot;left&quot;&gt;&lt;strong&gt;&lt;span style=&quot;FONT-SIZE: 10pt; BACKGROUND: white; COLOR: #7f0055&quot;&gt;try&lt;/span&gt;&lt;/strong&gt;&lt;span style=&quot;FONT-SIZE: 10pt; BACKGROUND: white; COLOR: black&quot;&gt; {&lt;/span&gt;&lt;/div&gt;
            &lt;div align=&quot;left&quot;&gt;&lt;span style=&quot;FONT-SIZE: 10pt; BACKGROUND: white; COLOR: black&quot;&gt;metadataDocumentProcessor.read(contributionMetadata);&lt;/span&gt;&lt;/div&gt;
            &lt;div align=&quot;left&quot;&gt;&lt;span style=&quot;FONT-SIZE: 10pt; BACKGROUND: white; COLOR: black&quot;&gt;} &lt;/span&gt;&lt;strong&gt;&lt;span style=&quot;FONT-SIZE: 10pt; BACKGROUND: white; COLOR: #7f0055&quot;&gt;catch&lt;/span&gt;&lt;/strong&gt;&lt;span style=&quot;FONT-SIZE: 10pt; BACKGROUND: white; COLOR: black&quot;&gt; (XMLStreamException e) {&lt;/span&gt;&lt;/div&gt;
            &lt;div align=&quot;left&quot;&gt;&lt;strong&gt;&lt;span style=&quot;FONT-SIZE: 10pt; BACKGROUND: white; COLOR: #7f0055&quot;&gt;throw&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span style=&quot;FONT-SIZE: 10pt; BACKGROUND: white; COLOR: #7f0055&quot;&gt;new&lt;/span&gt;&lt;/strong&gt;&lt;span style=&quot;FONT-SIZE: 10pt; BACKGROUND: white; COLOR: black&quot;&gt; InvalidContributionMetadataException(&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; BACKGROUND: white; COLOR: #2a00ff&quot;&gt;&amp;quot;Invalid contribution metadata for contribution.&amp;quot;&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; BACKGROUND: white; COLOR: black&quot;&gt;);&lt;/span&gt;&lt;/div&gt;
            &lt;div align=&quot;left&quot;&gt;&lt;span style=&quot;FONT-SIZE: 10pt; BACKGROUND: white; COLOR: black&quot;&gt;} &lt;/span&gt;&lt;/div&gt;
            &lt;div align=&quot;left&quot;&gt;&lt;strong&gt;&lt;span style=&quot;FONT-SIZE: 10pt; BACKGROUND: white; COLOR: #7f0055&quot;&gt;return&lt;/span&gt;&lt;/strong&gt;&lt;span style=&quot;FONT-SIZE: 10pt; BACKGROUND: white; COLOR: black&quot;&gt; contributionMetadata;&lt;/span&gt;&lt;/div&gt;
            &lt;div&gt;&lt;span style=&quot;FONT-SIZE: 10pt; BACKGROUND: white; COLOR: black&quot;&gt;}&lt;/span&gt;&lt;/div&gt;
            &lt;/td&gt;
        &lt;/tr&gt;
    &lt;/tbody&gt;
&lt;/table&gt;
&lt;div style=&quot;TEXT-INDENT: -18pt; 0cm: &quot;&gt;&lt;span&gt;5.&lt;span new=&quot;&quot; times=&quot;&quot;&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;修改&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;ClassReferenceModelResolver&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;，使用&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;Contribution&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;中&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;Bundle&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;的&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;ClassLoader&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;来加载&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;Java Class&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;。&lt;/span&gt;&lt;/div&gt;
&lt;table style=&quot;BORDER-RIGHT: medium none; BORDER-TOP: medium none; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; border=&quot;1&quot;&gt;
    &lt;tbody&gt;
        &lt;tr&gt;
            &lt;td style=&quot;BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 426.1pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent&quot; valign=&quot;top&quot; width=&quot;568&quot;&gt;
            &lt;div align=&quot;left&quot;&gt;&lt;strong&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: #7f0055&quot;&gt;public&lt;/span&gt;&lt;/strong&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt; ClassReferenceModelResolver(Contribution contribution, ModelFactoryExtensionPoint modelFactories) {&lt;/span&gt;&lt;/div&gt;
            &lt;div align=&quot;left&quot;&gt;&lt;strong&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: #7f0055&quot;&gt;this&lt;/span&gt;&lt;/strong&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: #0000c0&quot;&gt;contribution&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt; = contribution;&lt;/span&gt;&lt;/div&gt;
            &lt;div align=&quot;left&quot;&gt;&lt;span style=&quot;FONT-SIZE: 10pt; BACKGROUND: yellow; COLOR: #3f7f5f&quot;&gt;//&lt;/span&gt;&lt;strong&gt;&lt;span style=&quot;FONT-SIZE: 10pt; BACKGROUND: yellow; COLOR: #7f9fbf&quot;&gt;FIXME&lt;/span&gt;&lt;/strong&gt;&lt;span style=&quot;FONT-SIZE: 10pt; BACKGROUND: yellow; COLOR: #3f7f5f&quot;&gt; The classloader should be passed in&lt;/span&gt;&lt;/div&gt;
            &lt;div align=&quot;left&quot;&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: #3f7f5f&quot;&gt;// this.classLoader = new WeakReference&lt;classloader&gt;&lt;/classloader&gt;(Thread.currentThread().getContextClassLoader());&lt;/span&gt;&lt;/div&gt;
            &lt;div align=&quot;left&quot;&gt;&lt;strong&gt;&lt;span style=&quot;FONT-SIZE: 10pt; BACKGROUND: yellow; COLOR: #7f0055&quot;&gt;this&lt;/span&gt;&lt;/strong&gt;&lt;span style=&quot;FONT-SIZE: 10pt; BACKGROUND: yellow; COLOR: black&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; BACKGROUND: yellow; COLOR: #0000c0&quot;&gt;classLoader&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; BACKGROUND: yellow; COLOR: black&quot;&gt; = &lt;/span&gt;&lt;strong&gt;&lt;span style=&quot;FONT-SIZE: 10pt; BACKGROUND: yellow; COLOR: #7f0055&quot;&gt;new&lt;/span&gt;&lt;/strong&gt;&lt;span style=&quot;FONT-SIZE: 10pt; BACKGROUND: yellow; COLOR: black&quot;&gt; WeakReference&lt;classloader&gt;&lt;/classloader&gt;(&lt;/span&gt;&lt;strong&gt;&lt;span style=&quot;FONT-SIZE: 10pt; BACKGROUND: yellow; COLOR: #7f0055&quot;&gt;new&lt;/span&gt;&lt;/strong&gt;&lt;span style=&quot;FONT-SIZE: 10pt; BACKGROUND: yellow; COLOR: black&quot;&gt; BundleProxyClassLoader(contribution.getBundle()));&lt;/span&gt;&lt;/div&gt;
            &lt;div align=&quot;left&quot;&gt;&lt;/div&gt;
            &lt;div align=&quot;left&quot;&gt;&lt;strong&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: #7f0055&quot;&gt;try&lt;/span&gt;&lt;/strong&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt; {&lt;/span&gt;&lt;/div&gt;
            &lt;div align=&quot;left&quot;&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;Class osgiResolverClass =&lt;/span&gt;&lt;/div&gt;
            &lt;div align=&quot;left&quot;&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;Class.&lt;em&gt;forName&lt;/em&gt;(&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: #2a00ff&quot;&gt;&amp;quot;org.apache.tuscany.sca.contribution.osgi.impl.OSGiClassReferenceModelResolver&amp;quot;&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;);&lt;/span&gt;&lt;/div&gt;
            &lt;div align=&quot;left&quot;&gt;&lt;strong&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: #7f0055&quot;&gt;if&lt;/span&gt;&lt;/strong&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt; (osgiResolverClass != &lt;/span&gt;&lt;strong&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: #7f0055&quot;&gt;null&lt;/span&gt;&lt;/strong&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;) {&lt;/span&gt;&lt;/div&gt;
            &lt;div align=&quot;left&quot;&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;Constructor constructor =&lt;/span&gt;&lt;/div&gt;
            &lt;div align=&quot;left&quot;&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;osgiResolverClass.getConstructor(Contribution.&lt;/span&gt;&lt;strong&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: #7f0055&quot;&gt;class&lt;/span&gt;&lt;/strong&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;, ModelFactoryExtensionPoint.&lt;/span&gt;&lt;strong&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: #7f0055&quot;&gt;class&lt;/span&gt;&lt;/strong&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;);&lt;/span&gt;&lt;/div&gt;
            &lt;div align=&quot;left&quot;&gt;&lt;strong&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: #7f0055&quot;&gt;this&lt;/span&gt;&lt;/strong&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: #0000c0&quot;&gt;osgiResolver&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt; = (ModelResolver)constructor.newInstance(contribution, modelFactories);&lt;/span&gt;&lt;/div&gt;
            &lt;div align=&quot;left&quot;&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;}&lt;/span&gt;&lt;/div&gt;
            &lt;div align=&quot;left&quot;&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;} &lt;/span&gt;&lt;strong&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: #7f0055&quot;&gt;catch&lt;/span&gt;&lt;/strong&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt; (Exception e) {&lt;/span&gt;&lt;/div&gt;
            &lt;div align=&quot;left&quot;&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;}&lt;/span&gt;&lt;/div&gt;
            &lt;div&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;}&lt;/span&gt;&lt;/div&gt;
            &lt;/td&gt;
        &lt;/tr&gt;
    &lt;/tbody&gt;
&lt;/table&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;&lt;strong&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;创建&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;org.apache.tuscany&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;和&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;org.eclipse.equinox.tuscany&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;两个插件&lt;/span&gt;&lt;/strong&gt;&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;org.apache.tuscany&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;插件包含了&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;Tuscany&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;运行时刻类库文件。&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;org.eclipse.equinox.tuscany&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;则负责在&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;OSGI&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;容器中启动&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;SCA&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;容器，并遍历&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;ACTIVE&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;的&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;Bundle&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;，加载&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;Bundle&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;中的&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;SCA&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;资源。&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;SCAActivator&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;代码如下：&lt;/span&gt;&lt;/div&gt;
&lt;table style=&quot;BORDER-RIGHT: medium none; BORDER-TOP: medium none; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; border=&quot;1&quot;&gt;
    &lt;tbody&gt;
        &lt;tr&gt;
            &lt;td style=&quot;BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 426.1pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent&quot; valign=&quot;top&quot; width=&quot;568&quot;&gt;
            &lt;div align=&quot;left&quot;&gt;&lt;strong&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: #7f0055&quot;&gt;public&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: #7f0055&quot;&gt;class&lt;/span&gt;&lt;/strong&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt; SCAActivator &lt;/span&gt;&lt;strong&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: #7f0055&quot;&gt;implements&lt;/span&gt;&lt;/strong&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt; BundleActivator, BundleTrackerCustomizer, SynchronousBundleListener {&lt;/span&gt;&lt;/div&gt;
            &lt;div align=&quot;left&quot;&gt;&lt;strong&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: #7f0055&quot;&gt;private&lt;/span&gt;&lt;/strong&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt; SCADomain &lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: #0000c0&quot;&gt;scaDomain&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;;&lt;/span&gt;&lt;/div&gt;
            &lt;div align=&quot;left&quot;&gt;&lt;strong&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: #7f0055&quot;&gt;private&lt;/span&gt;&lt;/strong&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt; BundleTracker &lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: #0000c0&quot;&gt;bundleTracker&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;;&lt;/span&gt;&lt;/div&gt;
            &lt;div align=&quot;left&quot;&gt;&lt;strong&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: #7f0055&quot;&gt;private&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: #7f0055&quot;&gt;static&lt;/span&gt;&lt;/strong&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt; SCAActivator &lt;/span&gt;&lt;em&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: #0000c0&quot;&gt;activator&lt;/span&gt;&lt;/em&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;;&lt;/span&gt;&lt;/div&gt;
            &lt;div align=&quot;left&quot; /&gt;
            &lt;div align=&quot;left&quot;&gt;&lt;strong&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: #7f0055&quot;&gt;public&lt;/span&gt;&lt;/strong&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt; SCAActivator() {&lt;/span&gt;&lt;/div&gt;
            &lt;div align=&quot;left&quot;&gt;&lt;em&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: #0000c0&quot;&gt;activator&lt;/span&gt;&lt;/em&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt; = &lt;/span&gt;&lt;strong&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: #7f0055&quot;&gt;this&lt;/span&gt;&lt;/strong&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;;&lt;/span&gt;&lt;/div&gt;
            &lt;div align=&quot;left&quot;&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;}&lt;/span&gt;&lt;/div&gt;
            &lt;div align=&quot;left&quot; /&gt;
            &lt;div align=&quot;left&quot;&gt;&lt;strong&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: #7f0055&quot;&gt;public&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: #7f0055&quot;&gt;static&lt;/span&gt;&lt;/strong&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt; SCAActivator getDefault() {&lt;/span&gt;&lt;/div&gt;
            &lt;div align=&quot;left&quot;&gt;&lt;strong&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: #7f0055&quot;&gt;return&lt;/span&gt;&lt;/strong&gt;&lt;em&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: #0000c0&quot;&gt;activator&lt;/span&gt;&lt;/em&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;;&lt;/span&gt;&lt;/div&gt;
            &lt;div align=&quot;left&quot;&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;}&lt;/span&gt;&lt;/div&gt;
            &lt;div align=&quot;left&quot; /&gt;
            &lt;div align=&quot;left&quot;&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: #3f7f5f&quot;&gt;/*&lt;/span&gt;&lt;/div&gt;
            &lt;div align=&quot;left&quot;&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: #3f7f5f&quot;&gt;* (non-Javadoc)&lt;/span&gt;&lt;/div&gt;
            &lt;div align=&quot;left&quot;&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: #3f7f5f&quot;&gt;* @see org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext)&lt;/span&gt;&lt;/div&gt;
            &lt;div align=&quot;left&quot;&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: #3f7f5f&quot;&gt;*/&lt;/span&gt;&lt;/div&gt;
            &lt;div align=&quot;left&quot;&gt;&lt;strong&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: #7f0055&quot;&gt;public&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: #7f0055&quot;&gt;void&lt;/span&gt;&lt;/strong&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt; start(BundleContext bundleContext) &lt;/span&gt;&lt;strong&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: #7f0055&quot;&gt;throws&lt;/span&gt;&lt;/strong&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt; Exception {&lt;/span&gt;&lt;/div&gt;
            &lt;div align=&quot;left&quot;&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: #0000c0&quot;&gt;scaDomain&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt; = SCADomain.&lt;em&gt;newInstance&lt;/em&gt;();&lt;/span&gt;&lt;/div&gt;
            &lt;div align=&quot;left&quot; /&gt;
            &lt;div align=&quot;left&quot;&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;bundleContext.registerService(SCADomain.&lt;/span&gt;&lt;strong&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: #7f0055&quot;&gt;class&lt;/span&gt;&lt;/strong&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;.getName(), &lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: #0000c0&quot;&gt;scaDomain&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;, &lt;/span&gt;&lt;strong&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: #7f0055&quot;&gt;null&lt;/span&gt;&lt;/strong&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;);&lt;/span&gt;&lt;/div&gt;
            &lt;div align=&quot;left&quot; /&gt;
            &lt;div align=&quot;left&quot;&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: #0000c0&quot;&gt;bundleTracker&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt; = &lt;/span&gt;&lt;strong&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: #7f0055&quot;&gt;new&lt;/span&gt;&lt;/strong&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt; BundleTracker(bundleContext, Bundle.&lt;/span&gt;&lt;em&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: #0000c0&quot;&gt;ACTIVE&lt;/span&gt;&lt;/em&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;, &lt;/span&gt;&lt;strong&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: #7f0055&quot;&gt;this&lt;/span&gt;&lt;/strong&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;);&lt;/span&gt;&lt;/div&gt;
            &lt;div align=&quot;left&quot;&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;bundleContext.addBundleListener(&lt;/span&gt;&lt;strong&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: #7f0055&quot;&gt;this&lt;/span&gt;&lt;/strong&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;); &lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: #3f7f5f&quot;&gt;//track UNRESOLVED events&lt;/span&gt;&lt;/div&gt;
            &lt;div align=&quot;left&quot;&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: #0000c0&quot;&gt;bundleTracker&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;.open();&lt;/span&gt;&lt;/div&gt;
            &lt;div align=&quot;left&quot;&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;}&lt;/span&gt;&lt;/div&gt;
            &lt;div align=&quot;left&quot;&gt;&lt;/div&gt;
            &lt;div align=&quot;left&quot;&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: #3f7f5f&quot;&gt;/*&lt;/span&gt;&lt;/div&gt;
            &lt;div align=&quot;left&quot;&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: #3f7f5f&quot;&gt;* (non-Javadoc)&lt;/span&gt;&lt;/div&gt;
            &lt;div align=&quot;left&quot;&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: #3f7f5f&quot;&gt;* @see org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext)&lt;/span&gt;&lt;/div&gt;
            &lt;div align=&quot;left&quot;&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: #3f7f5f&quot;&gt;*/&lt;/span&gt;&lt;/div&gt;
            &lt;div align=&quot;left&quot;&gt;&lt;strong&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: #7f0055&quot;&gt;public&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: #7f0055&quot;&gt;void&lt;/span&gt;&lt;/strong&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt; stop(BundleContext context) &lt;/span&gt;&lt;strong&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: #7f0055&quot;&gt;throws&lt;/span&gt;&lt;/strong&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt; Exception {&lt;/span&gt;&lt;/div&gt;
            &lt;div align=&quot;left&quot;&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: #0000c0&quot;&gt;scaDomain&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;.close();&lt;/span&gt;&lt;/div&gt;
            &lt;div align=&quot;left&quot;&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;}&lt;/span&gt;&lt;/div&gt;
            &lt;div align=&quot;left&quot;&gt;&lt;/div&gt;
            &lt;div align=&quot;left&quot;&gt;&lt;strong&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: #7f0055&quot;&gt;public&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: #7f0055&quot;&gt;void&lt;/span&gt;&lt;/strong&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt; bundleChanged(BundleEvent event) {&lt;/span&gt;&lt;/div&gt;
            &lt;div align=&quot;left&quot;&gt;&lt;strong&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: #7f0055&quot;&gt;if&lt;/span&gt;&lt;/strong&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt; (event.getType() == BundleEvent.&lt;/span&gt;&lt;em&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: #0000c0&quot;&gt;UNRESOLVED&lt;/span&gt;&lt;/em&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;) {&lt;/span&gt;&lt;/div&gt;
            &lt;div align=&quot;left&quot;&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: #3f7f5f&quot;&gt;//&lt;/span&gt;&lt;strong&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: #7f9fbf&quot;&gt;TODO&lt;/span&gt;&lt;/strong&gt;&lt;/div&gt;
            &lt;div align=&quot;left&quot;&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;} &lt;/span&gt;&lt;/div&gt;
            &lt;div align=&quot;left&quot;&gt;&lt;strong&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: #7f0055&quot;&gt;else&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: #7f0055&quot;&gt;if&lt;/span&gt;&lt;/strong&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt; (event.getType() == BundleEvent.&lt;/span&gt;&lt;em&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: #0000c0&quot;&gt;RESOLVED&lt;/span&gt;&lt;/em&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;) {&lt;/span&gt;&lt;/div&gt;
            &lt;div align=&quot;left&quot;&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: #3f7f5f&quot;&gt;//&lt;/span&gt;&lt;strong&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: #7f9fbf&quot;&gt;TODO&lt;/span&gt;&lt;/strong&gt;&lt;/div&gt;
            &lt;div align=&quot;left&quot;&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;}&lt;/span&gt;&lt;/div&gt;
            &lt;div align=&quot;left&quot;&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;}&lt;/span&gt;&lt;/div&gt;
            &lt;div align=&quot;left&quot;&gt;&lt;/div&gt;
            &lt;div align=&quot;left&quot;&gt;&lt;strong&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: #7f0055&quot;&gt;public&lt;/span&gt;&lt;/strong&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt; Object addingBundle(Bundle bundle) {&lt;/span&gt;&lt;/div&gt;
            &lt;div align=&quot;left&quot;&gt;&lt;strong&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: #7f0055&quot;&gt;if&lt;/span&gt;&lt;/strong&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: #0000c0&quot;&gt;scaDomain&lt;/span&gt;&lt;strong&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: #7f0055&quot;&gt;instanceof&lt;/span&gt;&lt;/strong&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt; OsgiSCADomain) {&lt;/span&gt;&lt;/div&gt;
            &lt;div align=&quot;left&quot;&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;OsgiSCADomain domain = (OsgiSCADomain)&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: #0000c0&quot;&gt;scaDomain&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;;&lt;/span&gt;&lt;/div&gt;
            &lt;div align=&quot;left&quot;&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;domain.initContribution(bundle);&lt;/span&gt;&lt;/div&gt;
            &lt;div align=&quot;left&quot;&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;}&lt;/span&gt;&lt;/div&gt;
            &lt;div align=&quot;left&quot;&gt;&lt;strong&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: #7f0055&quot;&gt;return&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: #7f0055&quot;&gt;null&lt;/span&gt;&lt;/strong&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;;&lt;/span&gt;&lt;/div&gt;
            &lt;div align=&quot;left&quot;&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;}&lt;/span&gt;&lt;/div&gt;
            &lt;div align=&quot;left&quot;&gt;&lt;/div&gt;
            &lt;div align=&quot;left&quot;&gt;&lt;strong&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: #7f0055&quot;&gt;public&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: #7f0055&quot;&gt;void&lt;/span&gt;&lt;/strong&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt; modifiedBundle(Bundle bundle, Object object) {&lt;/span&gt;&lt;/div&gt;
            &lt;div align=&quot;left&quot;&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: #3f7f5f&quot;&gt;//&lt;/span&gt;&lt;strong&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: #7f9fbf&quot;&gt;TODO&lt;/span&gt;&lt;/strong&gt;&lt;/div&gt;
            &lt;div align=&quot;left&quot;&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;}&lt;/span&gt;&lt;/div&gt;
            &lt;div align=&quot;left&quot;&gt;&lt;/div&gt;
            &lt;div align=&quot;left&quot;&gt;&lt;strong&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: #7f0055&quot;&gt;public&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: #7f0055&quot;&gt;void&lt;/span&gt;&lt;/strong&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt; removedBundle(Bundle bundle, Object object) {&lt;/span&gt;&lt;/div&gt;
            &lt;div align=&quot;left&quot;&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: #3f7f5f&quot;&gt;//&lt;/span&gt;&lt;strong&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: #7f9fbf&quot;&gt;TODO&lt;/span&gt;&lt;/strong&gt;&lt;/div&gt;
            &lt;div align=&quot;left&quot;&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;}&lt;/span&gt;&lt;/div&gt;
            &lt;div align=&quot;left&quot;&gt;&lt;/div&gt;
            &lt;div align=&quot;left&quot;&gt;&lt;strong&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: #7f0055&quot;&gt;public&lt;/span&gt;&lt;/strong&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt; SCADomain getScaDomain() {&lt;/span&gt;&lt;/div&gt;
            &lt;div align=&quot;left&quot;&gt;&lt;strong&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: #7f0055&quot;&gt;return&lt;/span&gt;&lt;/strong&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: #0000c0&quot;&gt;scaDomain&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;;&lt;/span&gt;&lt;/div&gt;
            &lt;div align=&quot;left&quot;&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;}&lt;/span&gt;&lt;/div&gt;
            &lt;div align=&quot;left&quot;&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;}&lt;/span&gt;&lt;/div&gt;
            &lt;div&gt;&lt;/div&gt;
            &lt;/td&gt;
        &lt;/tr&gt;
    &lt;/tbody&gt;
&lt;/table&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;&lt;strong&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;运行时刻调用&lt;/span&gt;&lt;/strong&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;在&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;Servlet&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;中可以使用如下方式调用：&lt;/span&gt;&lt;/div&gt;
&lt;table style=&quot;BORDER-RIGHT: medium none; BORDER-TOP: medium none; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; border=&quot;1&quot;&gt;
    &lt;tbody&gt;
        &lt;tr&gt;
            &lt;td style=&quot;BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 426.1pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent&quot; valign=&quot;top&quot; width=&quot;568&quot;&gt;
            &lt;div align=&quot;left&quot;&gt;&lt;strong&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: #7f0055&quot;&gt;public&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: #7f0055&quot;&gt;void&lt;/span&gt;&lt;/strong&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt; doGet(HttpServletRequest request, HttpServletResponse response)&lt;/span&gt;&lt;/div&gt;
            &lt;div align=&quot;left&quot;&gt;&lt;strong&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: #7f0055&quot;&gt;throws&lt;/span&gt;&lt;/strong&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt; IOException{&lt;/span&gt;&lt;/div&gt;
            &lt;div align=&quot;left&quot;&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;response.setContentType(&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: #2a00ff&quot;&gt;&amp;quot;text/html&amp;quot;&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;);&lt;/span&gt;&lt;/div&gt;
            &lt;div align=&quot;left&quot;&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;ServletOutputStream output=response.getOutputStream();&lt;/span&gt;&lt;/div&gt;
            &lt;div align=&quot;left&quot;&gt;&lt;/div&gt;
            &lt;div align=&quot;left&quot;&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;&lt;span&gt;SCADomain&lt;/span&gt; scaDomain = SCAActivator.&lt;em&gt;getDefault&lt;/em&gt;().getScaDomain();&lt;/span&gt;&lt;/div&gt;
            &lt;div align=&quot;left&quot;&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;CalculatorService calculatorService = &lt;/span&gt;&lt;/div&gt;
            &lt;div align=&quot;left&quot;&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;scaDomain.getService(CalculatorService.&lt;/span&gt;&lt;strong&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: #7f0055&quot;&gt;class&lt;/span&gt;&lt;/strong&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: #2a00ff&quot;&gt;&amp;quot;CalculatorServiceComponent&amp;quot;&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;);&lt;/span&gt;&lt;/div&gt;
            &lt;div align=&quot;left&quot;&gt;&lt;/div&gt;
            &lt;div align=&quot;left&quot;&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: #3f7f5f&quot;&gt;// Calculate&lt;/span&gt;&lt;/div&gt;
            &lt;div align=&quot;left&quot;&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;output.println(&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: #2a00ff&quot;&gt;&amp;quot;3 + 2=&amp;quot;&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt; + calculatorService.add(3, 2) + &lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: #2a00ff&quot;&gt;&amp;quot;&lt;br /&gt;
            &amp;quot;&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;);&lt;/span&gt;&lt;/div&gt;
            &lt;div align=&quot;left&quot;&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;output.println(&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: #2a00ff&quot;&gt;&amp;quot;3 - 2=&amp;quot;&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt; + calculatorService.subtract(3, 2) + &lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: #2a00ff&quot;&gt;&amp;quot;&lt;br /&gt;
            &amp;quot;&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;);&lt;/span&gt;&lt;/div&gt;
            &lt;div align=&quot;left&quot;&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;output.println(&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: #2a00ff&quot;&gt;&amp;quot;3 * 2=&amp;quot;&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt; + calculatorService.multiply(3, 2) + &lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: #2a00ff&quot;&gt;&amp;quot;&lt;br /&gt;
            &amp;quot;&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;);&lt;/span&gt;&lt;/div&gt;
            &lt;div align=&quot;left&quot;&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;output.println(&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: #2a00ff&quot;&gt;&amp;quot;3 / 2=&amp;quot;&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt; + calculatorService.divide(3, 2) + &lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: #2a00ff&quot;&gt;&amp;quot;&lt;br /&gt;
            &amp;quot;&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;);&lt;/span&gt;&lt;/div&gt;
            &lt;div align=&quot;left&quot; /&gt;
            &lt;div&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;}&lt;/span&gt;&lt;/div&gt;
            &lt;/td&gt;
        &lt;/tr&gt;
    &lt;/tbody&gt;
&lt;/table&gt;
&lt;div&gt;&lt;/div&gt;
   </description>
   <link>http://gocom.primeton.com/blog/index.php?op=ViewArticle&amp;articleId=3086&amp;blogId=14</link>
   <comments>http://gocom.primeton.com/blog/index.php?op=ViewArticle&amp;articleId=3086&amp;blogId=14</comments>
   <guid>http://gocom.primeton.com/blog/index.php?op=ViewArticle&amp;articleId=3086&amp;blogId=14</guid>
      <dc:creator>yanfei</dc:creator>
      
    <category>乱弹</category>
         <pubDate>Tue, 27 Nov 2007 20:11:33</pubDate>
   <source url="http://gocom.primeton.com/blog/rss.php?blogId=14&amp;profile=rss20">三十乱弹</source>
     </item>
    <item>
   <title>Eclipse Equinox OSGI Declarative Service 实现分析</title>
   <description>
    &lt;div style=&quot;TEXT-INDENT: 21pt&quot;&gt;Equinox项目是Eclipse开源组织提供的OSGi框架的实现。Equinox 的org.eclipse.equinox.ds项目提供了OSGi R4规范中的Declarative Service标准服务的实现。Declarative Service提供了基于OSGI平台之上的面向服务构件模型(Service-Oriented Component Model)，也为在OSGI基础之上搭建SOA应用提供了可能。&lt;/div&gt; &lt;br/&gt; &lt;div&gt;&lt;strong&gt;背景信息&lt;/strong&gt;&lt;/div&gt;
&lt;div style=&quot;TEXT-INDENT: 21pt&quot;&gt;Equinox项目是Eclipse开源组织提供的OSGi框架的实现。Eclipse自3.0版本开始，其内核移植到OSGi框架上。通过OSGi框架强大的组件控制，交互和管理能力，再加上Eclipse插件的自有特点，Eclipse开源框架得到了跳跃式的发展。同时，OSGi规范得益于Eclipse IDE环境庞大的使用者，OSGi联盟也进入了快速发展时期。&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;strong&gt;Equinox&lt;/strong&gt;&lt;strong&gt;项目概述&lt;/strong&gt;&lt;/div&gt;
&lt;div style=&quot;TEXT-INDENT: 21pt&quot;&gt;Equinox项目包括OSGi R4版本规范核心框架的实现，一系列OSGi标准服务Bundle及运行基于OSGi的系统的一些基础构件。目前，Equinox项目包括OSGi核心框架的实现，OSGi标准服务Bundle实现，OSGi的服务器端（J2EE实现）应用，Equinox部署更新框架及一些研究方向（未成熟发布的构想如JMX管理，安全管理，面向方面的设计与应用等）。&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;strong&gt;Equinox Declarative Services(DS)&lt;/strong&gt;&lt;/div&gt;
&lt;div style=&quot;TEXT-INDENT: 21pt&quot;&gt;Equinox 的org.eclipse.equinox.ds项目提供了OSGi R4规范中的Declarative Service标准服务的实现，该组件由Prosyst公司提供实现。Declarative Service提供了基于OSGI平台之上的面向服务构件模型(Service-Oriented Component Model)，也为在OSGI基础之上搭建SOA应用提供了可能。Declarative Service实现并没有包含在Eclipse的默认软件包中，需要从Eclipse的CVS中获取。代码位于:pserver:anonymous:dev.eclipse.org/cvsroot/eclipse路径下。&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Equinox&lt;/span&gt;在没有DS实现之前，对于服务的注册需要手工来做，如下面的代码：&lt;/div&gt;
&lt;table style=&quot;BORDER-RIGHT: medium none; BORDER-TOP: medium none; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; border=&quot;1&quot;&gt;
    &lt;tbody&gt;
        &lt;tr&gt;
            &lt;td style=&quot;BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 426.1pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent&quot; valign=&quot;top&quot; width=&quot;568&quot;&gt;
            &lt;div align=&quot;left&quot;&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: #0000c0&quot;&gt;service&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt; = &lt;/span&gt;&lt;strong&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: #7f0055&quot;&gt;new&lt;/span&gt;&lt;/strong&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt; HelloServiceImpl();&lt;/span&gt;&lt;/div&gt;
            &lt;div align=&quot;left&quot;&gt;&amp;nbsp;&lt;/div&gt;
            &lt;div align=&quot;left&quot;&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: #3f7f5f&quot;&gt;// register the service&lt;/span&gt;&lt;/div&gt;
            &lt;div align=&quot;left&quot;&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;context.registerService(HelloService.&lt;/span&gt;&lt;strong&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: #7f0055&quot;&gt;class&lt;/span&gt;&lt;/strong&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;.getName(), &lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: #0000c0&quot;&gt;service&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;, &lt;/span&gt;&lt;strong&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: #7f0055&quot;&gt;new&lt;/span&gt;&lt;/strong&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt; Hashtable());&lt;/span&gt;&lt;/div&gt;
            &lt;div align=&quot;left&quot;&gt;&amp;nbsp;&lt;/div&gt;
            &lt;div align=&quot;left&quot;&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: #3f7f5f&quot;&gt;// create a tracker and track the service&lt;/span&gt;&lt;/div&gt;
            &lt;div align=&quot;left&quot;&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: #0000c0&quot;&gt;helloServiceTracker&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt; = &lt;/span&gt;&lt;strong&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: #7f0055&quot;&gt;new&lt;/span&gt;&lt;/strong&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt; ServiceTracker(context, HelloService.&lt;/span&gt;&lt;strong&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: #7f0055&quot;&gt;class&lt;/span&gt;&lt;/strong&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;.getName(), &lt;/span&gt;&lt;strong&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: #7f0055&quot;&gt;null&lt;/span&gt;&lt;/strong&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;);&lt;/span&gt;&lt;/div&gt;
            &lt;div align=&quot;left&quot;&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: #0000c0&quot;&gt;helloServiceTracker&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;.open();&lt;/span&gt;&lt;/div&gt;
            &lt;div align=&quot;left&quot;&gt;&amp;nbsp;&lt;/div&gt;
            &lt;div align=&quot;left&quot;&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: #3f7f5f&quot;&gt;// grab the service&lt;/span&gt;&lt;/div&gt;
            &lt;div align=&quot;left&quot;&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: #0000c0&quot;&gt;service&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt; = (HelloService) &lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: #0000c0&quot;&gt;helloServiceTracker&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;.getService();&lt;/span&gt;&lt;/div&gt;
            &lt;div&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: #0000c0&quot;&gt;service&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;.speak();&lt;/span&gt;&lt;/div&gt;
            &lt;/td&gt;
        &lt;/tr&gt;
    &lt;/tbody&gt;
&lt;/table&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;在提供了DS之后可以采用XML文件的方式来声明：&lt;/div&gt;
&lt;table style=&quot;BORDER-RIGHT: medium none; BORDER-TOP: medium none; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; border=&quot;1&quot;&gt;
    &lt;tbody&gt;
        &lt;tr&gt;
            &lt;td style=&quot;BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 426.1pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent&quot; valign=&quot;top&quot; width=&quot;568&quot;&gt;
            &lt;div align=&quot;left&quot;&gt;&lt;span style=&quot;FONT-SIZE: 10pt&quot;&gt;&lt;!--l version=&quot;1.0&quot; encoding=&quot;UTF-8--&gt;&lt;/span&gt;&lt;/div&gt;
            &lt;div align=&quot;left&quot;&gt;&lt;span style=&quot;FONT-SIZE: 10pt&quot;&gt;&lt;component name=&quot;HelloService&quot;&gt;&lt;/component&gt;&lt;/span&gt;&lt;/div&gt;
            &lt;div align=&quot;left&quot;&gt;&lt;span style=&quot;FONT-SIZE: 10pt&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;implementation class=&quot;com.primeton.osgi.HelloServiceImpl&quot;&gt;&lt;/implementation&gt;&lt;/span&gt;&lt;/div&gt;
            &lt;div align=&quot;left&quot;&gt;&lt;span style=&quot;FONT-SIZE: 10pt&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;service&gt;&lt;/service&gt;&lt;/span&gt;&lt;/div&gt;
            &lt;div align=&quot;left&quot;&gt;&lt;span style=&quot;FONT-SIZE: 10pt&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
            &lt;provide inter=&quot;&quot;&gt;&lt;/provide&gt;
            &lt;/span&gt;&lt;/div&gt;
            &lt;div align=&quot;left&quot;&gt;&lt;span style=&quot;FONT-SIZE: 10pt&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/div&gt;
            &lt;div /&gt;&lt;/td&gt;
        &lt;/tr&gt;
    &lt;/tbody&gt;
&lt;/table&gt;
&lt;div&gt;上面的XML文件声明了HelloService的构件，实现类是&lt;span style=&quot;FONT-SIZE: 10pt&quot;&gt;com.primeton.osgi.HelloServiceImpl&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt&quot;&gt;，同时，声明了构件的服务接口为&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt&quot;&gt;com.primeton.osgi.HelloService&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt&quot;&gt;。如果不声明服务，当你使用类似下面的代码是查找不到服务的：&lt;/span&gt;&lt;/div&gt;
&lt;table style=&quot;BORDER-RIGHT: medium none; BORDER-TOP: medium none; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; border=&quot;1&quot;&gt;
    &lt;tbody&gt;
        &lt;tr&gt;
            &lt;td style=&quot;BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 426.1pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent&quot; valign=&quot;top&quot; width=&quot;568&quot;&gt;
            &lt;div align=&quot;left&quot;&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;ServiceReference reference = context.getServiceReference(TestService.&lt;/span&gt;&lt;strong&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: #7f0055&quot;&gt;class&lt;/span&gt;&lt;/strong&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;.getName());&lt;/span&gt;&lt;/div&gt;
            &lt;div align=&quot;left&quot;&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;TestService service = (TestService)context.getService(reference);&lt;/span&gt;&lt;/div&gt;
            &lt;div&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;service.test();&lt;/span&gt;&lt;/div&gt;
            &lt;/td&gt;
        &lt;/tr&gt;
    &lt;/tbody&gt;
&lt;/table&gt;
&lt;div&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;调用&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;BundleContext&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;的&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;getServiceReference&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;方法将返回空。&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;类似于&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;SCA&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;规范的构件装配模型，&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;Component&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;可以引用别的&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;Component&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;的服务。如我们声明一个&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;TestService&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;，&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;TestService&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;引用了&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;HelloService&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;。&lt;/span&gt;&lt;/div&gt;
&lt;table style=&quot;BORDER-RIGHT: medium none; BORDER-TOP: medium none; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; border=&quot;1&quot;&gt;
    &lt;tbody&gt;
        &lt;tr&gt;
            &lt;td style=&quot;BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 426.1pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent&quot; valign=&quot;top&quot; width=&quot;568&quot;&gt;
            &lt;div align=&quot;left&quot;&gt;&lt;span style=&quot;FONT-SIZE: 10pt&quot;&gt;&lt;!--l version=&quot;1.0&quot; encoding=&quot;UTF-8--&gt;&lt;/span&gt;&lt;/div&gt;
            &lt;div align=&quot;left&quot;&gt;&lt;span style=&quot;FONT-SIZE: 10pt&quot;&gt;&lt;component name=&quot;TestService&quot;&gt;&lt;/component&gt;&lt;/span&gt;&lt;/div&gt;
            &lt;div align=&quot;left&quot;&gt;&lt;span style=&quot;FONT-SIZE: 10pt&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;implementation class=&quot;com.primeton.osgi.TestServiceImpl&quot;&gt;&lt;/implementation&gt;&lt;/span&gt;&lt;/div&gt;
            &lt;div align=&quot;left&quot;&gt;&lt;span style=&quot;FONT-SIZE: 10pt&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;reference name=&quot;HelloService&quot; inter=&quot;&quot; bind=&quot;setHelloService&quot; unbind=&quot;unsetHelloService&quot; policy=&quot;dynamic&quot;&gt;&lt;/reference&gt;&lt;/span&gt;&lt;/div&gt;
            &lt;div align=&quot;left&quot;&gt;&lt;span style=&quot;FONT-SIZE: 10pt&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;service&gt;&lt;/service&gt;&lt;/span&gt;&lt;/div&gt;
            &lt;div align=&quot;left&quot;&gt;&lt;span style=&quot;FONT-SIZE: 10pt&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
            &lt;provide inter=&quot;&quot;&gt;&lt;/provide&gt;
            &lt;/span&gt;&lt;/div&gt;
            &lt;div align=&quot;left&quot;&gt;&lt;span style=&quot;FONT-SIZE: 10pt&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/div&gt;
            &lt;div /&gt;&lt;/td&gt;
        &lt;/tr&gt;
    &lt;/tbody&gt;
&lt;/table&gt;
&lt;div&gt;是不是和SCA的装配模型描述文件有点相似呢？^_^&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;下面对Equinox的Declarative Service的实现进行一下分析。&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;strong&gt;加载ComponentDescriptor&lt;/strong&gt;&lt;/div&gt;
&lt;div style=&quot;TEXT-INDENT: 21pt&quot;&gt;首先，构件的描述文件是如何被加载的呢？加载由&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;org.eclipse.equinox.ds.tracker.BundleTracker&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;来实现。&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;BundleTracker&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;会遍历所有的&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;Bundle&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;处于&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;ACTIVE&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;状态的&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;Bundle,BundleTracker&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;回调&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;BundleTrackerCustomizer&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;的&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;addingBundle&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;方法，读取所有的&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;ComponentDescriptor&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;，并加入到异步工作队列&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;WorkQueue&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;中。&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;strong&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;Resovle ComponentDescriptor&lt;/span&gt;&lt;/strong&gt;&lt;/div&gt;
&lt;div style=&quot;TEXT-INDENT: 21pt&quot;&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;加入到异步队列中的&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;ComponentDescriptor&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;需要由&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;org.eclipse.equinox.ds.resolver. Resolver&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;进行解析，判断&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;Component&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;所依赖的服务构件是否都存在，并满足条件。然后创建&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;ComponentConfiguration&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;。&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;strong&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;解析&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;Manifest Header&lt;/span&gt;&lt;/strong&gt;&lt;/div&gt;
&lt;div style=&quot;TEXT-INDENT: 21pt&quot;&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;org.eclipse.equinox.ds.parser.Parser&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;会解析&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;Manifest&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;文件，读取&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;Manifest&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;文件中的&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: #2a00ff&quot;&gt;Service-Component&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt&quot;&gt;属性。代码如下：&lt;/span&gt;&lt;/div&gt;
&lt;table style=&quot;BORDER-RIGHT: medium none; BORDER-TOP: medium none; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; border=&quot;1&quot;&gt;
    &lt;tbody&gt;
        &lt;tr&gt;
            &lt;td style=&quot;BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 426.1pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent&quot; valign=&quot;top&quot; width=&quot;568&quot;&gt;
            &lt;div align=&quot;left&quot;&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;strong&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: #7f0055&quot;&gt;private&lt;/span&gt;&lt;/strong&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt; ManifestElement[] parseManifestHeader(Bundle bundle) {&lt;/span&gt;&lt;/div&gt;
            &lt;div align=&quot;left&quot;&gt;&amp;nbsp;&lt;/div&gt;
            &lt;div align=&quot;left&quot;&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dictionary headers = bundle.getHeaders();&lt;/span&gt;&lt;/div&gt;
            &lt;div align=&quot;left&quot;&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; String files = (String) headers.get(ComponentConstants.&lt;/span&gt;&lt;em&gt;&lt;span style=&quot;FONT-SIZE: 10pt; BACKGROUND: silver; COLOR: #0000c0&quot;&gt;SERVICE_COMPONENT&lt;/span&gt;&lt;/em&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;);&lt;/span&gt;&lt;/div&gt;
            &lt;div align=&quot;left&quot;&gt;&amp;nbsp;&lt;/div&gt;
            &lt;div align=&quot;left&quot;&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;strong&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: #7f0055&quot;&gt;try&lt;/span&gt;&lt;/strong&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt; {&lt;/span&gt;&lt;/div&gt;
            &lt;div align=&quot;left&quot;&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;strong&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: #7f0055&quot;&gt;return&lt;/span&gt;&lt;/strong&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt; ManifestElement.&lt;em&gt;parseHeader&lt;/em&gt;(ComponentConstants.&lt;/span&gt;&lt;em&gt;&lt;span style=&quot;FONT-SIZE: 10pt; BACKGROUND: silver; COLOR: #0000c0&quot;&gt;SERVICE_COMPONENT&lt;/span&gt;&lt;/em&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;, files);&lt;/span&gt;&lt;/div&gt;
            &lt;div align=&quot;left&quot;&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/span&gt;&lt;strong&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: #7f0055&quot;&gt;catch&lt;/span&gt;&lt;/strong&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt; (BundleException e) {&lt;/span&gt;&lt;/div&gt;
            &lt;div align=&quot;left&quot;&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Log.&lt;em&gt;log&lt;/em&gt;(1, &lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: #2a00ff&quot;&gt;&amp;quot;[SCR] Error attempting parse Manifest Element Header. &amp;quot;&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;, e);&lt;/span&gt;&lt;/div&gt;
            &lt;div align=&quot;left&quot;&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;strong&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: #7f0055&quot;&gt;return&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: #7f0055&quot;&gt;new&lt;/span&gt;&lt;/strong&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt; ManifestElement[0];&lt;/span&gt;&lt;/div&gt;
            &lt;div align=&quot;left&quot;&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/div&gt;
            &lt;div align=&quot;left&quot;&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/div&gt;
            &lt;div&gt;&amp;nbsp;&lt;/div&gt;
            &lt;/td&gt;
        &lt;/tr&gt;
    &lt;/tbody&gt;
&lt;/table&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;TEXT-INDENT: 21pt&quot;&gt;因此，为了使Component的描述文件被加载，必须在Manifest文件中申明要加载的xml文件。如下所示：&lt;/div&gt;
&lt;table style=&quot;BORDER-RIGHT: medium none; BORDER-TOP: medium none; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; border=&quot;1&quot;&gt;
    &lt;tbody&gt;
        &lt;tr&gt;
            &lt;td style=&quot;BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 426.1pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent&quot; valign=&quot;top&quot; width=&quot;568&quot;&gt;
            &lt;div align=&quot;left&quot;&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: maroon&quot;&gt;Manifest-Version&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;: 1.0&lt;/span&gt;&lt;/div&gt;
            &lt;div align=&quot;left&quot;&gt;&lt;strong&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: maroon&quot;&gt;Bundle-ManifestVersion&lt;/span&gt;&lt;/strong&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;: 2&lt;/span&gt;&lt;/div&gt;
            &lt;div align=&quot;left&quot;&gt;&lt;strong&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: maroon&quot;&gt;Bundle-Name&lt;/span&gt;&lt;/strong&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;: Test Plug-in&lt;/span&gt;&lt;/div&gt;
            &lt;div align=&quot;left&quot;&gt;&lt;strong&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: maroon&quot;&gt;Bundle-SymbolicName&lt;/span&gt;&lt;/strong&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;: test&lt;/span&gt;&lt;/div&gt;
            &lt;div align=&quot;left&quot;&gt;&lt;strong&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: maroon&quot;&gt;Bundle-Version&lt;/span&gt;&lt;/strong&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;: 1.0.0&lt;/span&gt;&lt;/div&gt;
            &lt;div align=&quot;left&quot;&gt;&lt;span style=&quot;FONT-SIZE: 10pt; BACKGROUND: yellow; COLOR: maroon&quot;&gt;Service-Componen&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; BACKGROUND: yellow; COLOR: black&quot;&gt;: test.xml&lt;/span&gt;&lt;/div&gt;
            &lt;div align=&quot;left&quot;&gt;&lt;strong&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: maroon&quot;&gt;Import-Package&lt;/span&gt;&lt;/strong&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;: org.osgi.framework;&lt;/span&gt;&lt;em&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: olive&quot;&gt;version&lt;/span&gt;&lt;/em&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;=&amp;quot;1.3.0&amp;quot;,&lt;/span&gt;&lt;/div&gt;
            &lt;div align=&quot;left&quot;&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;&amp;nbsp;org.osgi.util.tracker;&lt;/span&gt;&lt;em&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: olive&quot;&gt;version&lt;/span&gt;&lt;/em&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;=&amp;quot;1.3.1&amp;quot;&lt;/span&gt;&lt;/div&gt;
            &lt;div&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: maroon&quot;&gt;Eclipse-LazyStart&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;: true&lt;/span&gt;&lt;/div&gt;
            &lt;/td&gt;
        &lt;/tr&gt;
    &lt;/tbody&gt;
&lt;/table&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;strong&gt;解析ComponentDescriptor&lt;/strong&gt;&lt;/div&gt;
&lt;div style=&quot;TEXT-INDENT: 21pt&quot;&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;org.eclipse.equinox.ds.parser.Parser&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;同时会负责解析构件描述文件。&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;strong&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;创建&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;Component&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;实例&lt;/span&gt;&lt;/strong&gt;&lt;/div&gt;
&lt;div style=&quot;TEXT-INDENT: 21pt&quot;&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;org.eclipse.equinox.ds.instance.BuildDispose&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;负责根据&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;ComponentDescriptor&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;创建&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;Component&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;的实例。具体参见&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;buildComponentConfigInstance&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;方法。&lt;/span&gt;&lt;/div&gt;
&lt;table style=&quot;BORDER-RIGHT: medium none; BORDER-TOP: medium none; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; border=&quot;1&quot;&gt;
    &lt;tbody&gt;
        &lt;tr&gt;
            &lt;td style=&quot;BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 426.1pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent&quot; valign=&quot;top&quot; width=&quot;568&quot;&gt;
            &lt;div align=&quot;left&quot;&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;ComponentDescription componentDescription = componentConfiguration.getComponentDescription();&lt;/span&gt;&lt;/div&gt;
            &lt;div align=&quot;left&quot;&gt;&amp;nbsp;&lt;/div&gt;
            &lt;div align=&quot;left&quot;&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;Object instance = createInstance(componentDescription);&lt;/span&gt;&lt;/div&gt;
            &lt;div align=&quot;left&quot;&gt;&amp;nbsp;&lt;/div&gt;
            &lt;div align=&quot;left&quot;&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;componentInstance = instantiate(componentConfiguration, instance);&lt;/span&gt;&lt;/div&gt;
            &lt;div align=&quot;left&quot;&gt;&amp;nbsp;&lt;/div&gt;
            &lt;div align=&quot;left&quot;&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;createComponentContext(usingBundle, componentInstance);&lt;/span&gt;&lt;/div&gt;
            &lt;div align=&quot;left&quot;&gt;&amp;nbsp;&lt;/div&gt;
            &lt;div align=&quot;left&quot;&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;bind(componentInstance);&lt;/span&gt;&lt;/div&gt;
            &lt;div align=&quot;left&quot;&gt;&amp;nbsp;&lt;/div&gt;
            &lt;div align=&quot;left&quot;&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;activate(componentInstance);&lt;/span&gt;&lt;/div&gt;
            &lt;div align=&quot;left&quot;&gt;&amp;nbsp;&lt;/div&gt;
            &lt;div&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;componentConfiguration.addInstance(componentInstance);&lt;/span&gt;&lt;/div&gt;
            &lt;/td&gt;
        &lt;/tr&gt;
    &lt;/tbody&gt;
&lt;/table&gt;
&lt;div style=&quot;MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt&quot;&gt;&lt;span&gt;1.&lt;span style=&quot;FONT-WEIGHT: normal; FONT-SIZE: 7pt; LINE-HEIGHT: normal; FONT-STYLE: normal; FONT-VARIANT: normal&quot; times=&quot;&quot; new=&quot;&quot;&gt;&lt;font size=&quot;3&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;/span&gt;&lt;/span&gt;首先从ComponentConfiguration中获取ComponentDescriptor.&lt;/div&gt;
&lt;div style=&quot;MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt&quot;&gt;&lt;span&gt;2.&lt;span style=&quot;FONT-WEIGHT: normal; FONT-SIZE: 7pt; LINE-HEIGHT: normal; FONT-STYLE: normal; FONT-VARIANT: normal&quot; times=&quot;&quot; new=&quot;&quot;&gt;&lt;font size=&quot;3&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;/span&gt;&lt;/span&gt;根据ComponentDescritptor创建一个Component的实例。&lt;/div&gt;
&lt;div style=&quot;MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt&quot;&gt;&lt;span&gt;3.&lt;span style=&quot;FONT-WEIGHT: normal; FONT-SIZE: 7pt; LINE-HEIGHT: normal; FONT-STYLE: normal; FONT-VARIANT: normal&quot; times=&quot;&quot; new=&quot;&quot;&gt;&lt;font size=&quot;3&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;/span&gt;&lt;/span&gt;创建Component的上下文ComponentContext。&lt;/div&gt;
&lt;div style=&quot;MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt&quot;&gt;&lt;span&gt;4.&lt;span style=&quot;FONT-WEIGHT: normal; FONT-SIZE: 7pt; LINE-HEIGHT: normal; FONT-STYLE: normal; FONT-VARIANT: normal&quot; times=&quot;&quot; new=&quot;&quot;&gt;&lt;font size=&quot;3&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;/span&gt;&lt;/span&gt;将Component需要的Service进行绑定。&lt;/div&gt;
&lt;div style=&quot;MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt&quot;&gt;&lt;span&gt;5.&lt;span style=&quot;FONT-WEIGHT: normal; FONT-SIZE: 7pt; LINE-HEIGHT: normal; FONT-STYLE: normal; FONT-VARIANT: normal&quot; times=&quot;&quot; new=&quot;&quot;&gt;&lt;font size=&quot;3&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;/span&gt;&lt;/span&gt;调用Component的activate方法，激活Component。&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;TEXT-INDENT: 18pt&quot;&gt;Component可以是任何一个Java类，而不需要继承或实现OSGI的类或接口，但可以定义一个activate方法，在Component被激活时作相关处理。&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;TEXT-INDENT: 18pt&quot;&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;org.eclipse.equinox.ds.instance.InvokeMethod&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;负责在调用&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;Component&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;的相关方法，采用类反射的机制将&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;Server&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;绑定到&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;Component&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;上。&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;InvokeMethod&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;的&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;findBindOrUnbindMethod&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;会在&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;Component&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;的实现类和超类中去查找绑定方法。&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;TEXT-INDENT: 18pt&quot;&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;从以上分析，可以看出&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;Equinox&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;的&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;Declarative Service&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;实现了一个服务构件定义、加载、装配、服务查找的一个服务构件运行环境。和&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;SCA&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;的构件装配模型异曲同工。&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;Declarative Service&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;规范应该早于&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;SCA&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;规范的制定，因此，在某种程度上，&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;SCA&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;装配模型参考了&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;Declarative Service&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;的服务构件模型，并在此基础上发展完善，多出了&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;Contribution&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;、&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;Composite&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;等概念，对于服务绑定的范畴也进行了拓宽，并不局限于&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;Java&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;语言的&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;Service&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 10pt; COLOR: black&quot;&gt;，从而做到了语言无关、平台无关。&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
   </description>
   <link>http://gocom.primeton.com/blog/index.php?op=ViewArticle&amp;articleId=2965&amp;blogId=14</link>
   <comments>http://gocom.primeton.com/blog/index.php?op=ViewArticle&amp;articleId=2965&amp;blogId=14</comments>
   <guid>http://gocom.primeton.com/blog/index.php?op=ViewArticle&amp;articleId=2965&amp;blogId=14</guid>
      <dc:creator>yanfei</dc:creator>
      
    <category>乱弹</category>
         <pubDate>Sun, 25 Nov 2007 18:11:12</pubDate>
   <source url="http://gocom.primeton.com/blog/rss.php?blogId=14&amp;profile=rss20">三十乱弹</source>
     </item>
    <item>
   <title>OSGI作为WEB应用底层基础设施的问题</title>
   <description>
    OSGI在这一两年在开发者中被广泛的熟知，除了作为Eclipse的底层模块化框架之外，OSGI作为服务端应用的模块化框架支持也在不断的实践和尝试中。Equinox作为一个比较成熟的OSGI r4实现被广泛使用。 OSGI基于Equinox实现应用的在服务端应用目前主要有以下两种方式： 1.Equinox嵌入应用服务器容器中 &lt;img alt=&quot;&quot; src=&quot;http://www.theserverside.com/tt/articles/content/EclipseEquinoxOSGi/clip_image004.gif&quot; /&gt; 2.应用服务器潜入Equinox中 &lt;img alt=&quot;&quot; src=&quot;http://www.theserverside.com/tt/articles/content/EclipseEquinoxOSGi/clip_image006.gif&quot; /&gt; 上面的两种不同的方式，我更看好第二种部署方式，可以更加灵活的支持更大型的应用。目前Eclipse的Equinox内置了Jetty来支持Http和Servlet访问。但也仅提供了一个WEB容器，而缺少其他的J2EE服务。一个显而易见的问题就是，如果要现有WEB应用移植到OSGI方式的容器中来，最大的问题就是应用服务器对OSGI的支持如何？ 值得我们期待的是，IBM下一个版本的Web Sphere的底层会使用OSGI，Bea最新版本的WebLogic10.3已经基于microService，而microService也正是基于OSGI框架，但如果对于一个能够适应多应用服务器平台的产品，还是要考虑对老版本的应用服务器和其他种类的应用服务器对OSGI的支持。因此，从这点来看，OSGI在Web服务端的大规模应用也许还需要时间。 &lt;br/&gt; --
   </description>
   <link>http://gocom.primeton.com/blog/index.php?op=ViewArticle&amp;articleId=2462&amp;blogId=14</link>
   <comments>http://gocom.primeton.com/blog/index.php?op=ViewArticle&amp;articleId=2462&amp;blogId=14</comments>
   <guid>http://gocom.primeton.com/blog/index.php?op=ViewArticle&amp;articleId=2462&amp;blogId=14</guid>
      <dc:creator>yanfei</dc:creator>
      
    <category>乱弹</category>
         <pubDate>Sun, 18 Nov 2007 11:11:49</pubDate>
   <source url="http://gocom.primeton.com/blog/rss.php?blogId=14&amp;profile=rss20">三十乱弹</source>
     </item>
    <item>
   <title>Eclipse 4.0的目标是更小、更快、更简单</title>
   <description>
    A major overhaul of the Eclipse code base may be a long time off, but it&amp;quot;s on the minds of some of the leaders of the open-source tools platform. &lt;br/&gt; &lt;p&gt;在近期的Eclipse World 2007的座谈会上，Eclipse基金会的执行总监Mike Milinkovich说如果我们做Eclipse 4.0的话，它必须比现在的Eclipse更小、更快、更简单。这就意味这，Eclipse 4.0将会对现有的Eclipse 代码进行一次比较大的翻新，并在开发中时刻保持代码的清洁。Milinkovich还说在2008年6月份发布的&amp;nbsp;Ganymede不会包含以上大修的内容。&lt;/p&gt;
&lt;p&gt;看来，现在的Eclipse变得越来越大，越来越慢是大家达成的共识，3年前，使用512兆内存的机器在Eclipse中开发很流畅，而现在1G内存的机器却也很勉强。软件变得越来越大，越来越慢，耗费的资源越来越多已经是所有软件开发商的共同诟病，回到10年前或者5年前，一个软件使用一张软盘就可以装下的时代已经一去不复返了。单元Eclipse 4.0能够真的做到更小、更快、更简单，而不仅仅是一个美好的愿望。&lt;/p&gt;
   </description>
   <link>http://gocom.primeton.com/blog/index.php?op=ViewArticle&amp;articleId=2251&amp;blogId=14</link>
   <comments>http://gocom.primeton.com/blog/index.php?op=ViewArticle&amp;articleId=2251&amp;blogId=14</comments>
   <guid>http://gocom.primeton.com/blog/index.php?op=ViewArticle&amp;articleId=2251&amp;blogId=14</guid>
      <dc:creator>yanfei</dc:creator>
      
    <category>乱弹</category>
         <pubDate>Wed, 14 Nov 2007 12:11:56</pubDate>
   <source url="http://gocom.primeton.com/blog/rss.php?blogId=14&amp;profile=rss20">三十乱弹</source>
     </item>
    <item>
   <title>Newton组件模型介绍</title>
   <description>
    &lt;div&gt;Newton项目的目的是建立一个分布式组件模型。要成为一个真正意义上可用的分布式组件框架，要从根本上解决本地计算和分布式计算的不同。如&lt;a href=&quot;http://en.wikipedia.org/wiki/Fallacies_of_Distributed_Computing&quot;&gt;The Eight Fallacies of Distributed Computing&lt;/a&gt; 和 &lt;a href=&quot;http://research.sun.com/techrep/1994/abstract-29.html&quot;&gt;A note on distributed computing&lt;/a&gt;所讲。&lt;/div&gt; &lt;br/&gt; &lt;div&gt;目的&lt;/div&gt;
&lt;div&gt;Newton项目的目的是建立一个分布式组件模型。要成为一个真正意义上可用的分布式组件框架，要从根本上解决本地计算和分布式计算的不同。如&lt;a href=&quot;http://en.wikipedia.org/wiki/Fallacies_of_Distributed_Computing&quot;&gt;The Eight Fallacies of Distributed Computing&lt;/a&gt; 和 &lt;a href=&quot;http://research.sun.com/techrep/1994/abstract-29.html&quot;&gt;A note on distributed computing&lt;/a&gt;所讲。&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;另一个要考虑的是必须易于开发。 近来很多的轻量级POJO框架，如Spring ，他们迅速通过开源社区而得到发展。将域模型与基础设施分离，可以提高开发效率和可维护性，并避免依赖于特定的开发厂商。 &lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;Newton基于以上考虑开发，并将提供分布式计算功能。&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;关键技术&lt;/div&gt;
&lt;div&gt;这个世界是一个高度动态的分布式组件模型，并会随时面对无法预料的失败和不确定的网络状态。分布式系统的管理，如部署或整理系统环境是一项繁重的工作。它阻碍了我们开发和建立一个可以自治的分布式系统。Newton使用OSGi和Jini来解决这些问题。OSGi是Newton整个构件模型的中心，而Jini则是其远程基础设施的基石。同时，Newton使用SCA来描述构件装配模型。&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;OSGI&lt;/div&gt;
&lt;div&gt;Osgi为单个JVM提供了一个高度动态和设计良好的服务模型。OSGI的部署单元Bundle, 使用了平级的类加载模型，而不是出传统的层次的类加载模型，这种类加载模型确保了OSGI的运行环境具有高度一致性的类视图，而不会因为层次的类加载模型而导致类加载错误在不同层级的类加载器之间传递。 Bundle具有一个从安装到卸载的定义良好的生命周期。 此外，OSGI对传统的jar形式封装进行了一些改进，可以将API暴露给用户，而将其余的类作为私有的，确保不被用户访问。Bundle在物理上是具有一些附加元数据的jar文件，Bundle在运行时靠这些元数据被运行环境解析。OSGI提供了一个内部的服务注册表，不同Bundle中的服务在创建时可以通过服务注册表查找到其他服务。&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;此外， OSGI在Bundle和服务级别都有严密的安全模型。&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;OSGI具有的以上的丰富的和高度的动态模型，使得Newton项目选择OSGI看起来顺理成章。Newton的容器本身在OSGI Bundles之外建立，最终用户的组建代码则以Bundle的形式部署。&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;目前，Newton运行在OSGI R4的容器中。Knopflerfish 和Equinox都可以直接被支持。我们期望不久可以加入到Felix。&lt;/div&gt;
&lt;div&gt;Jini&lt;/div&gt;
&lt;div&gt;jini的提供了一个面向服务的模型来解决了现实的分布式计算。 尤其jini的提供分布式注册表，远程服务可以通过分布式注册表找到对方，and makes extensive use of leasing to ensure reclamation of resources that are not explicitly release by failed clients.。 Jini提供了一个高质量易扩展的RMI栈，对网络级和远程代码的安全提供良好支持。 &lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;Newton利用Jini的远程注册表来跟踪和连接远程依赖的Newton组件。 未来推出的Newton项目将利用Jini的分布式事务管理的能力和&lt;a href=&quot;http://www.dancres.org/cottage/javaspaces.html&quot;&gt;Javaspaces&lt;/a&gt;来在分布式过程中进行协调。&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;SCA&lt;/div&gt;
&lt;div&gt;SCA是一个与具体语言和协议无关的组件规范和编程模型。 它允许具有层级关系的构件装配模型运行在同构或互相分离的异构系统中。 &lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;Newton可以实例化一个跨硬件系统的高度动态的SCA实现，SCA实现由SCA描述符所描述，Newton可以自动提供必要的资源并在不同的异构系统之间连接装配为SCA实现。&lt;/div&gt;
&lt;div&gt;Newton的SCA实现是高度动态的，它由一个SCA描述符来描述 ，Newton能够无需人工干预地实例化一个跨硬件的分布式系统，提供必要的资源和连接SCA复合构件(Composite)。在运行期间Newton监控系统运行情况并对错误作出响应。Newton监控SCA描述符，并将描述符的改变广播并通知系统。当不在需要SCA系统时，Newton可以完全的释放所有使用的资源。&lt;/div&gt;
&lt;div&gt;&lt;strong&gt;Component model&lt;/strong&gt;&lt;/div&gt;
&lt;div&gt;Overview&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Newton&lt;/span&gt;的最小部署单元是一个SCA Composite运行在单独的进程中，SCA Composite打包为一个单独的OSGI Bundle,该Bundle是一个facory bundle。Factory bundle包含并导入了所有的必须的类和资源去实例化指定的Composite，Factory bundle根据composite 模板创建多个示例并进行管理。Composite模板是包含了创建一个composite的所必须描述符和Composite的结构，包括Composite的声明周期管理、服务、引用。&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Composite&lt;/span&gt;描述符为Newton Install提供了安装所必须的信息，描述符是基于SCA的Composite模板，并根据制定信息重载并实例化Composite模板。描述符被从系统中移除时也会移除对应的Composite。&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Newton Composite&lt;/span&gt;可以引用多个服务，贯穿于一个Composite的运行期间，Newton监控并根据Composite的绑定类型和元数据连接不同的Composite。当一个引用的服务实现时，会通知绑定，并且在和断开连接，然后再自动去重新连接引用的服务或者选择一个其他的服务。&lt;/div&gt;
&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;当第一个Composite安装后，相关的factory bundle和所有的依赖也会被安装。当最后一个composite卸载时，bundle垃圾手机机制会从系统中溢出所有的不需要使用的bundle。
   </description>
   <link>http://gocom.primeton.com/blog/index.php?op=ViewArticle&amp;articleId=2178&amp;blogId=14</link>
   <comments>http://gocom.primeton.com/blog/index.php?op=ViewArticle&amp;articleId=2178&amp;blogId=14</comments>
   <guid>http://gocom.primeton.com/blog/index.php?op=ViewArticle&amp;articleId=2178&amp;blogId=14</guid>
      <dc:creator>yanfei</dc:creator>
      
    <category>乱弹</category>
         <pubDate>Sat, 03 Nov 2007 11:11:05</pubDate>
   <source url="http://gocom.primeton.com/blog/rss.php?blogId=14&amp;profile=rss20">三十乱弹</source>
     </item>
    <item>
   <title>[程序员健康之路]----最健康的自制备安眠药</title>
   <description>
    &lt;div class=&quot;postTitle&quot;&gt;配方:&lt;/div&gt;
&lt;div class=&quot;postText&quot;&gt;
&lt;p&gt;绿茶,二锅头&lt;/p&gt;
&lt;/div&gt; &lt;br/&gt; &lt;p&gt;说明:&lt;/p&gt;
&lt;p&gt;先把茶泡好,平时怎么泡就怎么泡,等茶基本上可以喝的时候,就加入二锅头（最好是十年陈的）,整瓶倒进去,呵呵,当然不可以啦.&lt;/p&gt;
&lt;p&gt;只要倒一滴就行了.....之后等茶凉点,再把茶喝了,这样你一上床,只要过一会儿,你就可以去教周公编程了.&lt;/p&gt;
&lt;p&gt;注意(绿茶最好选用立顿牌的绿茶,二锅头最好是北京产的)&lt;/p&gt;
   </description>
   <link>http://gocom.primeton.com/blog/index.php?op=ViewArticle&amp;articleId=421&amp;blogId=14</link>
   <comments>http://gocom.primeton.com/blog/index.php?op=ViewArticle&amp;articleId=421&amp;blogId=14</comments>
   <guid>http://gocom.primeton.com/blog/index.php?op=ViewArticle&amp;articleId=421&amp;blogId=14</guid>
      <dc:creator>yanfei</dc:creator>
      
    <category>乱弹</category>
         <pubDate>Sat, 29 Sep 2007 09:09:19</pubDate>
   <source url="http://gocom.primeton.com/blog/rss.php?blogId=14&amp;profile=rss20">三十乱弹</source>
     </item>
    <item>
   <title>SCA同OSGI的比较</title>
   <description>
    &lt;p /&gt;
&lt;p style=&quot;TEXT-INDENT: 21pt&quot;&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;最近一段时间先后看了&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;SCA&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;规范和&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;OSGI&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;的规范。看完之后再对二者作一个全面的比较。&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;TEXT-INDENT: 21pt&quot;&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;首先，两个规范制定的出发点和初衷是不一样的。&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;SCA&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;规范是为了企业应用集成而制定，&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;OSGI&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;规范的初衷则是为移动设备计算而制定的。由于二者的出发点不一样，导致了两个规范的侧重点不一样。&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;SCA&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;规范现在的版本是&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;0.95&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;，相对&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;OSGI&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;规范的&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;4.0&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;版本还显得多少有些稚嫩。&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;TEXT-INDENT: 21pt&quot;&gt;&lt;span lang=&quot;EN-US&quot;&gt;SCA&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;规范中着重解决了现有企业应用之间的相互调用和企业应用如何以面向服务的思想来建立和部署。但是对于构件容器的实现方面的规定则有些不足，仅仅是站在使用者的角度描述了客户端&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;API&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;的规格。&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;TEXT-INDENT: 21pt&quot;&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;而&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;OSGI&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;规范因为最初的出发点是为了移动设备的计算环境，因此更多的考虑了运行时框架和服务在运行时刻的动态匹配等问题。此外，提供了运行时刻应用程序的热部署、解析、运行、卸载等能力。应该说，&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;OSGI&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;规范发展到&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;4.0&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;已经是一个比较完善的规范了。&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;TEXT-INDENT: 21pt&quot;&gt;&lt;span lang=&quot;EN-US&quot;&gt;SCA&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;规范中目前对&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;SCA&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;容器的实现尚没有一个指导性的意见，但是&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;OSGI&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;规范在这方面已经做的很完善了。&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;OSGI&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;规范中定义了&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;Framework&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;、&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;Start Level&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;、&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;Package Admin&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;、&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;Security&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;，详细描述了不同组件之间的依赖规则&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;静态依赖，动态导入&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;，不同组件之间使用独立的类名称空间。&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;TEXT-INDENT: 21pt&quot;&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;由于&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;SCA&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;规范面向企业应用集成，因此&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;SCA&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;构件的实现可以是&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;Java&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;，&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;BPEL&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;，&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;EJB&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;，&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;WebService&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;。而&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;OSGI&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;的实现只面向&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;Java&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;语言。这也是由于二者的出发点不同导致的。&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;TEXT-INDENT: 21pt&quot;&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;对于&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;SCA&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;和&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;OSGI&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;的装配模型，二者是大同小异。二者都可以对外提供服务（&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;Service&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;），但&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;SCA&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;更偏重设计时刻的构件组装，而且定义了灵活的构件装配模型，可以由最小的原子构件组装成一个大系统。&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;TEXT-INDENT: 21pt&quot;&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;从现有的已经实现的产品来看，&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;OSGI&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;更多的被用来作为单一产品的整体架构，&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;SCA&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;规范更多的是被用在面向业务的构件的组装规范，至于&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;SCA&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;产品的架构如何则不是&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;SCA&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;规范所关心的。&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;TEXT-INDENT: 21pt&quot;&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;从上边的比较可以显而易见的看出二者分别的缺点，&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;SCA&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;规范过于强调集成，但是对&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;SCA&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;构件的运行时刻行为描述太弱，所有的构件实现都是在设计时刻绑定的。也许在&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;SCA&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;产品中可以实现运行时刻的动态绑定，但是作为一个规范，这是它所欠缺的。&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;OSGI&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;规范对组件的运行时刻描述很完备，但是所有的组件必须运行在同一个虚拟机中，不同虚拟机中的组件服务互操作则稍显不足。&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;TEXT-INDENT: 21pt&quot;&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;以上完全是个人的看法，欢迎大家讨论。&lt;/span&gt;&lt;/p&gt; &lt;br/&gt; 
   </description>
   <link>http://gocom.primeton.com/blog/index.php?op=ViewArticle&amp;articleId=839&amp;blogId=14</link>
   <comments>http://gocom.primeton.com/blog/index.php?op=ViewArticle&amp;articleId=839&amp;blogId=14</comments>
   <guid>http://gocom.primeton.com/blog/index.php?op=ViewArticle&amp;articleId=839&amp;blogId=14</guid>
      <dc:creator>yanfei</dc:creator>
      
    <category>乱弹</category>
         <pubDate>Fri, 28 Sep 2007 10:09:48</pubDate>
   <source url="http://gocom.primeton.com/blog/rss.php?blogId=14&amp;profile=rss20">三十乱弹</source>
     </item>
    <item>
   <title>OSGI、JMX、Spring、SOA</title>
   <description>
    &lt;h1&gt;&lt;span lang=&quot;EN-US&quot;&gt;OSGI&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;、&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;JMX&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;、&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;Spring&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;、&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;SOA&lt;/span&gt;&lt;/h1&gt;
&lt;p&gt;&lt;span lang=&quot;EN-US&quot; /&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;这两天得了重感冒，不过感觉感冒时更能静下心来看书。这两天看了些&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;OSGI&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;方面的资料，感觉需要整理一下思路。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span lang=&quot;EN-US&quot;&gt;OSGI Framework&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;的结构有点意思，&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;Framework&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;本身就是一个&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;Bundl&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;FONT-FAMILY: 宋体&quot;&gt;e(System Bundle),&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;在&lt;span lang=&quot;EN-US&quot;&gt;Framework&lt;/span&gt;之上可以有用户的&lt;span lang=&quot;EN-US&quot;&gt;Bundle&lt;/span&gt;。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span lang=&quot;EN-US&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;span lang=&quot;EN-US&quot; /&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;一直在思考&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;OSGI&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;和&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;JMX&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;有什么相似之处。看了&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;OSGI&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;规范的服务层相关内容，感觉和&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;JMX&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;很相似。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span lang=&quot;EN-US&quot; /&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;开始一直认为&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;OSGI&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;只是提供了对组件的生命周期管理。然而缺乏对组件内部的访问机制。现在发觉自己错了。一个&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;Bundle&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;可以注册&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;N&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;多的服务，通过&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;BundleContext&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;可以得到服务对象。代码如下：&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;注册一个服务：&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;BORDER-RIGHT: medium none; BORDER-TOP: medium none; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; border=&quot;1&quot;&gt;
    &lt;tbody&gt;
        &lt;tr&gt;
            &lt;td style=&quot;BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 426.1pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent&quot; valign=&quot;top&quot; width=&quot;568&quot;&gt;
            &lt;p style=&quot;TEXT-INDENT: 42pt&quot;&gt;&lt;span lang=&quot;EN-US&quot;&gt;//Register StartLevel Service&lt;/span&gt;&lt;/p&gt;
            &lt;p&gt;&lt;span lang=&quot;EN-US&quot;&gt;properties = new Hashtable();&lt;/span&gt;&lt;/p&gt;
            &lt;p&gt;&lt;span lang=&quot;EN-US&quot;&gt;properties&lt;/span&gt;&lt;/p&gt;
            &lt;p&gt;&lt;span lang=&quot;EN-US&quot;&gt;.put(Constants.SERVICE_PID, OSGiGaintFramework.STARTLEVEL_PID);&lt;/span&gt;&lt;/p&gt;
            &lt;p&gt;&lt;span lang=&quot;EN-US&quot;&gt;this.startLevelAdminImpl = new WukongStartLevelAdmin(this);&lt;/span&gt;&lt;/p&gt;
            &lt;p&gt;&lt;span lang=&quot;EN-US&quot;&gt;this.startLevelReg = context.registerService(&lt;/span&gt;&lt;/p&gt;
            &lt;p&gt;&lt;span lang=&quot;EN-US&quot;&gt;StartLevel.class.getName(), this.startLevelAdminImpl,&lt;/span&gt;&lt;/p&gt;
            &lt;p&gt;&lt;span lang=&quot;EN-US&quot;&gt;properties);&lt;/span&gt;&lt;/p&gt;
            &lt;/td&gt;
        &lt;/tr&gt;
    &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;获取服务对象：&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;BORDER-RIGHT: medium none; BORDER-TOP: medium none; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; border=&quot;1&quot;&gt;
    &lt;tbody&gt;
        &lt;tr&gt;
            &lt;td style=&quot;BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 426.1pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent&quot; valign=&quot;top&quot; width=&quot;568&quot;&gt;
            &lt;p&gt;&lt;span lang=&quot;EN-US&quot;&gt;ServiceReference reference = context&lt;/span&gt;&lt;/p&gt;
            &lt;p&gt;&lt;span lang=&quot;EN-US&quot;&gt;.getServiceReference(&amp;quot;org.osgi.service.startlevel.StartLevel&amp;quot;);&lt;/span&gt;&lt;/p&gt;
            &lt;p&gt;&lt;span lang=&quot;EN-US&quot;&gt;StartLevel startLevel = (StartLevel) context.getService(reference);&lt;/span&gt;&lt;/p&gt;
            &lt;p&gt;&lt;span lang=&quot;EN-US&quot;&gt;startLevel.setStartLevel(0);&lt;/span&gt;&lt;/p&gt;
            &lt;/td&gt;
        &lt;/tr&gt;
    &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;span lang=&quot;EN-US&quot;&gt;OSGI Framework&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;对于服务的使用有跟踪机制，&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;这样看来是不是和&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;JMX&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;有几分相似？以&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;JBoss&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;为例，需要事先在&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;jboss-service.xml&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;文件中进行配置，然后&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;BORDER-RIGHT: medium none; BORDER-TOP: medium none; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; border=&quot;1&quot;&gt;
    &lt;tbody&gt;
        &lt;tr&gt;
            &lt;td style=&quot;BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 426.1pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent&quot; valign=&quot;top&quot; width=&quot;568&quot;&gt;
            &lt;p&gt;&lt;span lang=&quot;EN-US&quot;&gt;HelloWorldServiceMBean mbean = (HelloWorldServiceMBean) MBeanProxyExt.create(HelloWorldServiceMBean.class, ObjectNameFactory.create(&amp;quot;www.chengang.com.cn:service=HelloWorld&amp;quot;));&lt;/span&gt;&lt;/p&gt;
            &lt;p&gt;&amp;nbsp;&lt;/p&gt;
            &lt;p&gt;&lt;span lang=&quot;EN-US&quot;&gt;String msg = mbean.getMessage();&lt;/span&gt;&lt;/p&gt;
            &lt;p&gt;&lt;span lang=&quot;EN-US&quot;&gt;System.out.println(&amp;quot;Client.go()=&amp;quot; + msg);&lt;/span&gt;&lt;/p&gt;
            &lt;/td&gt;
        &lt;/tr&gt;
    &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span lang=&quot;EN-US&quot;&gt;JMX&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;规范中也有动态&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;MBean&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;的概念，可以动态的部署&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;MBean&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span lang=&quot;EN-US&quot; /&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;另外一个问题，&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;OSGI&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;的架构在&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;J2EE&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;应用服务器中如何使用，看到消息好像已经有&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;J2EE&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;服务器准备在&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;OSGI&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;的基础上实现了，可以理解，&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;J2EE&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;服务器的服务组件可以通过&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;Bundle&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;上注册&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;Service&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;来实现，但是对于&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;WEB&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;应用可以采用&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;OSGI&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;吗？感觉好像不行。第一，同&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;WEB&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;容器相关的规范不一致；第二，&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;OSGI&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;的类加载机制不适合&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;WEB&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;应用。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span lang=&quot;EN-US&quot; /&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;最近在看&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;Spring&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;，也对&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;OSGI&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;，&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;Spring&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;做一个比较。&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;OSGI&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;同&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;JMX&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;都是重量级的，都对容器有依赖，这一点&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;Spring&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;做的比较好。但是&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;OSGI&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;，&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;JMX&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;都提供了组件动态配置部署的能力，&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;Spring&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;是没有的。另外，感觉&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;OSGI&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;规范的内容更广，更全面。不光包括了组件动态加载、部署，还有安全性、完善的类加载机制等等。其次，&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;OSGI&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;，&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;JMX&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;更多的是面向服务的，而&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;Spring&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;的目标是提供可重用的商业组件和业务的域模型。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span lang=&quot;EN-US&quot; /&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;另外，今天看了一个&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;PPT&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;，是对&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;OSGI&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;和&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;SOA&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;的比较，下面是原话：&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;TEXT-INDENT: -18pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;FONT-FAMILY: 宋体&quot;&gt;&lt;span&gt;&amp;ndash;&lt;span new=&quot;&quot; times=&quot;&quot;&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;Web services bind and discover over the net&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;TEXT-INDENT: -18pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;FONT-FAMILY: 宋体&quot;&gt;&lt;span&gt;&amp;ndash;&lt;span new=&quot;&quot; times=&quot;&quot;&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;The OSGi Service Platform binds and discovers inside a Java VM&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;星期五和同事的讨论也聊到了&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;OSGI&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;是否有服务发现机制，这应该是答案吧。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;br/&gt; 
   </description>
   <link>http://gocom.primeton.com/blog/index.php?op=ViewArticle&amp;articleId=692&amp;blogId=14</link>
   <comments>http://gocom.primeton.com/blog/index.php?op=ViewArticle&amp;articleId=692&amp;blogId=14</comments>
   <guid>http://gocom.primeton.com/blog/index.php?op=ViewArticle&amp;articleId=692&amp;blogId=14</guid>
      <dc:creator>yanfei</dc:creator>
      
    <category>乱弹</category>
         <pubDate>Fri, 28 Sep 2007 10:09:32</pubDate>
   <source url="http://gocom.primeton.com/blog/rss.php?blogId=14&amp;profile=rss20">三十乱弹</source>
     </item>
    <item>
   <title>期待SCA、OSGI的天作之合</title>
   <description>
    &lt;div style=&quot;LINE-HEIGHT: 150%&quot;&gt;&lt;/div&gt;
&lt;div style=&quot;TEXT-INDENT: 21pt; LINE-HEIGHT: 150%&quot;&gt;我博客中以前的文章中对&lt;a href=&quot;http://www.osoa.org/&quot;&gt;SCA&lt;/a&gt;、&lt;a href=&quot;http://www.osgi.org/&quot;&gt;OSGI&lt;/a&gt;、Spring曾做过一些粗略的比较，也一直在思考SCA、OSGI能否走到一起，最终以什么样的形式结合。在OSGI主席&lt;a href=&quot;http://www.osgi.org/blog/&quot;&gt;Peter&lt;/a&gt;的博客上看到了&lt;a href=&quot;http://www.blogjava.net/bluedavy&quot;&gt;BlueDavy&lt;/a&gt;的提问， Peter回答说SCA和OSGI很多概念很相似，二者是天作之合（原话是match made in heaven），。但是毕竟SCA和OSGI所关注的方面不太相同。一个是关注于语言无关的企业应用集成，一个更关注于运行环境中组件和服务的动态更新特性。&lt;/div&gt;
&lt;div style=&quot;TEXT-INDENT: 21pt; LINE-HEIGHT: 150%&quot;&gt;在SCA规范正式版发布之前，总感觉缺少SCA容器打包部署方面的描述。终于在1.0版中看到了将打包部署作为了单独的一个章节列了出来。OSGI的Bundle可以将可以在SCA容器中部署。但对于OSGI的更进一步描述，在规范中也是闪烁其词。&lt;/div&gt;
&lt;div style=&quot;TEXT-INDENT: 21pt; LINE-HEIGHT: 150%&quot;&gt;时过半年，SCA、OSGI走向联合的趋势越来越明朗。可以看到在OSOA的SCA Assembly Model 1.0规范已经提到了将OSGI作为SCA的一种部署模式的参考实现。并且发布了&lt;a href=&quot;http://www.osoa.org/download/attachments/250/Power_Combination_SCA_Spring_OSGi.pdf?version=3&quot;&gt;Powerful Combination of SCA, Spring, and OSGi&lt;/a&gt; 的白皮书。白皮书中给出了SCA、Spring、OSGI如何在一起工作的概览。&lt;/div&gt;
&lt;div style=&quot;LINE-HEIGHT: 150%&quot;&gt;&lt;span&gt;OSGI&lt;/span&gt;联盟在2005年8月发布的R4规范，已经对组件和服务的部署、运行作了比较详细的描述，具体可参见&lt;a href=&quot;http://www.osgi.org/osgi_technology/download_specs.asp?section=2#Release4&quot;&gt;Declarative Services&lt;/a&gt;规范。从部署描述符的格式上看，同SCA的元信息格式非常的相似，估计多半SCA规范在制定时参照了OSGI中的一些内容。&lt;/div&gt;
&lt;div style=&quot;LINE-HEIGHT: 150%&quot;&gt;&lt;span&gt;Eclipse Con 2007&lt;/span&gt;中有不少关于OSGI方面的专题，&lt;a href=&quot;http://www.eclipsecon.org/2007/index.php?page=sub/&amp;amp;id=3702&quot;&gt;How to tackle the problems of large scale applications in OSGi&lt;/a&gt;专题的最后也提到了OSGI与SCA的结合。 SCA容器在OSGI容器中运行，SCA容器实现为OSGI的一个Bundle。SCA Bundle需要实现服务与引用的绑定，同时可以考虑使用Declarative Services。&lt;/div&gt;
&lt;div style=&quot;LINE-HEIGHT: 150%&quot;&gt;&lt;/div&gt;
&lt;img height=&quot;292&quot; width=&quot;520&quot; alt=&quot;&quot; src=&quot;http://gocom.primeton.com/blog/resserver.php?blogId=14&amp;amp;resource=osgi-sca.JPG&amp;amp;mode=medium&quot; /&gt;
&lt;div style=&quot;TEXT-INDENT: 21pt; LINE-HEIGHT: 150%&quot;&gt;从技术的角度看，SCA和OSGI有很多的相似，同时又有很多方面可以互补。SCA容器中的组件要求在运行时刻是隔离的，具体体现在Java实现中，要求不同的Composite具有不同的ClassLoader，这正是OSGI的强项，同时，对于服务的管理、动态更新等特性，SCA容器应该也是需要的。但是，OSGI也有其局限性，它只是一个Java平台之上的框架，而SCA需要面对的是多语言、多实现的集成应用环境。因此二者如何更好的结合，还需要在实践中不断的摸索。也期望SCA、OSGI能够修成正果。&lt;span&gt; &lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;TEXT-INDENT: 21pt; LINE-HEIGHT: 150%&quot;&gt;Ps:如果要给SCA、OSGI分个公母的话，感觉应该OSGI更象个女的，而且是体贴贤惠的女人，SCA相对粗旷、大气一些，同时SCA是比OSGI小六七岁的小弟弟。这年头流行姐弟恋啊！！！两人腻腻歪歪一两年，也该确定关系了。&lt;/div&gt; &lt;br/&gt; 
   </description>
   <link>http://gocom.primeton.com/blog/index.php?op=ViewArticle&amp;articleId=1425&amp;blogId=14</link>
   <comments>http://gocom.primeton.com/blog/index.php?op=ViewArticle&amp;articleId=1425&amp;blogId=14</comments>
   <guid>http://gocom.primeton.com/blog/index.php?op=ViewArticle&amp;articleId=1425&amp;blogId=14</guid>
      <dc:creator>yanfei</dc:creator>
      
    <category>乱弹</category>
         <pubDate>Fri, 28 Sep 2007 10:09:27</pubDate>
   <source url="http://gocom.primeton.com/blog/rss.php?blogId=14&amp;profile=rss20">三十乱弹</source>
     </item>
   </channel>
</rss>
