Java 使用OSGi将JMenuItems附加到GUI

Java 使用OSGi将JMenuItems附加到GUI,java,swing,osgi,apache-felix,Java,Swing,Osgi,Apache Felix,我已经创建了一个应用程序,现在我想让它准备好一个插件。我已经决定使用ApacheFelix,在阅读了教程之后,我不确定这是否是我想要的选择 我想更改我的应用程序,以便它在开始时从/plugins文件夹加载捆绑包,并将每个捆绑包作为JMenuItem添加到JMenu。我本可以使用ClassLoader来完成,但我认为OSGi正是我想要的,但后来我遇到了一些问题: OSGi有一个命令行,但我需要在我的应用程序中实现它,不需要任何用户交互,在代码中硬编码它的默认行为 Bundle在开始时调用的Bun

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

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

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

  • Bundle在开始时调用的Bundle(
    start()
    stop()
    方法继承自
    org.osgi.framework.BundleActivator
    )有一些行为,但实际上我希望我的应用程序使用Bundle做一些事情,而不是使用Bundle来使用应用程序做一些事情

所以,您能告诉我,是否可以使用OSGi(等ApacheFelix)实现它,还是应该使用ClassLoader实现它,然后显式地将.jar插件的主类转换为JMenuItem并将其添加到我的JMenu中(更糟糕的是,因为它不支持应用程序的动态更改,也没有给我学习OSGi的机会)


编辑:我在想:,但我找不到任何教程。

为什么要为视图中存在的每个捆绑包创建菜单项?这真的没有道理

您可以创建GUI应用程序,然后在start()方法中持久化上下文,然后使用该上下文查询系统中所有捆绑包的列表。您可能希望在显示菜单时按需执行此操作(因此您可以看到当前列表)

然而,你真的在往错误的方向想。您要做的是查找/services/。当服务进入时,您使用该服务填充菜单项。这样,每个bundle可以有多个服务,并且这些服务可以有某种形式的交互

Neil Bartlett和我自己就基于Swing的应用程序(尽管使用注册的动作对象)的这种方法进行了讨论。演示和演示仍可从以下位置获得:


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

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

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

但是,您的想法确实是错误的。您要做的是查找/services/。当服务出现时,您可以使用该服务填充菜单项。这样,每个捆绑包可以有多个服务,这些服务可以进行某种形式的交互

Neil Bartlett和我就基于Swing的应用程序的这种方法做了一次演讲(尽管使用了注册的动作对象)。演示和演示仍然可以从以下位置获得:


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

+1到Alex的答案。为了解决原始问题中的更多问题,OSGi中的命令行是完全可选的,如果您不想要它,就不要使用它。BundleActivators也是完全可选的。最后,您要使用的设计原语是一个OSGi服务。请阅读!正如Alex所说,在菜单中添加捆绑包是没有意义的(当你点击它时会发生什么?)我对这个页面有问题,链接正在运行,你在其他地方有这些资料吗?请在我加载它时再试一次。很抱歉,我回复得这么晚。它运行得很好,但我不想使用Knoplerfish的控制台。我希望所有这些都嵌入到我的应用程序中,所以当你运行应用程序时(最可能是作为.jar文件)OSGi控制台没有显示。但是我结巴了,因为所有的示例都显示了使用OSGi Destop的工作包,而不是什么都没有显示。没有任何东西强迫你使用Knopflerfish的控制台,我不知道你为什么会这样认为。Alex的答案+1。为了解决原始问题中的更多问题,逗号OSGi中的d行是完全可选的,如果您不想要它,就不要使用它。BundleActivators也是完全可选的。最后,您想要使用的设计原语是OSGi服务。请阅读它们!正如Alex所说,在菜单中添加一个bundle是没有意义的(当您单击它时会发生什么?)我对这个页面有问题,链接正在运行,你在其他地方有这些资料吗?请在我加载它时再试一次。很抱歉,我回复得这么晚。它运行得很好,但我不想使用Knoplerfish的控制台。我希望所有这些都嵌入到我的应用程序中,所以当你运行应用程序时(最可能是作为.jar文件)OSGi控制台没有显示。但我有点结巴,因为所有的示例都显示了使用OSGi Destop的工作包,而不是什么都没有显示。没有任何东西强迫您使用Knopflerfish的控制台,我不知道您为什么会这样认为。