Java 使用不同的服务创建OSGi捆绑包

Java 使用不同的服务创建OSGi捆绑包,java,maven,osgi,maven-plugin,day-cq,Java,Maven,Osgi,Maven Plugin,Day Cq,我们正在使用AdobeDayCQ进行部署。我们目前正在创建OSGi捆绑包,并在CQ中部署GET和使用maven捆绑包插件的所有服务 现在我们有了一个场景,我们不希望在发布实例中启用某些服务,但应该在Author中启用 有没有一种方法可以让我们使用相同的pom.xml管理两个捆绑包,一个用于author,一个用于author,另一个用于publish,这两个捆绑包在publish上都是必需的 或者有没有其他方法可以让我管理这件事。 请在这方面帮助我。 我们现在正在使用它来创建捆绑包: <pl

我们正在使用AdobeDayCQ进行部署。我们目前正在创建OSGi捆绑包,并在CQ中部署GET和使用maven捆绑包插件的所有服务

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

有没有一种方法可以让我们使用相同的pom.xml管理两个捆绑包,一个用于author,一个用于author,另一个用于publish,这两个捆绑包在publish上都是必需的 或者有没有其他方法可以让我管理这件事。
请在这方面帮助我。 我们现在正在使用它来创建捆绑包:

<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>

org.apache.felix
maven捆绑插件
2.0.1
真的
org.osgi.framework,
*;分辨率:=可选
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*

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

通过组态选择激活 您可以通过使用基于运行模式的配置支持和使用声明性服务来管理服务注册来实现这一点

将您的服务绑定到配置

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

import org.apache.felix.scr.annotations.Activate;
导入org.apache.felix.scr.annotations.Component;
导入org.apache.felix.scr.annotations.ConfigurationPolicy;
导入org.apache.felix.scr.annotations.Deactivate;
导入org.apache.felix.scr.annotations.Property;
导入org.apache.felix.scr.annotations.Service;
@组成部分(
name=FooImpl.SERVICE\u PID,
policy=ConfigurationPolicy.REQUIRE)
@服务
公共类FooImpl实现IFoo{
公共静态最终字符串服务\u PID=“com.foo.example”;
在上面的代码片段中,我们

  • 注册一个实现
    IFoo
    接口的服务
  • 组件的
    ConfigurationPolicy
    设置为
    REQUIRE
    ,即如果没有任何明确的配置,组件将无法激活和注册服务
  • 配置的PID设置为
    com.foo.example
    。如果省略它,则默认为类的完全限定名
在所需运行模式文件夹下创建配置

在CQ中,Sling安装程序将根据运行模式从存储库部署配置和绑定

  • 在路径
    /apps//config.author/com.foo.example
  • 在上面的路径下,只需创建一个类型为
    sling:OsgiConfig
完成上述更改后,在各种CQ实例上部署您的内容包

  • 当在任何CQ实例上部署包时,只有当运行模式设置为Author时,才会创建PID
    com.foo.example
    的配置
  • 只有当配置处于活动状态时,才会创建和注册
    FooImpl
    组件和服务
使用SlingSettingService 另一种方法可以利用以编程方式确定运行模式,然后只注册服务

import org.apache.felix.scr.annotations.Activate;
导入org.apache.felix.scr.annotations.Component;
导入org.apache.felix.scr.annotations.Deactivate;
导入org.apache.felix.scr.annotations.Reference;
@组成部分
公共类FooImpl实现IFoo{
@参考文献
私人吊索设置服务设置服务;
私人服务注册条例;
@激活
公共void激活(BundleContext,Map conf){
如果(settingsService.getRunModes()包含(“作者”)){
reg=context.registerService(IFoo.class.getName(),this,null);
}
}
@停用
私有无效停用(){
如果(reg!=null){
reg.unregister();
}
}
}
以上代码片段需要注意的几点

  • FooImpl
    未使用
    @Service
    标记进行注释。因此,SCR将仅激活组件,而不会注册任何服务
  • activate
    方法中,我们使用
    SlingSettingsService
    检查所需的运行模式。如果是
    author
    ,我们通过编程注册服务
  • 稍后将在
    停用
    方法中删除服务实例

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

  • 创建完整版本
  • 在分发阶段,我们将jar(只需要在author上安装)推送到/apps/“project_name”/install.author文件夹
  • 这里“author”是实例的运行模式
  • 此jar部署到install.author文件夹中的author和publish,但仅在author模式下安装/反映
感谢您的回复,但我们发现此解决方案更灵活、更可行

问候,,
Vaibhav

请在这方面帮助我…我在任何地方都找不到选项…嗨,Chetan,这是一个很好的帮助。我会尝试一下。你能告诉我是否有一种方法可以使用项目的pom.xml实现这一点,因为这将更容易,而不是对代码进行更改。