Я довольно новичок в мире 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.Развертывание пакета портлета с различными версиями зависимостей всегда требует правильной услуги.
Еще раз спасибо.