簡體   English   中英

在桌面獨立應用程序中使用 OSGi

[英]Using OSGi in a desktop standalone application

我正在嘗試編寫一個基於 OSGi 的桌面應用程序。 我有一個 Swing JFrame,我想添加添加模塊(其他包)的可能性。 在 JSig 教程中介紹了 EclipseZone OSGi ,但每個應用程序都是從 OSGi 框架(在本例中為 Knopflerfish OSGi 桌面)啟動的。

所以我的問題是,是否可以選擇在沒有可見 OSGi 框架的情況下啟動應用程序? 我知道,從代碼中,可以更改包的屬性,但是如何以這種方式更改框架的屬性? (例如默認包存儲位置,包在位置時的默認操作等?)

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 中運行良好,但我希望它在沒有它的情況下運行。

您的代碼基本上沒問題,但聽起來您想要更多地控制 OSGi 框架本身。 換句話說,您想知道如何啟動 OSGi 框架並啟動您的包。 您當前遇到的問題是您正在使用其他人的啟動器(Knopflerfish 啟動器),其中包括 KF GUI 控制台,並且您正在使用它來安裝和啟動您的包。 然而,這些都不是必需的。

在 AValchev 的回答中,他談到使用java -jar org.eclipse.osgi.jar -console啟動 Equinox。 這種方法的問題在於它為您提供了一個空的OSGi 框架,因此您必須在 OSGi shell 中鍵入命令才能安裝和啟動您的包……也不理想!

我認為您應該編寫自己的啟動器。 這實際上非常簡單,並且可以以完全獨立於任何特定 OSGi 框架實現的方式來完成。 不久前,我在一篇博客文章中寫到了這一點。

在偽代碼中,您的啟動器應用程序應如下所示:

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方法的 Map 中設置Constants.FRAMEWORK_STORAGE屬性來完成。

如果您想使用 Swing 組件,您根本不需要 Knopflerfish OSGi Desktop。 只需下載 EclipseRT Starter Kit 並將您的插件放在那里。

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

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

使用此命令,您已經啟動了 equinox,並且可以從控制台安裝您的包。

你可以在這里找到很好的教程

在您的情況下,只需將 JFrame 初始化放在 start() 方法中:

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

Eclipse RCP 是編寫應用程序客戶端的不錯選擇。 它完全基於 OSGi,並為 UI 編程提供了豐富的工具集。 Eclipse 還提供了構建它們的開發環境。

構建完成后,您將擁有一個恰好基於 OSGi 的獨立應用程序,但無需與 OSGi 交互即可運行,我相信您正在努力實現這一目標。

Eclipse RCP 教程

我不確定您究竟想要做什么,但如果您正在尋找一種模塊化方式來編寫 Swing 應用程序,那么請查看 NetBeans 平台。 核心模塊系統不是 OSGi,但如果需要,它可以與 OSGi 模塊“對話”。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM