gpt4 book ai didi

java - 使用不同的服务创建 OSGi 包

转载 作者:行者123 更新时间:2023-11-30 09:16:48 24 4
gpt4 key购买 nike

我们正在使用 Adob​​e Day CQ 进行部署。我们目前正在创建 OSGi 包,并使用 maven-bundle-plugin 将所有服务部署在 CQ 中。

现在我们有一个场景,我们不希望某些服务在 Publish 实例中启用,但应该在 Author 中启用。

有没有一种方法可以使用相同的 pom.xml 来管理两个包,一个是为作者提供作者所需的服务,另一个是为发布提供发布所需的服务?
或者有什么其他方法可以让我管理这东西。
请在这方面帮助我。我们现在正在使用它来创建包:

<plugin>
<groupId>org.apache.felix</groupId>
<artifactId>maven-bundle-plugin</artifactId>
<version>2.0.1</version>
<extensions>true</extensions>
<configuration>
<instructions>
<Import-Package>
org.osgi.framework,
*;resolution:=optional
</Import-Package>
<Export-Package>
com.abc.platform.enow.aem.core.testing.*,
com.abc.platform.enow.aem.core.utils.*,
com.abc.platform.enow.aem.core.viewhelper.*,
com.abc.platform.enow.aem.core.search.*

</Export-Package>
</instructions>
</configuration>
</plugin>

最佳答案

有两种方法可以做到这一点。第一种方法更可取

通过配置选择性激活

您可以通过使用基于 Sling 运行模式的配置支持和使用声明式服务来管理服务注册来实现这一点。

将您的服务绑定(bind)到配置

使用 SCR 注释将您的服务绑定(bind)到配置

import org.apache.felix.scr.annotations.Activate;
import org.apache.felix.scr.annotations.Component;
import org.apache.felix.scr.annotations.ConfigurationPolicy;
import org.apache.felix.scr.annotations.Deactivate;
import org.apache.felix.scr.annotations.Property;
import org.apache.felix.scr.annotations.Service;


@Component(
name = FooImpl.SERVICE_PID,
policy = ConfigurationPolicy.REQUIRE)
@Service
public class FooImpl implements IFoo{
public static final String SERVICE_PID = "com.foo.example";

在上面的代码片段中我们

  • 注册一个实现IFoo的服务界面
  • ConfigurationPolicy组件设置为 REQUIRE即,如果没有任何显式配置,组件和服务将不会被激活和注册
  • 配置的 PID 设置为 com.foo.example .如果省略它,则默认为类的完全限定名称

在所需的运行模式文件夹下创建配置

在 CQ 中,Sling 安装程序将根据运行模式从存储库部署配置和 bundle 。因此,如果您通过内容包部署代码,那么

  • 创建 config node在路径下 /apps/<yourProject>/config.author/com.foo.example
  • 在上面的路径下创建一个sling:OsgiConfig 类型的空白代码(除非你想提供其他配置属性)

完成上述更改后,将您的内容包部署到各种 CQ 实例上

  • 当包部署在任何 CQ 实例上时,然后配置 PID com.foo.example仅当运行模式设置为 Author 时才会创建
  • 并且只有当配置激活时才只有FooImpl将创建和注册组件和服务

使用 SlingSettingsService

另一种方法可以利用 SlingSettingsService.getRunModes以编程方式确定运行模式,然后仅注册服务。

import org.apache.felix.scr.annotations.Activate;
import org.apache.felix.scr.annotations.Component;
import org.apache.felix.scr.annotations.Deactivate;
import org.apache.felix.scr.annotations.Reference;

@Component
public class FooImpl implements IFoo{

@Reference
private SlingSettingsService settingsService;

private ServiceRegistration reg;

@Activate
public void activate(BundleContext context, Map<String, ?> conf){
if(settingsService.getRunModes().contains("author")){
reg = context.registerService(IFoo.class.getName(), this, null);
}
}

@Deactivate
private void deactivate(){
if (reg != null){
reg.unregister();
}
}
}

以上代码段需要注意的几点

  • FooImpl没有用 @Service 注释标签。所以 SCR 只会激活组件,不会注册任何服务
  • activate我们使用的方法SlingSettingsService检查所需的运行模式。如果是 author我们以编程方式注册服务
  • 稍后在 deactivate 中删除服务实例方法

关于java - 使用不同的服务创建 OSGi 包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19292933/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com