在桌面独立应用程序中使用OSGi

时间:2011-12-15 10:46:34

标签: java swing osgi

我正在尝试编写基于OSGi的桌面应用程序。我有一个Swing JFrame,我想添加添加模块(其他包)的可能性。我走过EclipseZone OSGi at JSig tutorial,但每个应用程序都是从OSGi Framework(在本例中为Knopflerfish OSGi Desktop)启动的。

所以我的问题是,是否有一个选项可以在没有可见的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中运行良好,但我希望它在没有它的情况下运行。

4 个答案:

答案 0 :(得分:13)

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

在AValchev的回答中,他谈到了用java -jar org.eclipse.osgi.jar -console启动Equinox。这种方法的问题在于它为您提供了一个空的 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.

}

在您的问题中,您特别询问有关设置捆绑存储位置的信息。这可以通过在传递给Constants.FRAMEWORK_STORAGE方法的地图中设置FrameworkFactory.newFramework属性来完成。

答案 1 :(得分:1)

如果您想使用Swing组件,则根本不需要Knopflerfish OSGi Desktop。只需下载EclipseRT入门套件并将插件放在那里。

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

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

使用此命令启动了equinox,您可以从控制台安装捆绑包。

你可以找到非常好的教程here

在你的情况下,只需在start()方法中放入JFrame初始化:

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

答案 2 :(得分:1)

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

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

Eclipse RCP Tutorial

答案 3 :(得分:-2)

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