我们使用 Adobe 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/