我设法将标准groovy控制台嵌入到Felix中,并公开了一些变量(即BundleContext等)。osgi中的groovy控制台
然而,“第一”开始了我的蓝图捆绑的,我得到这个错误:
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' 属性;一个库或虚拟机的bug可能会导致错误的类加载器加载类错误 。对于 保留模块性,第一个 方法更可取。 *
我敢肯定,与选项2,错误就会消失。
但是,我的问题是...如果sun.reflect
未导入,为什么groovy控制台显示后,我重新启动捆绑?感谢具有此类经历的任何人的建议。
感谢您的回应。将“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]”。如果有人知道如何找出更多关于“动态电线”的话,将不胜感激。 – kctang 2011-05-08 17:40:34