2011-04-27 73 views
0

我设法将标准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控制台。

堆栈跟踪指示以下选项来解决这个问题:

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

  2. 将包'sun.reflect'添加到 'org.osgi.framework.bootdelegation' 属性;一个库或虚拟机的bug可能会导致错误的类加载器加载类错误 。对于 保留模块性,第一个 方法更可取。 *

我敢肯定,与选项2,错误就会消失。

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

回答

0

选项1是正确的解决方案。你的包依赖于包sun.reflect,所以你应该在Import-Package语句中明确指出。

我不知道为什么控制台可能会显示重新启动后。如果无法加载sun.reflect软件包,它可能会自行执行内部“故障切换”。我不会太担心这方面的问题,只需通过添加导入来实现它。

+0

感谢您的回应。将“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