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

标签 java maven osgi maven-plugin day-cq

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

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

有没有一种方法可以让我们使用相同的 pom.xml 来管理两个 bundle ,一个用于作者,其中包含作者所需的服务,另一个用于发布,这是发布时所需的服务?
或者还有其他方法可以让我管理这件事。
请在这方面帮助我。 我们现在正在使用它来创建 bundle :

<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 Run 模式的配置支持并使用声明性服务来管理服务注册来实现这一点。

将您的服务绑定(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仅当运行模式设置为作者时才会创建
  • 并且仅当配置处于 Activity 状态时才 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 bundle ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19292933/

相关文章:

java - 如何从 Axis2 SOAP 响应中删除 header 属性

java - 列表对象的 XSD

maven - mvn 命令未被识别为内部或外部命令

java - 如何设置具有多个子项目的 Eclipse 项目 (OSGi-Bundle)

java - Eclipse OSGi 包需要另一个包的片段

java - 简单的 odata4j - NoClassDefFoundError

java - 是否可以将 JAX-RS 用作 Web 框架?

java - 七月到 TomEE 1.7.2 上的 SLF4J,带有 Maven 插件

JavaFX : Unable to include JavaFX runtime in classpath

java - KARAF OSGI bundle 上的自定义 hibernate.cfg.xml 位置