2011-12-15 70 views
6

我正在尝试编写基于OSGi的桌面应用程序。我有一个Swing JFrame,我想添加添加模块(其他包)的可能性。我走过了EclipseZone OSGi at JSig tutorial,但每个应用程序都是从OSGi Framework开始的(在这种情况下,是Knopflerfish OSGi Desktop)。在桌面独立应用程序中使用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中工作正常,但我希望它在没有它的情况下运行。

回答

12

您的代码基本上是好的,但它听起来像你想在OSGi框架本身更多的控制。换句话说,你想知道如何启动一个OSGi框架并启动你的包。您目前遇到的问题是您正在使用包含KF GUI控制台的其他人的启动器(Knopflerfish启动器),并且您正在使用它来安装并启动您的软件包。然而,没有必要。

在AValchev的回答,他谈到与java -jar org.eclipse.osgi.jar -console开始春分。这种方法的麻烦在于它给了你一个空的 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方法中映射中的Constants.FRAMEWORK_STORAGE属性来完成。

+0

谢谢!博客帖子本身实际上解决了它。 – Benjamin 2011-12-21 05:17:13

1

如果你想使用Swing组件不需要Knopflerfish OSGi的桌面可言。只需下载EclipseRT入门工具包并将您的插件放到那里。

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

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

用这个命令你已经开始春分,你可以从控制台安装你的包。

你可以找到很好的教程here

在你的情况只是把JFrame的initalzation在start()方法:

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

我不知道正是你想做的事,但如果你正在寻找一种模块化的方式来编写Swing应用程序,然后看看NetBeans平台。核心模块系统不是OSGi,但可以根据需要与OSGi模块进行“通话”。

1

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

一旦建成,你将有一个独立的应用程序,它恰好是基于OSGi,但需要使用OSGi没有交互运行,这是什么,我相信你所要完成。

Eclipse RCP Tutorial