Java 使用OSGi将JMenuItems附加到GUI
我已经创建了一个应用程序,现在我想让它准备好一个插件。我已经决定使用ApacheFelix,在阅读了教程之后,我不确定这是否是我想要的选择 我想更改我的应用程序,以便它在开始时从/plugins文件夹加载捆绑包,并将每个捆绑包作为JMenuItem添加到JMenu。我本可以使用ClassLoader来完成,但我认为OSGi正是我想要的,但后来我遇到了一些问题:Java 使用OSGi将JMenuItems附加到GUI,java,swing,osgi,apache-felix,Java,Swing,Osgi,Apache Felix,我已经创建了一个应用程序,现在我想让它准备好一个插件。我已经决定使用ApacheFelix,在阅读了教程之后,我不确定这是否是我想要的选择 我想更改我的应用程序,以便它在开始时从/plugins文件夹加载捆绑包,并将每个捆绑包作为JMenuItem添加到JMenu。我本可以使用ClassLoader来完成,但我认为OSGi正是我想要的,但后来我遇到了一些问题: OSGi有一个命令行,但我需要在我的应用程序中实现它,不需要任何用户交互,在代码中硬编码它的默认行为 Bundle在开始时调用的Bun
- OSGi有一个命令行,但我需要在我的应用程序中实现它,不需要任何用户交互,在代码中硬编码它的默认行为
- Bundle在开始时调用的Bundle(
和start()
方法继承自stop()
)有一些行为,但实际上我希望我的应用程序使用Bundle做一些事情,而不是使用Bundle来使用应用程序做一些事情org.osgi.framework.BundleActivator
编辑:我在想:,但我找不到任何教程。为什么要为视图中存在的每个捆绑包创建菜单项?这真的没有道理 您可以创建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的控制台,我不知道您为什么会这样认为。