可以在CQ中以编程方式禁用OSGi组件吗?

可以在CQ中以编程方式禁用OSGi组件吗?,osgi,aem,Osgi,Aem,与其在Felix中手动更改OSGi组件的配置,不如在JCR中创建sling:OsgiConfig节点,以确保设置受版本控制,并跨环境应用相同的设置,等等 类似地,我想在每个环境中禁用开箱即用组件。有没有办法通过配置来实现这一点?而不是转到系统/控制台/组件并在那里禁用它 关于这一点,我所读到的任何东西都提到了在捆绑包内部进行更改,但由于它不是我自己的,所以我需要一些外部配置来完成此操作。尝试使用属性policy=ConfigurationPolicy.REQUIRE打开@Component 然后

与其在Felix中手动更改OSGi组件的配置,不如在JCR中创建
sling:OsgiConfig
节点,以确保设置受版本控制,并跨环境应用相同的设置,等等

类似地,我想在每个环境中禁用开箱即用组件。有没有办法通过配置来实现这一点?而不是转到系统/控制台/组件并在那里禁用它


关于这一点,我所读到的任何东西都提到了在捆绑包内部进行更改,但由于它不是我自己的,所以我需要一些外部配置来完成此操作。

尝试使用属性
policy=ConfigurationPolicy.REQUIRE
打开
@Component

然后,作为构建的一部分,您可以为每个环境准备一组包含配置的包。对于每个环境都有不同的OSGI配置,这也是一个很好的实践

因此,对于某些环境,您可以简单地不提供特定组件的配置。这样的组件将不会运行-它将具有不满意的状态

我相信我已经在AEM本身看到了这种方法

您还可以创建一个过滤器来删除当前配置,但仍需要至少禁用一次该组件。只有当这个组件提到了策略时,这个解决方案才会起作用


另一种方法是准备一个负责禁用其他组件的服务——它可以是可配置的。但对我来说,这听起来不是一个好的解决方案。

您可以使用由SCR运行时捆绑包发布的
ScrService
来实现这一点。API文档是


请注意,ScrService不是“标准”,即它不是来自OSGi规范。然而,它得到了Felix、Equinox和Knopflerfish的支持,所以它几乎是一个事实上的标准。事实上,当您转到
system/Console/components

Hi-Michal时,Web控制台会使用此服务,谢谢您的回答。我遇到的问题是,我想要禁用的组件是Adobe提供的编译JAR的一部分,因此,我无法修改批注。您能否指定它是哪个组件,以及为什么要禁用它?我已经对答案进行了一些扩展,但如果知道您想要实现什么,仍然会很有用。我想禁用该组件,以便为它公开的服务提供我自己的实现。据我所知,如果同一服务有两个版本可用,OSGi运行时将决定使用哪个实现,所以我可以选择其中一个。是的,这是真的。但是,每个OSGI服务都可以有一个属性,用于对服务进行优先级排序,并返回排名最高的服务。另一个选项是在OSGI
@Reference(target=“(feedbackType=data)”)
中使用过滤器。请扩展您的问题,以便我可以编辑我的答案。是否有计划在未来的OSGi规范中包含ScrService?它看起来很有用。