我已经创建了一个应用程序,现在我想让它准备好一个插件。我决定使用Apache Felix,在阅读完教程后,我不确定,这是否是我想要的选择。
我想更改我的应用程序,以便它从/ plugins文件夹的开头加载,并将每个Bundle作为JMenuItem添加到JMenu。我本可以使用ClassLoader完成它,但我认为OSGi正是我想要的,但后来我遇到了一些问题:
OSGi有一个命令行,但是我需要在我的应用程序中实现它,没有任何用户交互,硬编码代码中的默认行为。
Bundle(从start()
继承的stop()
和org.osgi.framework.BundleActivator
方法)的行为是Bundle在开始时调用的,但我实际上想要我的应用程序,做一些事情使用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/,但我找不到任何教程。答案 0 :(得分: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)"
或其他类似文件 - 删除版本号,它今天仍然可以正常运行。