2

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

现在我们有一个场景,我们不希望在 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>
4

2 回答 2

2

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

通过配置选择性激活

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

将您的服务绑定到配置

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

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

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

  • 在路径下创建一个配置节点/apps/<yourProject>/config.author/com.foo.example
  • 在上述路径下,只需创建一个空白 ode(除非您想提供其他配置属性)类型sling:OsgiConfig

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

  • 在任何 CQ 实例上部署包com.foo.example时,只有在运行模式设置为作者时才会创建PID 配置
  • 只有当配置处于活动状态时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方法中删除服务实例
于 2013-10-19T13:13:41.970 回答
0

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

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

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

问候, Vaibhav

于 2014-08-05T05:40:01.560 回答