【发布时间】: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 控制台。
堆栈跟踪指示了解决此问题的以下选项:
将包“sun.reflect”添加到 'org.osgi.framework.system.packages.extra' 属性和修改包 groovy-all [18] 导入这个 包裹;这导致系统 捆绑导出类路径 包。
将包“sun.reflect”添加到 'org.osgi.framework.bootdelegation' 财产;库或 VM 错误可以 导致类被加载 错误的类加载器。首先 方法更适用于 保持模块化。 *
我很确定使用选项 2,错误会消失。
但是,我的问题是...如果未导入 sun.reflect,为什么在我重新启动捆绑包后会显示 groovy 控制台?感谢任何有这种经验的人的建议。
【问题讨论】: