osgi中的groovy控制台

osgi中的groovy控制台,groovy,osgi,Groovy,Osgi,我设法将标准groovy控制台嵌入到Felix中,并公开了许多变量,如BundleContext等 然而,在我的blueprint捆绑包第一次启动时,我遇到了以下错误: Caused by: java.lang.reflect.InvocationTargetException at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)[:1.6.0_24] ... ... ... at groovy.util

我设法将标准groovy控制台嵌入到Felix中,并公开了许多变量,如BundleContext等

然而,在我的blueprint捆绑包第一次启动时,我遇到了以下错误:

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控制台

堆栈跟踪指示以下修复此问题的选项:

将包“sun.reflect”添加到 'org.osgi.framework.system.packages.extra' 属性和修改包 groovy all[18]来导入此 包裹这会导致系统崩溃 绑定以导出类路径 包裹

将包“sun.reflect”添加到 'org.osgi.framework.bootdelegation' 所有物库或虚拟机错误可能会 使类由 错误的类装入器。第一 这种方法更适合于 保持模块性*

我很肯定,有了选项2,错误就会消失

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

选项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=sun.reflect->[0]。如果有人知道如何了解更多有关dynamic wire的信息,将不胜感激。