2013-10-02 81 views
0

我想在我的OSGi容器中添加一個BundleWatcher鉤子,以便可以在加載時監視束。我曾在config.ini文件中進行以下更改,添加Equinox OSGI鉤投擲ClassNotFoundException

  1. 添加到我的osgi.bundles財產像這樣, osgi.bundles =,參考\罐子的引用:文件\:../ LIB/[email protected]:啓動

  2. 設置屬性osgi.framework.extensions = mybundle

  3. 添加MyBundleWatcher爲鉤osgi.hook.configurators.include

另外我的jar文件和OSGi包在同一個目錄下。

當我運行我的應用程序時,我的BundleWatcher出現ClassNotFoundException異常。

但是我可以確認,我的包(其中包含BundleWatcher)確實是在調用我的包中激活器的啓動方法時啓動的。

我在做什麼錯?

這裏作爲背景有一對夫婦的文章中,我緊隨其後,

http://wiki.eclipse.org/index.php/Adaptor_Hooks

http://eclipsesource.com/blogs/2013/01/23/how-to-track-lifecycle-changes-of-osgi-bundles/

回答

1

爲什麼你會使用春分具體BundleWatcher - 這需要對Equinox的內部和配置特殊訪問 - 與OSGi標準BundleTracker,它可以通過任何捆綁包實現,並可用於任何框架實現?

+0

我在我的情況,我猜確定使用某些特定的equinox。我的目標是首先啓動我的插件,以便監控其他插件的加載情況。 BundleTracker似乎無法做到這一點BundleWatcher可以。 –

+0

這不是事實。 BundleTracker會收到關於它感興趣的所有捆綁包的狀態的通知,包括在它之前開始的那些和在它之後開始的那些捆綁包。使用Equinox特定的BundleWatcher有沒有**優點。 –

1

你似乎想要讓它變得複雜。你把它作爲擴展(就像設備驅動程序)並使用專有代碼。如果您想要查看所有捆綁軟件,可能有一些原因,但是當您重新啓動時,無論如何您都不會看到已安裝捆綁軟件的安裝事件。所以,如果你可以只看到所有的包,因爲他們活了過來,然後迄今爲止最簡單的解決方案來跟蹤哪些捆綁產品得到安裝生活是:

package tracker; 
public class Watch implements BundleActivator { 
    BundleTracker<Bundle> tracker; 

    public void start(BundleContext context) { 
    tracker = new BundleTracker<Bundle>(context, -1, null) { 
     public Bundle addingBundle(Bundle b, BundleEvent e) { 
      System.out.println("Tracking bundle " + b.getSymbolicName()); 
      return b; 
     } 
    }; 
    tracker.open(); 
    } 

    public void stop(BundleContext context) {} 
} 

清單:

Bundle-Activator: tracker.Watch 
+0

我確實希望能夠監視每個包的加載情況。 –

+1

然後你需要控制OSGi啓動器。在框架啓動之前安裝BundleListener或BundleTracker。正如Peter所說,你仍然不會獲得上次運行框架時安裝的bundle的安裝事件。也許如果你給了你想要的動機 - 而不是僅僅堅持你想要的 - 那麼可以找到一個好的解決方案。 –

+0

你必須有一個非常重要的理由來解決這個複雜問題。你能解釋爲什麼你需要看到事情發生時(無論如何,這通常是一個紅鯡魚)? –