【问题标题】:Using OSGi in a desktop standalone application在桌面独立应用程序中使用 OSGi
【发布时间】:2011-12-15 10:46:34
【问题描述】:

我正在尝试编写一个基于 OSGi 的桌面应用程序。我有一个 Swing JFrame,我想增加添加模块(其他包)的可能性。我浏览了EclipseZone OSGi at JSig tutorial,但每个应用程序都是从 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 桌面上运行良好,但我希望它在没有它的情况下运行。

【问题讨论】:

    标签: java swing osgi


    【解决方案1】:

    您的代码基本上没问题,但听起来您想要更多地控制 OSGi 框架本身。换句话说,您想知道如何启动一个 OSGi 框架并启动您的包。您当前遇到的问题是您正在使用其他人的启动器(Knopflerfish 之一),其中包括 KF GUI 控制台,并且您正在使用它来安装和启动您的捆绑软件。然而,这些都不是必需的。

    在 AValchev 的回答中,他谈到了使用 java -jar org.eclipse.osgi.jar -console 启动 Equinox。这种方法的问题在于它为您提供了一个 empty 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 方法的 Map 中设置 Constants.FRAMEWORK_STORAGE 属性来完成。

    【讨论】:

    • 博文链接已损坏。
    【解决方案2】:

    如果您想使用 Swing 组件,则根本不需要 Knopflerfish OSGi 桌面。只需下载 EclipseRT Starter Kit 并将您的插件放在那里。

    另一个非常简单的使用 OSGi 的方法是:

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

    使用此命令,您已经启动了 Equinox,您可以从控制台安装您的包。

    你可以找到很好的教程here

    在你的情况下,只需将 JFrame initalzation 放在 start() 方法中:

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

    【讨论】:

      【解决方案3】:

      Eclipse RCP 是编写应用程序客户端的好选择。它完全基于 OSGi,并为 UI 编程提供了丰富的工具集。 Eclipse 还提供了用于构建它们的开发环境。

      一旦构建,您将拥有一个恰好基于 OSGi 的独立应用程序,但不需要与 OSGi 交互即可运行,我相信这正是您正在努力实现的目标。

      Eclipse RCP Tutorial

      【讨论】:

        【解决方案4】:

        我不确定您到底想做什么,但是如果您正在寻找一种模块化的方式来编写 Swing 应用程序,那么请查看 NetBeans 平台。核心模块系统不是 OSGi,但如果需要,它可以与 OSGi 模块“对话”。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2019-04-18
          • 1970-01-01
          • 2012-11-01
          • 2016-11-20
          • 2014-06-22
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多