当前位置: 首页 > 知识库问答 >
问题:

Felix GoGo Shell抛出MalformedURLException:未知协议:bundleresource in Equinox

丁钟展
2023-03-14

我正在编写一个名为ZAP的Java应用程序的扩展。该扩展是一个fat/uber jar,内联了Equinox包(org.eclipse.osgi)。另外的bundle也包含在这个jar中,在bundles的子目录中。正如《如何嵌入OSGi》中所述,正在启动OSGi框架。

我正试图让Felix GoGo shell按照Eclipse“控制台外壳”文档中概述的步骤工作。它指定了以下所需的捆绑包:

  • org.apache.felix.gogo。命令
  • org.apache.felix.gogo。运行时
  • org.apache.felix.gogo。壳牌
  • org.eclipse.equinox.console

除了Equinox/之外,org.eclipse.osgi。由于Equinox不在类路径上,我设置了<code>org.osgi.framework.system.packages。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)

似乎Equinox URL处理html" target="_blank">程序没有被GoGo使用。我注意到以下与它们相关的软件包不在Equinox的导出软件包中

  • org.eclipse.osgi.storage.url
  • org.eclipse.osgi.storage.url.bundleresource
  • org.eclipse.osgi.storage.url.bundleentry

所以我也将它们包含在< code > org . OSGi . framework . system . packages . extra 包列表中。那没有帮助。

安装包,开始没有任何

我怎么让火星使用Equinox的自定义URL哈

在随机排除我想执行鳍

执行股票捆绑带来控制台:

$ 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)

执行阴影jar,与其说:

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没有什么不同。因为我不明白为什么会有差别,因为没有更好的地方可以挖,所以我要在那里挖...

我通过ZAP的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是如何内联的,可能与<code>清单有关。MF文件。可能是相关的,我现在不需要为<code>org.osgi.framework.system.packages.extra

我将对这个问题不予回答,因为最初的观点是将OSGi图书馆作为一个被遮蔽的人工制品。也许bndtools能帮上忙?

共有1个答案

储法
2023-03-14

好吧,似乎缺少一个描述性的<代码> META -

    < li >已移除(< code>jar uM...)然后更新(< code>jar um...)阴影jar的< code >清单。MF作为Equinox清单的副本,修改< code>Bundle-Version编号,以< code>1766结尾,而不是< code>1700。 < li >从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.html" target="_blank">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> 

我看到系统包以相同的修改版本号结尾,因此它是为了纪念添加的<code>MANIFEST.MF</code>。因此,潜在的问题是不完整的系统包清单。复制现有的一个(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

我不知道如果我将使用这种方法。至少我

 类似资料:
  • 如果在Spring Boot应用程序中使用,并使用协议,它将按预期工作,因为Spring Boot程序注册。例如。 复制的步骤: 1)创建Spring Boot Starter项目(例如。仅使用初学者Web)。 2)在中添加文件 在实际用例中,我不能更改,因为它来自第三方库。 尝试将复制到中,以测试错误是否是由缺少资源引起的-没有成功。

  • 我有一个脚本,它使用的Facebook向

  • cURL错误35:连接中出现未知SSL协议错误(请参阅http://curl.haxx.se/libcurl/c/libcurl-errors.html)186/var/www/api/vendor/guzzlehttp://guzzle/src/Handler/CurlFactory.php

  • 我在中添加了来自Web页面的所有链接,然后逐一点击所有URL。 代码按预期工作(它在浏览器中启动URL),因为第一个链接稍后抛出错误: Windows-7 Java-1.8.1

  • 嗨,我的pax检查失败,错误为Unknown Protocol:wrap 当我将karaf版本从3.03更改为4.04时,这个错误就开始出现了

  • 我试图通过tls连接上传一个带有显式ftp的文件,使用PHP中的cURL。使用ftp服务器的身份验证成功,但当我尝试以被动模式上载文件时,收到以下错误:“连接到server.domain.nl:21的未知SSL协议错误”。 这种情况下的问题是什么?可能是被动上载的端口被我的提供商阻止了吗?我可以更改文件上载的端口吗? 我的代码是: