Создание пакетов OSGi с различными сервисами
Мы используем Adobe Day CQ для нашего развертывания. В настоящее время мы создаем пакеты OSGi с развертыванием в CQ со всеми сервисами, используя maven-bundle-plugin.
Теперь у нас есть сценарий, в котором мы не хотим, чтобы некоторые службы включались в экземпляре публикации, но должны быть включены в авторе.
Есть ли способ, которым мы можем управлять двумя пакетами: один для автора с услугами, необходимыми для автора, и один для публикации, которые требуются при публикации, используя тот же файл 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 ответа
Мы добились этого, используя свойство runmode для CQ. Мы сделали ниже:
- Создана полная сборка.
- На этапе распространения мы поместили файл jar (который нам нужно было установить только для автора) в папку /apps/"project_name"/install.author.
- Здесь "автор" - режим запуска экземпляра.
- Этот jar-файл развертывается как для автора, так и для публикации в папке install.author, но в установленном / отраженном только режиме автора.
Спасибо за ответ, но мы нашли это решение более гибким и выполнимым.
С уважением, Вайбхав
Есть два способа сделать это. Первый подход будет предпочтительнее
Выборочная активация через конфигурацию
Этого можно добиться, используя поддержку конфигурации на основе режима Sling Run и используя декларативные сервисы для управления регистрацией сервисов.
Свяжите свой сервис с конфигурацией
Используйте аннотацию 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
для компонента установленоREQUIRE
т.е. без какой-либо явной конфигурации компонент и, следовательно, услуга не будут активированы и зарегистрированы- PID конфигурации установлен на
com.foo.example
, Если вы опустите его, то по умолчанию будет указано полное имя класса
Создать конфигурацию в нужной папке Run Mode
В CQ установщик Sling будет развертывать конфигурацию и пакет из репозитория на основе режима запуска. Так что, если вы развертываете свой код через Content Packages, тогда
- Создайте узел конфигурации под путем
/apps/<yourProject>/config.author/com.foo.example
- Под указанным выше путем просто создайте пустую оду (если вы не хотите предоставлять другие свойства конфигурации) типа
sling:OsgiConfig
После внесения вышеуказанных изменений разверните пакет контента на различных экземплярах CQ.
- Когда пакет развернут на любом экземпляре CQ, тогда конфигурация для 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
метод