在启动时停止使用 Felix Dependency Manager 创建的 OSGi Bundle

Stopping an OSGi Bundle created using Felix Dependency Manager at startup time

我们使用 Felix 作为我们的 OSGi 框架,并使用 Felix Dependency Manager 来管理我们的 OSGi 组件。我们有一种情况,我们在组件的启动方法中加载并验证 XML。如果 XML 对架构的验证失败,我们想停止捆绑。我们有

达到这个要求的正确方法是什么,即如果启动方法有致命问题,bundle 应该保持停止状态?

如果您希望某个包在有人尝试启动后不激活,您必须从 BundleActivator 的 start 方法中抛出异常。这是告诉框架出现问题并且您的包无法启动的最佳方式。

您尝试从组件的 start 方法中抛出异常。那时捆绑包已经激活,所以你来不及了。

在这种情况下,我建议您重写 DependencyActivatorBase 中的 start 方法,并且:

  1. 加载并验证您的 XML(如果失败则抛出异常)。
  2. 调用超类的start方法,让DM完成它的工作。

这隐含地意味着您不能为此包使用基于注解的 DM 版本,因此如果您正在使用它,则必须将其转换为使用代码声明其组件和依赖项的包。