Феликс Оболочка GoGo выдает MalformedURLException: неизвестный протокол: пакет ресурсов в Equinox
Я пишу расширение для Java-приложения под названием ZAP. Расширение представляет собой толстый / убер-кувшин с комплектом Equinox (org.eclipse.osgi
) Дополнительные пакеты также включены в этот jar, в подкаталог bundles
, Каркас OSGi запускается, как описано в разделе Как встраивать OSGi.
Я пытаюсь заставить работать оболочку Felix GoGo, следуя инструкциям, изложенным в документации Eclipse "Console Shell". Он указывает следующие обязательные пакеты:
org.apache.felix.gogo.command
org.apache.felix.gogo.runtime
org.apache.felix.gogo.shell
org.eclipse.equinox.console
В дополнение к Равноденствие / org.eclipse.osgi
, Так как Равноденствие не находится на пути к классам, я установил org.osgi.framework.system.packages.extra
Конфигурация к Export-Package
значение, указанное в связке Equinox, видимое здесь.
Когда платформа находится в состоянии ACTIVE, я вижу следующую трассировку стека в Eclipse (или через командную строку вне Eclipse):
Starting OSGi framework...
OSGi framework state: 32
gogo: MalformedURLException: unknown protocol: bundleresource
java.net.MalformedURLException: unknown protocol: bundleresource
at java.net.URL.<init>(URL.java:593)
at java.net.URL.<init>(URL.java:483)
at java.net.URL.<init>(URL.java:432)
at java.net.URI.toURL(URI.java:1089)
at org.apache.felix.gogo.shell.Shell.readScript(Shell.java:209)
at org.apache.felix.gogo.shell.Shell.source(Shell.java:192)
at org.apache.felix.gogo.shell.Shell.gosh(Shell.java:109)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at org.apache.felix.gogo.runtime.Reflective.invoke(Reflective.java:137)
at org.apache.felix.gogo.runtime.CommandProxy.execute(CommandProxy.java:82)
at org.apache.felix.gogo.runtime.Closure.executeCmd(Closure.java:477)
at org.apache.felix.gogo.runtime.Closure.executeStatement(Closure.java:403)
at org.apache.felix.gogo.runtime.Pipe.run(Pipe.java:108)
at org.apache.felix.gogo.runtime.Closure.execute(Closure.java:183)
at org.apache.felix.gogo.runtime.Closure.execute(Closure.java:120)
at org.apache.felix.gogo.runtime.CommandSessionImpl.execute(CommandSessionImpl.java:89)
at org.apache.felix.gogo.shell.Activator.run(Activator.java:75)
at java.lang.Thread.run(Thread.java:745)
Похоже, что обработчики URL Equinox не используются GoGo. Я заметил, что следующие пакеты, связанные с ними, не были в Equinox's Export-Package
:
org.eclipse.osgi.storage.url
org.eclipse.osgi.storage.url.bundleresource
org.eclipse.osgi.storage.url.bundleentry
Так что я также включил тех, кто в org.osgi.framework.system.packages.extra
список пакетов. Это не помогло.
В противном случае комплекты устанавливаются и запускаются без каких-либо явных ошибок.
Как мне заставить GoGo использовать пользовательские обработчики URL Equinox?
Обновление 1: возможно красная сельдь
При случайном устранении неполадок я хотел выполнить последний заштрихованный сосуд, как описано здесь. Я скопировал оба оригинала org.eclipse.osgi
расслоение и затененная банка в одном каталоге. Есть configuration/config.ini
указав пакеты для загрузки.
Выполнение стоковой связки вызывает консоль:
$ java -cp ~/.p2/pool/plugins/org.eclipse.osgi_3.11.0.v20160121-2005.jar org.eclipse.core.runtime.adaptor.EclipseStarter -console
osgi> ss
"Framework is launched."
id State Bundle
0 ACTIVE org.eclipse.osgi_3.11.0.v20160121-2005
1 ACTIVE org.apache.felix.gogo.runtime_0.10.0.v201209301036
2 ACTIVE org.apache.felix.gogo.command_0.10.0.v201209301215
3 ACTIVE org.apache.felix.gogo.shell_0.10.0.v201212101605
4 ACTIVE org.eclipse.equinox.console_1.1.200.v20150929-1405
osgi> exit
Really want to stop Equinox? (y/n; default=y)
Выполняя затененную баночку, не так уж и много
java -cp semiotics-alpha-1.zap org.eclipse.core.runtime.adaptor.EclipseStarter -console
java.lang.NullPointerException: A null service reference is not allowed.
at org.eclipse.osgi.internal.framework.BundleContextImpl.getService(BundleContextImpl.java:617)
at org.eclipse.core.runtime.adaptor.EclipseStarter.startup(EclipseStarter.java:299)
at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:231)
at org.eclipse.core.runtime.adaptor.EclipseStarter.main(EclipseStarter.java:208)
Это может быть полная красная сельдь... Я очень не осведомлен об OSGi, это мой первый практический опыт работы с ним. Тем не менее, я ожидаю, что затененная банка будет работать не иначе, как обычная банка Равноденствия. Так как я не понимаю, почему есть разница, я буду копать там из-за отсутствия лучших мест для копания...
Обновление 2: Равноденствие на пути к классам работает вокруг проблемы
Я добавил пакет Equinox в classpath ZAP через его lib
каталог и удалил его из встроенного в расширение jar. Делая это и корректируя ServiceLoader.load
Призыв не включать загрузчик классов (по умолчанию системный загрузчик классов) работает:
Starting bundle: org.apache.felix.gogo.shell_0.10.0.v201212101605 [1]
Starting bundle: org.eclipse.equinox.console_1.1.100.v20141023-1406 [2]
Starting bundle: org.apache.felix.gogo.command_0.10.0.v201209301215 [3]
Starting bundle: org.eclipse.emf.ecore_2.11.2.v20160208-0816 [4]
Starting bundle: org.eclipse.emf.common_2.11.1.v20160208-0816 [5]
Starting bundle: org.apache.felix.gogo.runtime_0.10.0.v201209301036 [6]
osgi> ss
"Framework is launched."
id State Bundle
0 ACTIVE org.eclipse.osgi_3.11.0.v20160121-2005
1 ACTIVE org.apache.felix.gogo.shell_0.10.0.v201212101605
2 ACTIVE org.eclipse.equinox.console_1.1.100.v20141023-1406
3 ACTIVE org.apache.felix.gogo.command_0.10.0.v201209301215
4 ACTIVE org.eclipse.emf.ecore_2.11.2.v20160208-0816
5 ACTIVE org.eclipse.emf.common_2.11.1.v20160208-0816
6 ACTIVE org.apache.felix.gogo.runtime_0.10.0.v201209301036
osgi>
Основная проблема может заключаться в том, как вставляется баночка, возможно, связанная с MANIFEST.MF
файл. Возможно связано, мне теперь не нужно указывать значение для org.osgi.framework.system.packages.extra
,
Я собираюсь оставить этот вопрос без ответа, так как изначально предполагалось включить библиотеку OSGi в качестве затененного артефакта. Может быть, bndtools может помочь?
1 ответ
ОК, кажется, отсутствие описательного META-INF/MANIFEST.MF
был виновником
- Удалено (
jar uM...
) затем обновляется (jar um...
) затененная банкаMANIFEST.MF
быть копией манифеста Equinox, изменяяBundle-Version
номер до конца1766
против1700
, - Удалено Равноденствие из пути к классу ZAP
Затем я загрузил расширение как есть. Оболочка GoGo запускается:
osgi> 13177 [AWT-EventQueue-0] INFO org.parosproxy.paros.control.Control - New Session
ss
"Framework is launched."
id State Bundle
0 ACTIVE org.eclipse.osgi_3.10.102.v20160118-1766
1 ACTIVE org.apache.felix.gogo.runtime_0.10.0.v201209301036
2 ACTIVE org.eclipse.emf.common_2.11.1.v20160208-0816
3 ACTIVE org.apache.felix.gogo.shell_0.10.0.v201212101605
4 ACTIVE org.eclipse.equinox.console_1.1.100.v20141023-1406
5 ACTIVE org.apache.felix.gogo.command_0.10.0.v201209301215
6 ACTIVE org.eclipse.emf.ecore_2.11.2.v20160208-0816
osgi>
Я вижу, что системный комплект заканчивается тем же измененным номером версии, так что он выполняет добавленные MANIFEST.MF
, Таким образом, основной проблемой был неполный системный манифест. Копирование существующего (Equinox's) работает достаточно хорошо. Это также работает для прямого теста командной строки:
$ java -cp semiotics-alpha-1.zap org.eclipse.core.runtime.adaptor.EclipseStarter -console
osgi> exit
Really want to stop Equinox? (y/n; default=y) y
Не знаю, буду ли я использовать этот подход или нет. По крайней мере, я знаю, что мне нужно делать, если я хочу использовать этот подход.