【问题标题】:groovy console in osgiosgi 中的 groovy 控制台
【发布时间】:2011-04-27 00:39:21
【问题描述】:

我设法将标准的 groovy 控制台嵌入到 Felix 并公开了许多变量(即 BundleContext 等)。

但是,在“第一次”启动我的蓝图包时,我收到了这个错误:

Caused by: java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)[:1.6.0_24]
  ... ... ...
    at groovy.util.FactoryBuilderSupport.callAutoRegisterMethods(FactoryBuilderSupport.java:202)[groovy-all-1.7.8.jar:1.7.8]
    ... 42 more
Caused by: java.lang.NoClassDefFoundError: sun/reflect/ConstructorAccessorImpl
    at sun.misc.Unsafe.defineClass(Native Method)[:1.6.0_24]
    ... ... ...
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)[:1.6.0_24]
    at java.lang.reflect.Constructor.newInstance(Constructor.java:513)[:1.6.0_24]
    ... ... ...
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:153)[groovy-all-1.7.8.jar:1.7.8]
    at groovy.swing.SwingBuilder.registerActionButtonWidgets(SwingBuilder.groovy:94)[groovy-all-1.7.8.jar:1.7.8]
    ... 47 more
Caused by: java.lang.ClassNotFoundException: *** Package 'sun.reflect' is not imported by bundle groovy-all [18], nor is there any bundle that exports package 'sun.reflect'. However, the class 'sun.reflect.ConstructorAccessorImpl' is available from the system class loader. There are two fixes: 1) Add package 'sun.reflect' to the 'org.osgi.framework.system.packages.extra' property and modify bundle groovy-all [18] to import this package; this causes the system bundle to export class path packages. 2) Add package 'sun.reflect' to the 'org.osgi.framework.bootdelegation' property; a library or VM bug can cause classes to be loaded by the wrong class loader. The first approach is preferable for preserving modularity. ***
    at org.apache.felix.framework.ModuleImpl$ModuleClassLoader.loadClass(ModuleImpl.java:1782)[org.apache.felix.framework-3.0.9.jar:]
    at java.lang.ClassLoader.loadClass(ClassLoader.java:248)[:1.6.0_24]
    at org.codehaus.groovy.runtime.callsite.CallSiteClassLoader.loadClass(CallSiteClassLoader.java:51)[groovy-all-1.7.8.jar:1.7.8]
    at java.lang.ClassLoader.loadClass(ClassLoader.java:248)[:1.6.0_24]
    at org.codehaus.groovy.reflection.ClassLoaderForClassArtifacts.loadClass(ClassLoaderForClassArtifacts.java:58)[groovy-all-1.7.8.jar:1.7.8]
    ... 65 more
Caused by: java.lang.ClassNotFoundException: sun.reflect.ConstructorAccessorImpl not found by groovy-all [18]
    at org.apache.felix.framework.ModuleImpl.findClassOrResourceByDelegation(ModuleImpl.java:787)[org.apache.felix.framework-3.0.9.jar:]
    at org.apache.felix.framework.ModuleImpl.access$400(ModuleImpl.java:71)[org.apache.felix.framework-3.0.9.jar:]
    at org.apache.felix.framework.ModuleImpl$ModuleClassLoader.loadClass(ModuleImpl.java:1768)[org.apache.felix.framework-3.0.9.jar:]
    ... 69 more

抛出异常后,我的包现在处于活动状态。但是,控制台不显示。如果我停止并再次启动捆绑包,错误将不再显示,我可以看到并使用我的 swing groovy 控制台。

堆栈跟踪指示了解决此问题的以下选项:

  1. 将包“sun.reflect”添加到 'org.osgi.framework.system.packages.extra' 属性和修改包 groovy-all [18] 导入这个 包裹;这导致系统 捆绑导出类路径 包。

  2. 将包“sun.reflect”添加到 'org.osgi.framework.bootdelegation' 财产;库或 VM 错误可以 导致类被加载 错误的类加载器。首先 方法更适用于 保持模块化。 *

我很确定使用选项 2,错误会消失。

但是,我的问题是...如果未导入 sun.reflect,为什么在我重新启动捆绑包后会显示 groovy 控制台?感谢任何有这种经验的人的建议。

【问题讨论】:

    标签: groovy osgi


    【解决方案1】:

    选项 1 是解决问题的正确方法。您的捆绑包依赖于包 sun.reflect,因此您应该在 Import-Package 语句中明确说明。

    我不知道为什么重新启动后控制台可能会显示。如果无法加载sun.reflect 包,它可能会执行自己的内部“故障转移”。我不会太担心这方面,只需通过添加导入来使其工作即可。

    【讨论】:

    • 感谢您的回复。在框架的配置图中添加“org.osgi.framework.system.packages.extra=sun.reflect”解决了这个问题。奇怪的是,检查 groovy-all 的清单文件似乎没有导入 sun.reflect。 Felix 调试日志指出“[Blueprint Extender: 2] felix.wire - DYNAMIC WIRE: [39.0] package; (package=sun.reflect) -> [0]”。如果有人知道如何了解有关“动态线”的更多信息,将不胜感激。
    猜你喜欢
    • 2014-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-26
    • 2014-11-02
    • 1970-01-01
    • 2013-10-05
    • 1970-01-01
    相关资源
    最近更新 更多