Феликс Оболочка 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

Не знаю, буду ли я использовать этот подход или нет. По крайней мере, я знаю, что мне нужно делать, если я хочу использовать этот подход.

Другие вопросы по тегам