2011-12-15 83 views
6

我正在嘗試編寫基於OSGi的桌面應用程序。我有一個Swing JFrame,我想添加添加模塊(其他包)的可能性。我走過了EclipseZone OSGi at JSig tutorial,但每個應用程序都是從OSGi Framework開始的(在這種情況下,是Knopflerfish OSGi Desktop)。在桌面獨立應用程序中使用OSGi

所以我的問題是,是否有啓動時不可見的OSGi框架的應用程序的選項?我知道,從代碼中可以改變bundle的屬性,但是如何改變框架的屬性呢? (例如,默認捆綁的存儲位置,默認的行動時,束在位置等等?)

public class MainFrame extends ServiceTracker implements BundleActivator { 

    public MainFrame(BundleContext context, JToolBar toolBar) { 
     // select, which services is the bundle tracking 
     super(context, JMenu.class.getName(), null); 
    } 

    @Override 
    public void start(BundleContext context) throws Exception { 
     //display a JFrame 
    } 

    @Override 
    public void stop(BundleContext context) throws Exception { 
     //hide a JFrame 
    } 

    @Override 
    public Object addingService(ServiceReference reference) { 
     // Process a Service and return a JMenu 
     return new JMenu(); 
    } 

    @Override 
    public void removedService(ServiceReference reference, Object service) { 
     // remove a JMenu from a JFrame 
    } 

    public static void main(String[] args) { 
     // ???????????????????????????????????????????? 
     // ???????????????????????????????????????????? 
    } 
} 

我上面寫的(我已經張貼只是一個草圖)一類,但我不知道,什麼在main()函數中寫入。這個包在Knopflerfish OSGi Desktop中工作正常,但我希望它在沒有它的情況下運行。

回答

12

您的代碼基本上是好的,但它聽起來像你想在OSGi框架本身更多的控制。換句話說,你想知道如何啓動一個OSGi框架並啓動你的包。您目前遇到的問題是您正在使用包含KF GUI控制檯的其他人的啓動器(Knopflerfish啓動器),並且您正在使用它來安裝並啓動您的軟件包。然而,沒有必要。

在AValchev的回答,他談到與java -jar org.eclipse.osgi.jar -console開始春分。這種方法的麻煩在於它給了你一個空的 OSGi框架,所以你將不得不在OSGi shell中輸入命令來安裝並啓動你的軟件包...也不是很理想!

我認爲你應該寫自己的發射器。這實際上非常簡單,可以以完全獨立於任何特定OSGi框架實現的方式完成。前一段時間我在blog post中寫過這個。

在僞代碼,你啓動應用程序應該是這個樣子:

public static void main() { 

    1. get a FrameworkFactory using java.util.ServiceLoader. 
    2. create an OSGi framework using the FrameworkFactory 
    3. start the OSGi framework 
    4. Install your bundle(s). 
    5. Start all the bundles you installed. 
    6. Wait for the OSGi framework to shutdown. 

} 

在你的問題,你問具體設置捆收納位置。這可以通過設置FrameworkFactory.newFramework方法中映射中的Constants.FRAMEWORK_STORAGE屬性來完成。

+0

謝謝!博客帖子本身實際上解決了它。 – Benjamin 2011-12-21 05:17:13

1

如果你想使用Swing組件不需要Knopflerfish OSGi的桌面可言。只需下載EclipseRT入門工具包並將您的插件放到那裏。

使用OSGi的另一個非常簡單的方法是:

java -jar org.eclipse.osgi.jar -console 

用這個命令你已經開始春分,你可以從控制檯安裝你的包。

你可以找到很好的教程here

在你的情況只是把JFrame的initalzation在start()方法:

@Override 
public void start(BundleContext context) throws Exception { 
    JFrame jf = new JFrame(); 
    ..... 
} 
-2

我不知道正是你想做的事,但如果你正在尋找一種模塊化的方式來編寫Swing應用程序,然後看看NetBeans平臺。核心模塊系統不是OSGi,但可以根據需要與OSGi模塊進行「通話」。

1

Eclipse RCP是編寫應用程序客戶端的一個很好的選擇。它完全基於OSGi,併爲UI編程提供了豐富的工具。 Eclipse還提供了構建它們的開發環境。

一旦建成,你將有一個獨立的應用程序,它恰好是基於OSGi,但需要使用OSGi沒有交互運行,這是什麼,我相信你所要完成。

Eclipse RCP Tutorial