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

标签 java swing osgi

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

最佳答案

您的代码基本上没问题,但听起来您想对 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.
    
}

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

关于java - 在桌面独立应用程序中使用 OSGi,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8518837/

相关文章:

java - 调整窗口大小时使用面板中设置的图标调整 JLabel 的大小

Eclipse RCP - 所有的 jar /包如何交互?

java - 如何生成另一个 main()?

java - 只想创建一次对象

Java API : Cross-site JSESSIONID is not maintained between requests

java - 带有复选框问题的 JTable - 运行时未创建表

java - 如何构建服务以及如何在 CQ5 中激活服务

java - OSGi ClassNotFoundException 异常

java - 在 Windows 中为 Ruby 和 RUN 设置 JAVA_HOME 环境变量

java - 从 netty 服务器读取时,不同的响应消息正在合并