我有一个动态应用程序,它使用 OSGi 在运行时加载模块化功能。OSGi 包包含模块化功能,应用程序会在需要时加载这些包。这种方法可以,但我想要一个更细粒度的解决方案。捆绑包包含通过声明式服务控制的组件。我希望能够加载一个包,并且只启用包中需要的组件。我已经在这方面进行了研究,但找不到我满意的解决方案。一种方法是创建一个始终在捆绑包中启用的“看门人”组件,并通过 ComponentContext 让它调用启用和禁用组件。这是一个可行的解决方案,但我无法找到让“看门人”“了解”的方法
我更喜欢的是一种加载捆绑包并“了解”已加载捆绑包中所有组件的方法。能够确定组件位于哪个捆绑包中以及它们当前处于什么状态(类似于列出所有组件的Equinox 控制台命令“ls”)。我想在需要时启用和禁用组件。
控制台如何做到这一点,我怎么能在应用程序中做到这一点?
更新:@Neil Bartlett:抱歉耽搁了。我不得不转向别的事情。现在我回到这个问题上。真的很感激任何进一步的帮助。我的应用程序是基于角色的。我需要根据它们提供的功能启用组件。目标是最初禁用所有基于角色的组件。角色更改后,角色管理器会轮询每个组件以获取其提供的功能并确定是否加载它。每个组件将广播它提供的功能(通过公共服务接口)。ScrService 不允许我启用最初禁用的服务组件。最初启用组件并让 ScrService 在应用程序启动期间尽快禁用它们不符合我的需求。