Osgi I';我们已经在类路径中添加了tools.jar,为什么仍然抛出java.lang.NoClassDefFoundError:com.sun.jdi.Bootstrap?

Osgi I';我们已经在类路径中添加了tools.jar,为什么仍然抛出java.lang.NoClassDefFoundError:com.sun.jdi.Bootstrap?,osgi,classloader,javassist,Osgi,Classloader,Javassist,我使用的是的HotSwap函数,它需要类路径中的tools.jar,所以我在启动OSGi应用程序时添加了-cp tools.jar。但是当我在其中一个bundle的代码中new HotSwap()时 java.lang.NoClassDefFoundError: com.sun.jdi.Bootstrap 被扔了com.sun.jdi.Bootstrap在tools.jar中,我已经在classpath中添加了它,并且我还验证了它是否工作,因为如果不工作,以下代码将无法工作: JavaCom

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

 java.lang.NoClassDefFoundError: com.sun.jdi.Bootstrap
被扔了
com.sun.jdi.Bootstrap
在tools.jar中,我已经在classpath中添加了它,并且我还验证了它是否工作,因为如果不工作,以下代码将无法工作:

JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
热插拔器的类加载器无法加载类
com.sun.jdi.Bootstrap
?那么为什么它能在我的Eclipse环境中正常工作呢?(我在构建路径的库中添加了tools.jar)


关于NoClassDefFoundError的原因,请提供任何线索。

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

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


在Equinox中,您可以将引导委派设置为
*
以获得对bootclass中所有类的访问权限,有关详细信息,请参阅。在3.2中,在
config.ini

中,它是
osgi.compatibility.bootdelegation=true
,osgi有一个“执行环境”的概念,这是一个包列表。您的osgi框架将不允许您访问来自系统包的内容。在Eclipse中运行有点不同,Eclipse更容易释放,因为它需要所有的develer工具。@J-16 SDiZ谢谢,但我如何访问它?因为
HotSwapper
需要它。我在Equinox环境中找不到这样的
jre.properties
文件。它将是什么样的文件夹或里面是什么?我可以在文件夹中搜索。对于equinox,比如eclipse,它是一个属性org.osgi.framework.system.packages,您可以设置为导出所需的包。如果您只想将包添加到默认包中,请使用org.osgi.framework.system.packages.extra。如果您这样做,您将在很大程度上失去模块化的优势,因为您在其中戳了一个大洞。。。