Управление версиями экспорта OSGi - PullRequest
0 голосов
/ 20 ноября 2018

Я довольно новичок в мире osgi и, возможно, что-то упустил, и у меня возникают проблемы с выставлением разных версий одного и того же сервиса для liferay.

Вот что я пытаюсь сделать (и извинитедля моего английского):

Я написал сервис, обернул его в пакет и успешно развернул на osgi.Мой файл bnd.bnd выглядит следующим образом

Bundle-Name: it.peernetwork.lr.pilot.test-services
Bundle-SymbolicName: pilot--test-services
Bundle-Version: 7.1.0
Bundle-Activator: it.peernetwork.lr.pilot.testservices.impl.TestServicesActivator
Export-Package: it.peernetwork.lr.pilot.testservices

, и после упаковки файл манифеста выглядит следующим образом

Manifest-Version: 1.0
Bnd-LastModified: 1542646653910
Bundle-Activator: it.peernetwork.lr.pilot.testservices.impl.TestServic
 esActivator
Bundle-ClassPath: .,lib/pn--logger-7.1.0.jar,lib/pn--services-base-7.1
 .0.jar,lib/pn--prop-files-7.1.0.jar,lib/gson-2.8.5.jar,lib/pn--expand
 o-values-7.1.0.jar
Bundle-ManifestVersion: 2
Bundle-Name: it.peernetwork.lr.pilot.test-services
Bundle-SymbolicName: pilot--test-services
Bundle-Version: 7.1.0
Created-By: 1.8.0_191 (Oracle Corporation)
Export-Package: it.peernetwork.lr.pilot.testservices;version="7.1.0"
Import-Package: com.liferay.expando.kernel.exception;version="[1.0,2)"
 ,com.liferay.expando.kernel.model;version="[1.1,2)",com.liferay.expan
 do.kernel.service;version="[1.1,2)",com.liferay.portal.kernel.excepti
 on;version="[7.2,8)",com.liferay.portal.kernel.model;version="[2.0,3)
 ",it.peernetwork.lr.pilot.testservices,org.osgi.framework;version="[1
 .8,2)"
Javac-Debug: on
Javac-Deprecation: off
Javac-Encoding: UTF-8
Private-Package: it.peernetwork.lr.pilot.test.services.impl,it.peernet
 work.lr.pilot.testservices.impl,it.peernetwork.lr.pilot.testservices.
 x,lib,it.peernetwork.lr.logger,it.peernetwork.lr.servicesbase,it.peer
 network.lr.propfiles,it.peernetwork.lr.propfiles.utils,com.google.gso
 n,com.google.gson.annotations,com.google.gson.internal,com.google.gso
 n.internal.bind,com.google.gson.internal.bind.util,com.google.gson.in
 ternal.reflect,com.google.gson.reflect,com.google.gson.stream,it.peer
 network.lr.expandovalues
Require-Capability: osgi.ee;filter:="(&(osgi.ee=JavaSE)(version=1.8))"
Tool: Bnd-3.2.0.201605172007

Этот файл манифеста объявляет

Export-Package: it.peernetwork.lr.pilot.testservices;version="7.1.0"

и я думаю, что это правильно.

После развертывания (успешно) я проверяю состояние пакета с помощью команды bundle __BUNDLE_ID__, которая дает мне

pilot--test-services_7.1.0 [1014]
  Id=1014, Status=ACTIVE      Data Root=/home/ltrioschi/development/liferay-osgi/liferay-ce-portal-7.1.0-ga1/osgi/state/org.eclipse.osgi/1014/data
  "Registered Services"
    {it.peernetwork.lr.pilot.testservices.UselessService}={service.id=1607, service.bundleid=1014, service.scope=singleton}
  No services in use.
  Exported packages
    it.peernetwork.lr.pilot.testservices; version="7.1.0"[exported]
  Imported packages
    com.liferay.expando.kernel.exception; version="1.0.0" <org.eclipse.osgi_3.10.200.v20150831-0856 [0]>
    com.liferay.expando.kernel.model; version="1.1.0" <org.eclipse.osgi_3.10.200.v20150831-0856 [0]>
    com.liferay.expando.kernel.service; version="1.1.0" <org.eclipse.osgi_3.10.200.v20150831-0856 [0]>
    com.liferay.portal.kernel.exception; version="7.2.0" <org.eclipse.osgi_3.10.200.v20150831-0856 [0]>
    com.liferay.portal.kernel.model; version="2.0.0" <org.eclipse.osgi_3.10.200.v20150831-0856 [0]>
    org.osgi.framework; version="1.8.0" <org.eclipse.osgi_3.10.200.v20150831-0856 [0]>
  No fragment bundles
  No required bundles

Затем я написал портлет, который требует эту службу,Файл bnd.dnd

Bundle-Name: it.peernetwork.lr.pilot.test-portlet
Bundle-SymbolicName: pilot--test-portlet
Bundle-Version: 7.1.0

Import-Package: \
    it.peernetwork.lr.pilot.testservices;version=[7.1.0],\
    *

-metatype: *

. После развертывания он корректно загружает службу и использует ее без проблем.

Теперь ... моя проблема в том, что мне нужна новая версияслужбы, но я не хочу отменять текущую версию.

Поэтому я написал новую версию службы и новый файл bnd.bnd

Bundle-Name: it.peernetwork.lr.pilot.test-services
Bundle-SymbolicName: pilot--test-services
Bundle-Version: 7.1.1
Bundle-Activator: it.peernetwork.lr.pilot.testservices.impl.TestServicesActivator
Export-Package: it.peernetwork.lr.pilot.testservices

(единственное отличие состоит в том, чтоBundle-Version)

После упаковки единственным отличием в файле манифеста является Export-Package строка

Export-Package: it.peernetwork.lr.pilot.testservices;version="7.1.1"

, и он выглядит так, как будто он плавно развертывается в ОСГИ

g! lb pilot
START LEVEL 20
   ID|State      |Level|Name
 1014|Active     |   10|it.peernetwork.lr.pilot.test-services (7.1.0)
 1015|Active     |   10|it.peernetwork.lr.pilot.test-services (7.1.1)

но с командой bundle ___NEW_BUNDLE_ID___ я получаю

No exported packages

вместо

Exported packages
  it.peernetwork.lr.pilot.testservices; version="7.1.1"[exported]

(что я ожидал).Это означает (для меня), что пакет развернут, но ни одна из его служб не предоставляется.

Затем я обновил свой пакет портлетов (bnd.bnd) следующим образом

Bundle-Name: it.peernetwork.lr.pilot.test-portlet
Bundle-SymbolicName: pilot--test-portlet
Bundle-Version: 7.1.0

Import-Package: \
    it.peernetwork.lr.pilot.testservices;version=[7.1.1],\
    *

-metatype: *

(измененоверсия в Import-Package) и развернута на ОСГИ.Развертывание было правильным, но оно все еще использует старую версию пакета услуг (7.1.0), даже если Import-Package объявляет версию 7.1.1.Он не выдает ошибку из-за «отсутствующей» запрошенной версии сервиса.

Может кто-нибудь дать мне несколько советов о том, что я делаю неправильно?

Заранее спасибо.


ОБНОВЛЕНИЕ 1

Зависимости в файле build.gradle были обновлены соответственно версии, указанной в bnd.bnd.


ОБНОВЛЕНИЕ 2

@ quatax

Обновленный файл манифеста пакета портлетов содержит Import-Package: it.peernetwork.lr.pilot.testservices;version="[7.1.1]" (за ним следуют все другие необходимые операции импорта) ... мне кажется правильным ...


ОБНОВЛЕНИЕ 3

@ Нил Бартлетт (версия службы обновлена ​​до 8.0.0)

Я обновил pilot--test-services Настройка файла bnd.bnd Bundle-Version: 8.0.0.Весь файл bnd.bnd

Bundle-Name: it.peernetwork.lr.pilot.test-services
Bundle-SymbolicName: pilot--test-services
Bundle-Version: 8.0.0
Bundle-Activator: it.peernetwork.lr.pilot.testservices.impl.TestServicesActivator
Export-Package: it.peernetwork.lr.pilot.testservices

Файл манифеста

Manifest-Version: 1.0
Bnd-LastModified: 1543316524201
Bundle-Activator: it.peernetwork.lr.pilot.testservices.impl.TestServic
 esActivator
Bundle-ClassPath: .,lib/pn--logger-7.1.0.jar,lib/pn--services-base-7.1
 .0.jar,lib/pn--prop-files-7.1.0.jar,lib/gson-2.8.5.jar,lib/pn--expand
 o-values-7.1.0.jar
Bundle-ManifestVersion: 2
Bundle-Name: it.peernetwork.lr.pilot.test-services
Bundle-SymbolicName: pilot--test-services
Bundle-Version: 8.0.0
Created-By: 1.8.0_191 (Oracle Corporation)
Export-Package: it.peernetwork.lr.pilot.testservices;version="8.0.0"
Import-Package: com.liferay.expando.kernel.exception;version="[1.0,2)"
 ,com.liferay.expando.kernel.model;version="[1.1,2)",com.liferay.expan
 do.kernel.service;version="[1.1,2)",com.liferay.portal.kernel.excepti
 on;version="[7.2,8)",com.liferay.portal.kernel.model;version="[2.0,3)
 ",it.peernetwork.lr.pilot.testservices,org.osgi.framework;version="[1
 .8,2)"
Javac-Debug: on
Javac-Deprecation: off
Javac-Encoding: UTF-8
Private-Package: it.peernetwork.lr.pilot.test.services.impl,it.peernet
 work.lr.pilot.testservices.impl,it.peernetwork.lr.pilot.testservices.
 x,lib,it.peernetwork.lr.logger,it.peernetwork.lr.servicesbase,it.peer
 network.lr.propfiles,it.peernetwork.lr.propfiles.utils,com.google.gso
 n,com.google.gson.annotations,com.google.gson.internal,com.google.gso
 n.internal.bind,com.google.gson.internal.bind.util,com.google.gson.in
 ternal.reflect,com.google.gson.reflect,com.google.gson.stream,it.peer
 network.lr.expandovalues
Require-Capability: osgi.ee;filter:="(&(osgi.ee=JavaSE)(version=1.8))"
Tool: Bnd-3.2.0.201605172007

.Когда я его развертываю, кажется, что все в порядке (запускается и статус «Активен»), но bundle ___ID___ говорит No exported packages

Затем я обновил pilot--test-portlet build.gradle, установив правильную версию зависимости (8.0.0).В файле манифеста написано Import-Package: it.peernetwork.lr.pilot.testservices;version="[8.0,9).При развертывании этого пакета он не запускается (состояние «Установлено» и ошибка Unresolved requirement: Import-Package: it.peernetwork.lr.pilot.testservices; version="[8.0.0,9.0.0)")


ОБНОВЛЕНИЕ 4 - - РАЗРЕШЕНО Большое спасибо @Neil.Благодаря вашим советам я решил свою проблему.Правильный совет был this .

. Явное объявление

Import-Package: it.peernetwork.lr.pilot.testservices;version="[7.2,8)",\
        *

в файле pilot--test-services bnd.bnd (сам импорт, с подходящим диапазоном версий)заставляет osgi правильно экспортировать пакет и при необходимости загружает правильные экземпляры класса.

Полный файл bnd.bnd -

Bundle-Name: it.peernetwork.lr.pilot.test-services
Bundle-SymbolicName: pilot--test-services
Bundle-Version: 7.2.0
Bundle-Activator: it.peernetwork.lr.pilot.testservices.impl.TestServicesActivator
Export-Package: it.peernetwork.lr.pilot.testservices

Import-Package: it.peernetwork.lr.pilot.testservices;version="[7.2,8)",\
        *

В pilot--test-portlet * * файле 1123 *, который был только у меняобновить версию зависимости

compileOnly group: "it.peernetwork.lr", name: "pilot--test-services", version: "7.2.0"

Я пробовал с версией 7.1.0, 7.2.0 и 8.0.0 и работает без сбоев.Все пакеты "служб" развернуты на OSGI.Развертывание пакета портлета с различными версиями зависимостей всегда требует правильной услуги.

Еще раз спасибо.

1 Ответ

0 голосов
/ 22 ноября 2018

Я рекомендую удалить инструкцию Import-Package из вашего файла bnd.bnd для пакета pilot--test-portlet.В этом нет необходимости: bnd сгенерирует все необходимые операции импорта на основе фактических требований в вашем коде.

Исходный пакет pilot--test-services экспортирует и импортирует пакет it.peernetwork.lr.pilot.testservices.Это правильно, когда ваш пакет использует сам пакет в дополнение к его экспорту.Поэтому, когда вы устанавливаете оба v7.1.0 и v7.1.1, пакет v7.1.0 будет импортировать пакет из другой версии вместо экспорта более старой версии.pilot--test-portlet правильно импортирует из версии 7.1.1.

Другими словами, все здесь работает так, как должно.

...