<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/css" href="/stylesheets/rss.css"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">
  <channel>
    <title>Extreme Pattern: config.ini and org.eclipse.osgi</title>
    <link>http://blog.extremepattern.com/articles/2006/12/18/config-ini-and-org-eclipse-osgi</link>
    <language>en-us</language>
    <ttl>40</ttl>
    <description>enjoy</description>
    <item>
      <title>config.ini and org.eclipse.osgi</title>
      <description>&lt;h3&gt;源起&lt;/h3&gt;


	&lt;p&gt;在 eclipse &lt;span class="caps"&gt;PDE&lt;/span&gt; 測試  bundle 很方便，實際部署一堆 bundle 時候，執行的情況要如何調整。&lt;/p&gt;


	&lt;h3&gt;參考&lt;/h3&gt;


	&lt;ol&gt;
	&lt;li&gt;&lt;a href="http://www.eclipse.org/equinox/documents/quickstart.php"&gt;Equinox QuickStart&lt;/a&gt;&lt;/li&gt;
		&lt;li&gt;&lt;a href="http://wiki.eclipse.org/index.php/Lazy_Start_Bundles"&gt;Lazy Start Bundles&lt;/a&gt;&lt;/li&gt;
		&lt;li&gt;&lt;a href="http://wiki.eclipse.org/index.php/Equinox_Launcher"&gt;Equinox Launcher&lt;/a&gt;&lt;/li&gt;
	&lt;/ol&gt;


	&lt;h3&gt;部署&lt;/h3&gt;


	&lt;p&gt;一開始是採用 org.eclipse.update.configurator 部署的的自動安裝方式，這個 bundle 啟動後會自動安裝 plugins 目錄下的 bundle，但是並不會啟動這些 bundle，這種部署佈局方式如下。&lt;/p&gt;


&lt;pre&gt;
somedir/
  org.eclipse.osgi_3.3.0.v20061101.jar
  org.eclipse.update.configurator_3.2.0.v20092006-1400.jar
  org.eclipse.equinox.common_3.3.0.v20061023.jar
  plugins/  
    B1.jar
    B2.jar
  configuration/
    config.ini
&lt;/pre&gt;

	&lt;p&gt;config.ini 的內容如下，不管後來安裝 B3,B4,B5,X2 等新功能，都不需要
改 config.ini 的內容。&lt;/p&gt;


&lt;pre&gt;
osgi.bundles=org.eclipse.equinox.common@2:start, 
  org.eclipse.update.configurator@3:start
eclipse.ignoreApp=true
&lt;/pre&gt;

	&lt;p&gt;下面是 eclipse 3.2 sdk 的 config.ini，即使用到數十個 bundle，
也是只要寫三個 bundle 啟動即可。&lt;/p&gt;


&lt;pre&gt;
osgi.bundles=org.eclipse.equinox.common@2:start, 
  org.eclipse.update.configurator@3:start,
  org.eclipse.core.runtime@start
&lt;/pre&gt;

	&lt;p&gt;加 -console 輸出下面內容。&lt;/p&gt;


&lt;pre&gt;
osgi&amp;gt; ss

Framework is launched.

id      State       Bundle
0       ACTIVE      system.bundle_3.3.0.v20061101
1       ACTIVE      org.eclipse.equinox.common_3.3.0.v20061023
2       ACTIVE      org.eclipse.update.configurator_3.2.0.v20092006-1400
3       RESOLVED    B1_1.0.0
4       RESOLVED    B2_1.1.0
&lt;/pre&gt;

	&lt;p&gt;可以發現 B1/B2 不會自行啟動。&lt;/p&gt;


	&lt;h3&gt;config.ini 注意事項&lt;/h3&gt;


	&lt;ol&gt;
	&lt;li&gt;啟動的檔名很重要，xx@2:start 必須有個 xx-1.2.3.jar 出現，注意如果是 xx_1.2.3.jar 的寫法並不支援。&lt;/li&gt;
		&lt;li&gt;非 eclipse 要加個 eclipse.ignoreApp=true 來啟動。&lt;/li&gt;
	&lt;/ol&gt;


	&lt;h3&gt;LazyStart&lt;/h3&gt;


	&lt;p&gt;因為 org.eclipse.update.configurator 只安裝，並不會自動啟動，
可以使用 Eclipse-LazyStart Header 的做法，這樣會讓每個 bundle 被
存取時自動啟動。&lt;/p&gt;


&lt;pre&gt;
Equinox Framework version 3.2
Eclipse-LazyStart: true; exceptions="org.eclipse.foo1" 

或是 Equinox Framework version 3.3
Bundle-ActivationPolicy: lazy
&lt;/pre&gt;

	&lt;p&gt;但是前提是這些 bundle 有設計這些 header，像是之前做好的一些 bundle 並
不一定有支援這類啟動，這時候需要類似 eclipse sdk 用的 org.eclipse.core.runtime
方式，加一個 runtime 的 bundle 來手動啟動沒有加上 LazyStart 的 bundle。&lt;/p&gt;


	&lt;h3&gt;haha.core.runtime&lt;/h3&gt;


	&lt;p&gt;改由一個新的 haha.core.runtime 統管執行時期的一些調整，
讓讀取的 bundle 可以自動啟動執行。&lt;/p&gt;


&lt;pre&gt;
public class Activator implements BundleActivator {
  public void start(BundleContext context) throws Exception {
    Bundle[] bundles = context.getBundles();
    for(Bundle bundle : bundles){
      if(bundle.getState() == Bundle.RESOLVED){                
        bundle.start();
      }
    }
}
&lt;/pre&gt;

	&lt;p&gt;不過上面是一網打盡的做法，會讓加上 Lazy Start 的也執行啟動，
等於枉費 Lazy Start 的設計用意。&lt;/p&gt;


	&lt;p&gt;config.ini 內容 :&lt;/p&gt;


&lt;pre&gt;
osgi.bundles=org.eclipse.equinox.common@2:start, 
  org.eclipse.update.configurator@3:start, 
  haha.core.runtime@start
eclipse.ignoreApp=true
&lt;/pre&gt;

	&lt;h3&gt;用 Equinox Launcher&lt;/h3&gt;


	&lt;p&gt;下載 launchers-win32.win32.x86.3.3M3.zip 來測試，解開後有下面內容。&lt;/p&gt;


&lt;pre&gt;
root/
  eclipse.exe
  epl-v10.html
  notice.html
  startup.jar
  configuration/
    config.ini
&lt;/pre&gt;

	&lt;p&gt;輸出時只要將需要的 jar 放到 plugins 目錄中就可以跑了，
不過這類輸出需要特定平台。&lt;/p&gt;


	&lt;h3&gt;觀察&lt;/h3&gt;


	&lt;ol&gt;
	&lt;li&gt;使用 org.eclipse.update.configurator 可以支援讓之前沒寫進 config.ini，
後來加入的 bundle 可以得到啟動。&lt;/li&gt;
		&lt;li&gt;Eclipse-LazyStart 可能以後會因為變成標準而改用 Bundle-ActivationPolicy。&lt;/li&gt;
	&lt;/ol&gt;</description>
      <pubDate>Mon, 18 Dec 2006 22:48:00 -0800</pubDate>
      <guid isPermaLink="false">urn:uuid:eb449efa-282f-4b8e-9d00-f4555b7a94aa</guid>
      <author>LIN</author>
      <link>http://blog.extremepattern.com/articles/2006/12/18/config-ini-and-org-eclipse-osgi</link>
      <category>java</category>
    </item>
  </channel>
</rss>
