我们正在使用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>
答案 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
,即没有任何显式配置组件,因此服务不会被激活和注册com.foo.example
。如果省略它,则默认为类的完全限定名称在所需的“运行模式”文件夹下创建配置
在CQ中,Sling安装程序将根据运行模式从存储库部署配置和捆绑。因此,如果您通过内容包部署代码,那么
/apps/<yourProject>/config.author/com.foo.example
sling:OsgiConfig
完成上述更改后,您可以在各种CQ实例上部署内容包
com.foo.example
的配置
FooImpl
组件和服务另一种方法可以使用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属性实现了这一点。 我们做了以下工作:
感谢您的回复,但我们发现此解决方案更加灵活可行。
此致 Vaibhav的