使用不同的服务创建OSGi包

时间:2013-10-10 10:09:17

标签: java maven osgi maven-plugin day-cq

我们正在使用Adobe Day CQ进行部署。我们目前正在使用maven-bundle-plugin创建OSGi捆绑包,并在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>

2 个答案:

答案 0 :(得分:2)

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

通过配置选择性激活

您可以通过使用基于Sling Run Mode的配置支持并使用Declarative Services来管理服务注册来实现这一目标。

将您的服务绑定到配置

使用SCR注释将服务绑定到配置

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 interface
  • 的服务
  • ConfigurationPolicy对于组件设置为REQUIRE,即没有任何显式配置组件,因此服务不会被激活和注册
  • 配置的PID设置为com.foo.example。如果省略它,则默认为类的完全限定名称

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

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

  • 在路径/apps/<yourProject>/config.author/com.foo.example
  • 下创建config node
  • 在上述路径下,只需创建sling:OsgiConfig
  • 类型的空白颂歌(除非您要提供其他配置属性)

完成上述更改后,您可以在各种CQ实例上部署内容包

  • 当在任何CQ实例上部署包时,只有在运行模式设置为Author
  • 时才会创建PID com.foo.example的配置
  • 仅当配置处于活动状态时,才会创建并注册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方法
  • 中删除服务实例

答案 1 :(得分:0)

我们通过使用CQ的runmode属性实现了这一点。 我们做了以下工作:

  • 创建完整版本。
  • 在分发阶段,我们将jar(我们只需要在作者上安装)推送到文件夹/apps/"project_name"/install.author。
  • 此处“author”是实例的运行模式。
  • 此jar部署到作者并在install.author文件夹中发布,但仅在作者模式下安装/反映。

感谢您的回复,但我们发现此解决方案更加灵活可行。

此致 Vaibhav的