【问题标题】:Use restricted class in an OSGi Bundle在 OSGi Bundle 中使用受限类
【发布时间】:2014-02-18 20:27:35
【问题描述】:

为了使用 Endpoint 使用 SSL 发布,我需要访问包 com.sun.net.httpserver.* 下的类

使用 Eclipse IDE,我找到了使用这些类的方法。但是导出捆绑包并在另一个 Equinox OSGi 安装中运行它们我无法启动捆绑包并引发以下错误:

java.lang.NoClassDefFoundError: com/sun/net/httpserver/HttpsConfigurator

有人知道如何解决这个问题吗?

谢谢!

【问题讨论】:

  • 您必须将 com.sun.net.httpserver 作为导入包放入您的包中,并且在容器内您必须有一些包,用于导出此包。
  • 下面马塞尔的解决方案确实是您问题的解决方案,但恕我直言,这不是要走的路(而且确实需要这样做的可能性很小)。 com.sun.* 包是私有的,应该被视为私有的。您的问题可能有一个更标准的解决方案。如果您详细说明问题,您可能会得到更好的解决方案。

标签: osgi


【解决方案1】:

您所指的包是 JDK 的一部分。您需要公开它,使其在 OSGi 中可用,您有两种选择:

第一个也是大多数情况下首选的选项是通过系统捆绑包公开这个包。 OSGi 框架有一个属性,您可以设置它来执行此操作:

org.osgi.framework.system.packages.extra=...

作为它的值,在框架已经公开的包之上,您为其提供了一个逗号分隔的要公开的包列表。在您的情况下,至少是 com.sun.net.httpserver,但您可能需要更多的软件包。在这种情况下,还要确保使用此包的捆绑包导入此包。

第二个选项是使用引导委托机制。它只能作为最后的手段使用,因为它破坏了模块化,如果不小心使用它可能会导致其他问题。同样,这是您需要设置的属性:

org.osgi.framework.bootdelegation=*

在这里,您可以提供应由引导类加载器加载的包的逗号分隔列表。支持通配符(如上面的示例所示),但鼓励您尽可能具体,因此在您的情况下,例如使用 com.sun.* 作为值。

【讨论】:

  • 我在运行 Eclipse Equinox 的 KURA 下遇到了同样的问题,如何设置系统捆绑包的属性?
猜你喜欢
  • 2012-04-17
  • 2011-09-21
  • 1970-01-01
  • 2011-05-05
  • 2014-01-14
  • 1970-01-01
  • 2011-06-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多