Создавайте описания метатипов с помощью maven-scr-plugin и аннотаций OSGI R6.

Я использую maven-scr-plugin для создания описаний компонентов и метатипов. Я перехожу с аннотаций org.apache.felix.scr на аннотации org.osgi.service.component.

Карстен Зигелер написал отличный блог о том, как выполнить эту миграцию здесь. Однако это не объясняет, как получить описания метатипов непосредственно из аннотаций компонентов. Вместо этого мне пришлось бы сделать отдельную конфигурацию @interface для каждого компонента и переписать все активаторы компонентов (по крайней мере, чтобы использовать добавленную стоимость этих дополнительных классов @interface).

Я все еще могу использовать maven-scr-plugin для обработки аннотаций osgi, добавив зависимость от org.apache.felix.scr.ds-annotations. Однако maven-scr-plugin выводит информацию о метатипе только в том случае, если это явно включено. В аннотациях felix для включения генерации метатипа доступен специальный параметр metatype=true в аннотации @Component. Однако такой параметр недоступен в версии OSGi аннотации @Component.

Есть ли способ заставить maven-scr-plugin генерировать описания метатипа, или я могу заставить maven-bundle-plugin (или bndtools) генерировать данные метатипа на основе аннотации osgi @Component вместо того, чтобы определять выделенный класс конфигурации для каждого компонента?


person Igor P    schedule 23.11.2016    source источник


Ответы (2)


Метатип создается при использовании аннотации @Designate. (По крайней мере, в реализации bnd.)

 @Designate( ocd=Config.class, factory=true )
 @Component
 public class SomeComponent {
    @ObjectClassDefinition
    @interface Config {
       int port();
    }
    @Activate
    void activate( Config config) { }
 }
person Peter Kriens    schedule 23.11.2016
comment
Да, я понял, и это работает без проблем. Однако, чтобы сделать это правильно, мне также пришлось бы изменить все активаторы, как показано в вашем примере (я знаю, что без этого можно обойтись, но это оставляет много неиспользуемого шаблонного кода в моих классах). Могу ли я рассматривать ваш ответ как подтверждение того, что bnd не поддерживает подход, который я ищу? Затем я могу исключить этот путь решения, оставив только maven-scr-plugin в качестве возможного решения. - person Igor P; 23.11.2016

Насколько я знаю, для каждого компонента нужна отдельная конфигурация @interface. Также невозможно сгенерировать метатип из аннотаций @Component, поскольку они не описывают конфигурации.

person Christian Schneider    schedule 23.11.2016
comment
Аннотация @Component имеет параметр property, в котором определяется вся основная информация для параметров конфигурации (имя, значение по умолчанию, тип объекта). Конечно, дополнительную информацию вроде предельных диапазонов и пояснительных описаний добавить нельзя, но в моем случае они мне и не нужны. - person Igor P; 23.11.2016
comment
Я не думаю, что свойства @Component учитываются при создании метатипа, но я могу ошибаться. Может быть, Питер сможет ответить на это. - person Christian Schneider; 23.11.2016
comment
Они не. Метатип XML создается из аннотированных типов ObjectClassDefinition. Он не генерируется из элементов свойств аннотаций компонента. - person BJ Hargrave; 23.11.2016