首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在桌面独立应用程序中使用OSGi

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

Stack Overflow用户
提问于 2011-12-15 18:46:34
回答 4查看 6.2K关注 0票数 6

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

所以我的问题是,是否有一个选项来启动应用程序而不显示OSGi框架?我知道,从代码中可以更改包的属性,但是如何以这种方式更改框架的属性呢?(例如,默认捆绑包存储位置、捆绑包在位置时的默认操作等?)

代码语言:javascript
复制
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桌面上工作得很好,但我想让它在没有它的情况下运行。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-12-16 02:55:29

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

在AValchev的回答中,他谈到了与java -jar org.eclipse.osgi.jar -console一起启动Equinox。这种方法的问题是它提供了一个空的OSGi框架,因此您必须在OSGi外壳中键入命令才能安装和启动您的包……也不是很理想!

我认为你应该写你自己的启动器。这实际上非常简单,并且可以通过完全独立于任何特定OSGi框架实现的方式来完成。不久前,我在一篇blog post中写到了这一点。

在伪代码中,您的启动器应用程序应该如下所示:

代码语言:javascript
复制
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属性来完成。

票数 13
EN

Stack Overflow用户

发布于 2011-12-15 19:15:10

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

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

代码语言:javascript
复制
java -jar org.eclipse.osgi.jar -console

使用这个命令,您已经启动了equinox,并且可以从控制台安装您的包。

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

在您的例子中,只需将JFrame初始化放在start()方法中:

代码语言:javascript
复制
@Override
public void start(BundleContext context) throws Exception {
    JFrame jf = new JFrame();
    .....
}
票数 1
EN

Stack Overflow用户

发布于 2011-12-16 00:20:43

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

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

Eclipse RCP Tutorial

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8518837

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档