Как использовать аннотации org.apache.felix.scr для пакета с нуля?

Я начал разрабатывать пакет для apache felix и сделал это с плагином ops4j pax.

Я создал структуру проекта с помощью pax-create-project и сделал обычный pax-create-bundle. Затем вы получаете первоначальную структуру проекта для создания всего этого с помощью maven. Важная часть здесь заключается в том, что у вашего пакета есть собственный pom (bundlename/pom.xml) и файл bnd (bundlename/osgi.bnd), но конфигурация для maven-bundle-plugin уже предоставлена ​​в poms/compiled/pom.xml. Метаданные пакета настраиваются под poms/compiled/pom.xml, но стандартный активатор настраивается под вышеупомянутым файлом osgi.bnd. Значение по умолчанию в файле bnd — Bundle-Activator: ${bundle.namespace}.internal.ExampleActivator.

Теперь я хотел начать использовать аннотации из org.apache.felix.scr, поэтому я включил это в собственный пакет pom в зависимостях:

<dependency>
  <groupId>org.apache.felix</groupId>
  <artifactId>org.apache.felix.scr</artifactId>
  <version>1.6.0</version>
</dependency>

И я создал свой интерфейс для сервиса:

package namespace;

public interface Sample {
  void sayHello();
}

А так же реализация с аннотациями от org.apache.felix.scr:

package namespace.internal;

import org.apache.felix.scr.annotations.Activate;
import org.apache.felix.scr.annotations.Component;
import org.apache.felix.scr.annotations.Deactivate;
import namespace.Sample;

@Component
@Service
public class SampleImpl implements Sample{

  @Activate
  void start(){
    System.out.println("Started SampleImpl.");
  }

  @Deactivate
  void stop(){
    System.out.println("Stopped SampleImpl.");
  }

  @Override
  public void sayHello() {
    System.out.println("Hello!");
  }
}

Что мне нужно поместить в файл osgi.bnd, чтобы запустить компоненты? Мне пришлось удалить запись по умолчанию, упомянутую выше, потому что я больше не использую BundleActivator.

Теперь вот вопрос: что мне нужно сделать с любым из вышеупомянутых файлов, чтобы позволить mvn clean install pax:provision запустить среду felix, которая запускает мой пакет и позволяет мне видеть любые распечатки? Я уже просмотрел вывод журнала службы журналов Apache, которую я тоже запускаю, и он просто говорит мне:

2012.09.28 16:52:44 INFO - Bundle: namespace - BundleEvent STARTED
2012.09.28 16:52:44 INFO - Bundle: namespace - BundleEvent RESOLVED

Любые подсказки очень приветствуются. Или ссылки, я искал более часа, чтобы найти полное руководство по использованию плагинов maven для scr и объединения вместе.

Привет, Кьельски


person Kjellski    schedule 28.09.2012    source источник


Ответы (1)


Это модификация моей статьи coderwall по этой теме: http://coderwall.com/p/q39uxq

Сначала настройте общую конфигурацию компиляции подмодулей из poms/compiled/pom.xml. Добавьте плагин прямо туда, где уже есть maven-bundle-plugin:

<plugin>
    <groupId>org.apache.felix</groupId>
    <artifactId>maven-scr-plugin</artifactId>
    <version><timeofwriting:1.8.0></version>
    <executions>
        <execution>
            <id>generate-scr-scrdescriptor</id>
            <goals>
                <goal>scr</goal>
            </goals>
        </execution>
    </executions>
</plugin>

В том же файле в разделе poms/compiled/pom.xml посмотрите инструкции для maven-bundle-plugin и добавьте прямо под оператором ‹_include>:

<Service-Component>
    OSGI-INF/serviceComponents.xml
</Service-Component>

Теперь зависьте от аннотаций в подпроектах, чтобы использовать их:

<dependency>
    <groupId>org.apache.felix</groupId>
    <artifactId>org.apache.felix.scr</artifactId>
    <version><timeofwriting:1.6.0></version>
</dependency>
<dependency>
    <groupId>org.apache.felix</groupId>
    <artifactId>
        org.apache.felix.scr.annotations
    </artifactId>
    <version><timeofwriting:1.7.0></version>
</dependency>

Теперь определите свои компоненты с помощью аннотаций @Component и @Service. Если вы хотите, чтобы ничего не было включено, как в любой пакет API, просто вставьте «Service-Component: *» в файл osgi.bnd. Это заставит подключаемый модуль пакета перестать жаловаться на отсутствующий файл OSGI.INF для проекта, который его не содержит.

Надеюсь, это поможет кому-то ;)

С уважением, Кьельски

person Kjellski    schedule 30.09.2012