【问题标题】:I've already added tools.jar in classpath, why still java.lang.NoClassDefFoundError: com.sun.jdi.Bootstrap thrown?我已经在类路径中添加了 tools.jar,为什么仍然抛出 java.lang.NoClassDefFoundError: com.sun.jdi.Bootstrap?
【发布时间】:2012-07-01 18:43:39
【问题描述】:

我正在使用javassist的HotSwap功能,它需要类路径中的tools.jar,所以我在启动我的OSGi应用程序时添加了-cp tools.jar。但是当我在其中一个包的代码中new HotSwap() 时,

 java.lang.NoClassDefFoundError: com.sun.jdi.Bootstrap

被抛出。 com.sun.jdi.Bootstrap 在 tools.jar 中,我已经在类路径中添加了它,并且我验证了它是否有效,因为如果没有,以下代码将不起作用:

JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();

HotSwapper的Classloader无法加载classcom.sun.jdi.Bootstrap?那为什么它在我的 Eclipse 环境中可以正常工作呢?(我在 Build path 的库中添加了 tools.jar)

关于为什么 NoClassDefFoundError,任何线索表示赞赏。

【问题讨论】:

  • osgi 有一个“执行环境”的概念,它是一个包列表。您的 osgi 框架不允许您访问系统包中的内容。
  • 在 Eclipse 中运行有点不同,eclipse 更简单,因为它需要所有这些开发人员的东西。
  • @J-16 SDiZ 谢谢,但我怎样才能访问它?因为HotSwapper 需要它。

标签: osgi classloader javassist


【解决方案1】:

您必须确保系统捆绑包导出此包。例如,在 Felix 中,文件 jre.properties 定义了系统包导出的包。在那里添加包 com.sun.jdi,它应该可以工作。

在 Eclipse 中,这是在 config.ini 中完成的。您可以使用 org.osgi.framework.system.packages.extra= 定义要导出的其他包。我宁愿不使用 boodelegation=* 因为它也可能导出不需要的包。见:

http://www.eclipse.org/forums/index.php/m/734358/

http://wiki.eclipse.org/Equinox_Boot_Delegation

【讨论】:

  • 我在 Equinox 环境中找不到这样的 jre.properties 文件。它会在哪个文件夹中或里面有什么?我可以在文件夹中搜索。
  • 对于像 eclipse 这样的 equinox,它是一个属性 org.osgi.framework.system.packages,您可以设置它来导出所需的包。如果您只想将包添加到默认包,请使用 org.osgi.framework.system.packages.extra
【解决方案2】:

在 Equinox 中,您可以将 Boot Delegation 设置为 * 以获得对 bootclass 中所有类的访问权限,请参阅 this wiki 了解详细信息。在 3.2 中,在 config.ini 中是 osgi.compatibility.bootdelegation=true

【讨论】:

  • 如果你这样做了,你在很大程度上失去了模块化的优势,因为你在其中刺了一个大洞......
猜你喜欢
  • 2012-12-07
  • 1970-01-01
  • 2012-01-15
  • 1970-01-01
  • 2016-12-31
  • 1970-01-01
  • 2020-08-08
  • 2023-02-24
  • 1970-01-01
相关资源
最近更新 更多