OSGi - Как запустить новый пакет через существующий файл bndrun

Я новичок в инфраструктуре Java OSGi и унаследовал проект, который нуждается в новых функциях. Проект имеет несколько пакетов и настроен для работы в Eclipse со всеми необходимыми плагинами и т. д.

Существует файл start.bndrun, который при запуске с помощью параметра «Запустить OSGi» в Eclipse запускает основное приложение и запускает все пакеты с помощью их activate() функций.

Проблема в том, что когда я создаю свой собственный простой компонент и пакет, как показано ниже, ExampleProviderImpl, экспортирую необходимые пакеты и т. д. и пытаюсь добавить его в параметр «Выполнить пакеты» start.bndrun, он просто вроде не бежит.

package Test;

import org.osgi.service.component.annotations.Activate;
import org.osgi.service.component.annotations.Component;
import org.osgi.service.component.annotations.Reference;

@Component
public class ExampleProviderImpl
{

   @Activate
   void activate()
   {
      System.out.println("HELLO FROM ExampleProviderImpl.class");
      System.out.println("HELLO FROM ExampleProviderImpl.class");
      System.out.println("HELLO FROM ExampleProviderImpl.class");
      System.out.println("HELLO FROM ExampleProviderImpl.class");
      System.out.println("HELLO FROM ExampleProviderImpl.class");
   }
}

person Engineer999    schedule 03.09.2019    source источник
comment
Можете ли вы проверить, действительно ли ваш класс попадает в банку пакетов? Еще одна вещь, которую нужно проверить, это. У вас запущен пакет scr (расширитель декларативных служб)?   -  person Christian Schneider    schedule 04.09.2019
comment
Вы используете Felix или Equinox? Внутри Equinox вы должны добавить заголовок Bundle-ActivationPolicy: lazy в файл bnd. В противном случае DS/SCR не запустит автоматически ваш пакет и службу.   -  person Peter Kirschner    schedule 05.09.2019


Ответы (1)


я предполагаю,

он просто не работает.

Вы имеете в виду, что ничего не распечатывается. Если это так, то это, скорее всего, потому, что компоненты по умолчанию ленивы и не будут активированы до тех пор, пока они не потребуются. Попробуйте добавить immediate = true в свою аннотацию, чтобы принудительно активировать компонент:

@Component(immediate = true)
public class ExampleProviderImpl

ОБНОВЛЕНИЕ

Вышеприведенное предполагает, что пакет был правильно добавлен, разрешен и запущен во время выполнения. Чтобы проверить, так ли это на самом деле

  • Убедитесь, что пакет правильно добавлен в Run Requirements.
  • Убедитесь, что установлен флажок auto-resolve on save, или нажмите кнопку Resolve введите здесь описание изображения
  • Убедитесь, что разрешение не приводит к ошибкам, и ваш пакет добавлен в раздел Run Bundles.
  • После просмотра среды/развертывания пакета перейдите в оболочку Gogo и введите команду lb. Убедитесь, что ваш пакет Active

Если что-то пойдет не так во время любого из этих шагов, обновите вопрос, указав всю необходимую информацию.

person Milen Dyankov    schedule 03.09.2019
comment
Спасибо за ваше предложение. Однако в моем случае это все еще не работает (ничего не печатается). Как правильно добавить новый пакет/компонент в файл bndrun? Я поместил новые компоненты как в разделы «Требования к выполнению», так и в разделы «Выполнение пакетов». - person Engineer999; 03.09.2019
comment
Можете ли вы дополнить свой вопрос содержимым файла start.bndrun? Обычно вам нужно только добавить пакет в Run requirements, а затем решить. Преобразователь должен обновить разделы Run bundles. - person Milen Dyankov; 03.09.2019
comment
@MilenЕще раз спасибо за помощь. Как вы объяснили, я добавил свой новый пакет в раздел «Требования к запуску». Автоматическое разрешение при сохранении проверено. Когда я выбираю Resolve, мой пакет появляется там, а также в Run Bundles, так что похоже, что он будет работать. Тем не менее, я все еще ничего не распечатываю. Когда я проверяю консоль Felix, мой пакет вообще не отображается, как несуществующий. Я добавил (immediate = true) также в компонент - person Engineer999; 06.09.2019
comment
В этом основном проекте также есть файл bnd.bnd вместе с файлом bndrun. Следует ли также добавить пакет в раздел «Требования к запуску» этого файла bnd.bnd? Когда я это делаю, это не разрешается, и ошибки, такие как возможности, удовлетворяющие следующим требованиям, не могут быть найдены: - person Engineer999; 06.09.2019
comment
Нет. Обычно у вас нет требований к запуску в bnd.bnd файлах. Они предназначены для настройки пакета, а не среды выполнения. Как вы начинаете свое время выполнения? - person Milen Dyankov; 06.09.2019
comment
Внутри файла bndrun в правом верхнем углу есть опция Run Osgi. Я использую Eclipse IDE со всеми необходимыми плагинами. Все остальные пакеты, входящие в репозиторий, активируются и работают нормально, как я вижу через консоль Felix вместе с отладочными сообщениями на консоли. Даже если я добавляю новые пакеты и услуги в уже существующие пакеты, они активируются и работают нормально. Однако ни один новый/отдельный пакет, который я создал сам, еще не активирован. Уже больше недели пытаюсь. - person Engineer999; 06.09.2019
comment
Итак, вы добавляете его в файл bndrun, сохраняете, он разрешается без ошибок, вы можете увидеть его в Run Bundles, вы запускаете его из пользовательского интерфейса bndtools, и его все еще нет в среде выполнения? Это странно. Боюсь, я не могу придумать более типичных проблем. Возможно, если вы поделитесь файлом bndrun, это прольет свет на проблему. - person Milen Dyankov; 06.09.2019
comment
Как лучше всего поделиться этим? - person Engineer999; 06.09.2019
comment
Отредактируйте свой вопрос и добавьте его туда. - person Milen Dyankov; 06.09.2019