Проблема с OSGi зависимостями в портальном проекте Liferay 7 при использовании Service Builder

Классический портлетный проект для Liferay 7 состоит из четырёх бандлов:

  • *-service-api - интерфейсы сервисов
  • *-service-impl - реализация сервисов
  • *-portlet-lang - языковые бандлы
  • *-portlet-web - реализация портлета

Инжекция сервисов в класс портлета происходит при помощи аннотации:

org.osgi.service.component.annotations.Reference

Если открыть классы, автоматически созданные при помощи Service Builder, то мы не обнаружим никаких аннотаций, связанных с OSGi. Появляется вопрос - как эти сервисы попадают в регистр OSGi? Всё волшебство происходит в модуле:

portal-spring-extender

Этот модуль регистрирует бины, определённые в контексте Spring в OSGi контекст. Для понимания процесса можно заглянуть в методы:

com.liferay.portal.spring.extender.internal.context.ModuleApplicationContextRegistrator.start()

и

com.liferay.portal.spring.extender.internal.bean.ApplicationContextServicePublisher.registerService(
        BundleContext bundleContext, Object bean, List<String> interfaces,
        Dictionary<String, Object> properties)

На днях столкнулся с проблемой - портлетный проект *-portlet-web деплоится без ошибок, но портлет не доступен для размещения на странице портала. Проверил - все необходимые xml описания для Declarative Services были созданы во время сборки - это описание самого портлетного класса и референсных сервисов внутри. Причина оказалась в том, что в проекте *-service-impl  я не указал зависимость на portal-spring-extender, поэтому при сборке не добавились нужные импорты, а при деплое сервисы не зарегистрировались.

16.02.2018