0

我已经创建了一个应用程序,现在我希望它准备好一个插件。我决定使用 Apache Felix,在阅读了教程之后,我不确定这是否是我想要的选择。

我想更改我的应用程序,以便它在 /plugins 文件夹的开头 Bundles 加载,并将每个 Bundle 作为 JMenuItem 添加到 JMenu。我本可以使用 ClassLoader 完成它,但我认为 OSGi 正是我想要的,但后来我遇到了一些问题:

  • OSGi 有一个命令行,但我需要在我的应用程序中实现它,无需任何用户交互,在代码中硬编码其默认行为。

  • Bundle 在开始时调用的 Bundle (start()以及从 Bundlestop()继承的方法org.osgi.framework.BundleActivator)的行为,但我实际上希望我的应用程序对 Bundle 执行某些操作,而不是使用 Bundle 对应用程序执行某些操作。

那么你能告诉我,是否可以使用 OSGi(等 Apache Felix)来实现它,或者我应该使用 ClassLoader 实现它,然后将 .jar 插件的 Main Class 显式转换为 JMenuItem 并将其添加到我的 JMenu 中(更糟糕的是,因为它不支持应用程序的动态变化,也不给我学习OSGi的机会)。

编辑:我正在考虑类似: http: //karussell.wordpress.com/2009/09/16/plugable-swing-a-hello-world-osgi-example/,但我找不到任何教程。

4

1 回答 1

3

为什么要为视图中存在的每个包创建一个菜单项?这真的没有意义。

您/可以/通过创建您的 GUI 应用程序来做到这一点,然后在 start() 方法中,保留上下文,然后使用它来查询系统中所有捆绑包的列表。您可能希望在显示菜单时按需执行此操作(因此您会看到当前列表)。

然而,你真的想错了方向。你要做的是寻找/services/。当服务进入时,您使用该服务来填充您的菜单项。这样,您可以在每个捆绑包中拥有多个服务,并且这些服务可以进行某种形式的交互。

Neil Bartlett 和我本人针对基于 Swing 的应用程序(尽管使用已注册的 Action 对象)就这种方法进行了一次谈话。演示和演示仍然可以从这个位置获得:

http://www.eclipsezone.com/files/jsig/

请注意,这是在 OSGi v4 时完成的,因此您可能会发现安装失败,导入框架的版本不匹配。如果是这样,请破解打开文件并确保它没有说明Import-Package: org.osgi.framework;version="[1.3.0,1.4.0)"或类似的内容 - 去掉版本号,它今天应该仍然可以正常运行。

于 2011-11-28T19:59:06.673 回答