簡體   English   中英

Felix GoGo Shell拋出MalformedURLException:未知協議:Equinox中的bundleresource

[英]Felix GoGo Shell throws MalformedURLException: unknown protocol: bundleresource in Equinox

我正在編寫一個名為ZAP的Java應用程序的擴展 擴展名是一個內嵌 Equinox捆綁包( org.eclipse.osgi )的胖子/超級瓶子。 此jar子目錄bundles中還包含其他bundles 如何嵌入OSGi中所述,將啟動OSGi框架。

我試圖按照Eclipse的“控制台外殼”文檔中概述的步驟 ,使Felix GoGo外殼正常工作。 它指定以下必需的捆綁包:

  • org.apache.felix.gogo.command
  • org.apache.felix.gogo.runtime
  • org.apache.felix.gogo.shell
  • org.eclipse.equinox.console

除了Equinox / org.eclipse.osgi 由於Equinox不在類路徑上,因此我將org.osgi.framework.system.packages.extra配置設置為Equinox捆綁軟件指定的Export-Package值, 在此處可見。

一旦框架處於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)

看來GoGo並未使用Equinox URL處理程序。 我注意到以下與它們相關的軟件包不在Equinox的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利用Equinox的自定義URL處理程序?

更新1:也許紅鯡魚

在隨機故障排除中,我想執行此處概述的最終着色罐子。 我在同一目錄中復制了原始的org.eclipse.osgi包和陰影的jar。 有一個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非常無知,這是我第一次親身體驗。 但是,我希望有陰影的jar的執行方式與股票Equinox jar相同。 因為我不明白為什么會有區別,所以我要去那里挖掘,因為那里沒有更好的挖掘點...

更新2:有關類路徑的Equinox可以解決問題

我通過其lib目錄將Equinox捆綁軟件添加到ZAP的類路徑中,並將其從內聯到擴展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> 

潛在的問題可能是如何內聯jar,可能與MANIFEST.MF文件有關。 可能相關,我現在不需要為org.osgi.framework.system.packages.extra提供值。

我將不回答這個問題,因為最初的目的是將OSGi庫作為陰影工件包含在內。 也許bndtools可以幫助您嗎?

好吧,似乎缺乏描述性的META-INF/MANIFEST.MF是罪魁禍首:

  • 刪除( jar uM... ),然后更新( jar um... ),將有陰影的jar的MANIFEST.MF復制為Equinox清單的副本,修改Bundle-Version編號以17661700結束。
  • 從ZAP的類路徑中刪除了Equinox

然后我按原樣加載了擴展程序。 GoGo shell啟動:

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的)效果很好。 它也適用於直接的命令行測試:

$ 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

不,我是否會使用這種方法。 至少我知道如果我想使用這種方法該做什么。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM