[groovy-user] groovy in a hosted OSGi environment

147 views
Skip to first unread message

Anthony Bargnesi

unread,
Sep 17, 2013, 1:48:46 PM9/17/13
to us...@groovy.codehaus.org
Hello,

Groovy is loading classes from sun restricted packages (sun.reflect, sun.awt, etc.) that are not exported within the OSGi environment.  I am running groovy OSGi bundles in a hosted Apache Karaf container (plugin to cytoscape) where I do not have direct access to modifying org.osgi.framework.system.packages.extra.

I could not find much on configuring the classloader so I attempted to modify the SunClassLoader/GroovySunClassLoader classes (diff at the bottom).  The sun.* packages were still accessed in the OSGi environment however.

The unhelpful console error received is:

Unresolved constraint in bundle model.builder.ui [264]: Unable to resolve 264.0: missing requirement [264.0] package; (package=model.builder.web.api) [caused by: Unable to resolve 275.0: missing requirement [275.0] package; (package=model.builder.common.model) [caused by: Unable to resolve 270.0: missing requirement [270.0] package; (package=sun.reflect)]]
       at org.apache.felix.framework.Felix.resolveBundle(Felix.java:3564)
       at org.apache.felix.framework.Felix.startBundle(Felix.java:1797)
       at org.apache.felix.framework.BundleImpl.start(BundleImpl.java:927)
       at org.apache.felix.fileinstall.internal.DirectoryWatcher.startBundle(DirectoryWatcher.java:1244)
       at org.apache.felix.fileinstall.internal.DirectoryWatcher.startBundles(DirectoryWatcher.java:1216)
       at org.apache.felix.fileinstall.internal.DirectoryWatcher.process(DirectoryWatcher.java:505)
       at org.apache.felix.fileinstall.internal.DirectoryWatcher.run(DirectoryWatcher.java:291)


Is there a way to execute compiled groovy without loading sun.* packages?

Thanks!

Anthony Bargnesi

-----
diff --git a/src/main/org/codehaus/groovy/reflection/SunClassLoader.java b/src/main/org/codehaus/groovy/reflection/SunClassLoader.java
index 154e98d..17fa53f 100644
--- a/src/main/org/codehaus/groovy/reflection/SunClassLoader.java
+++ b/src/main/org/codehaus/groovy/reflection/SunClassLoader.java
@@ -33,26 +33,7 @@ import java.security.PrivilegedAction;
 public class SunClassLoader extends ClassLoader implements Opcodes {
     protected final Map<String,Class> knownClasses = new HashMap<String,Class>();
 
-    protected static final SunClassLoader sunVM;
-
-    static {
-        SunClassLoader res;
-        try {
-            res = AccessController.doPrivileged(new PrivilegedAction<SunClassLoader>() {
-                public SunClassLoader run() {
-                    try {
-                        return new SunClassLoader();
-                    } catch (Throwable e) {
-                        return null;
-                    }
-                }
-            });
-        }
-        catch (Throwable e) {
-            res = null;
-        }
-        sunVM = res;
-    }
+    protected static final SunClassLoader sunVM = null;
 
     protected SunClassLoader() throws Throwable {
         super (SunClassLoader.class.getClassLoader());
diff --git a/src/main/org/codehaus/groovy/runtime/callsite/GroovySunClassLoader.java b/src/main/org/codehaus/groovy/runtime/callsite/GroovySunClassLoader.java
index 19c9d37..72cd517 100644
--- a/src/main/org/codehaus/groovy/runtime/callsite/GroovySunClassLoader.java
+++ b/src/main/org/codehaus/groovy/runtime/callsite/GroovySunClassLoader.java
@@ -27,22 +27,7 @@ import java.security.PrivilegedAction;
 
 public class GroovySunClassLoader extends SunClassLoader {
 
-    public static final SunClassLoader sunVM;
-
-    static {
-            sunVM = AccessController.doPrivileged(new PrivilegedAction<SunClassLoader>() {
-                public SunClassLoader run() {
-                    try {
-                        if (SunClassLoader.sunVM != null) {
-                            return new GroovySunClassLoader();
-                        }
-                    }
-                    catch (Throwable t) {//
-                    }
-                    return null;
-                }
-            });
-    }
+    public static final SunClassLoader sunVM = null;
 
     protected GroovySunClassLoader () throws Throwable {
         super();
-----

Jochen Theodorou

unread,
Sep 17, 2013, 2:59:11 PM9/17/13
to us...@groovy.codehaus.org
Am 17.09.2013 19:48, schrieb Anthony Bargnesi:
[...]
> I could not find much on configuring the classloader so I attempted to
> modify the SunClassLoader/GroovySunClassLoader classes (diff at the
> bottom). The sun.* packages were still accessed in the OSGi environment
> however.

If modifying is ok for you then I suggest you go to
ClassLoaderForClassArtifacts and remove the if in line 52, including the
then-block. that should avoiding loading that class, unless a special
method in ReflectionUtils is used

[...]
> Is there a way to execute compiled groovy without loading sun.* packages?



[...]
you forgot the loadAbstract method, since that will create a class, that
has sun.reflect.GroovyMagic as super class, a class that does not exist

bye blackdrag

--
Jochen "blackdrag" Theodorou - Groovy Project Tech Lead
blog: http://blackdragsview.blogspot.com/
german groovy discussion newsgroup: de.comp.lang.misc
For Groovy programming sources visit http://groovy-lang.org


---------------------------------------------------------------------
To unsubscribe from this list, please visit:

http://xircles.codehaus.org/manage_email


Anthony Bargnesi

unread,
Sep 18, 2013, 4:11:28 PM9/18/13
to us...@groovy.codehaus.org
A correction on the above explanation.  Calling the SwingBuilder constructor on the third attempt does not yield an exception.

The first attempt yields an exception from registerBasicWidgets and the second attempt yields an exception from registerDataModels.

Thanks!
Anthony Bargnesi


On Wed, Sep 18, 2013 at 4:08 PM, Anthony Bargnesi <abar...@gmail.com> wrote:
It's also attempting to load sun.reflect.ConstructorAccessorImpl on bundle activation with this groovy code:

static Expando cyReference(BundleContext bc, Closure cyAct, ... cyInterfaces) {
    Expando e = new Expando()
    cyInterfaces.each {
        def impl = cyAct.call(bc, it)
        def name = it.simpleName
        e.setProperty(name[0].toLowerCase() + name[1..-1], impl)
    }
    e
}

Stacktrace:

- Error while starting bundle: file:/home/tony/work/model-builder/tools/cytoscape/work/bundles/model-builder-core-1.0.0.jar
org.osgi.framework.BundleException: Activator start error in bundle model.builder.core [169].
       at org.apache.felix.framework.Felix.activateBundle(Felix.java:1951)
       at org.apache.felix.framework.Felix.startBundle(Felix.java:1822)

       at org.apache.felix.framework.BundleImpl.start(BundleImpl.java:927)
       at org.apache.felix.fileinstall.internal.DirectoryWatcher.startBundle(DirectoryWatcher.java:1244)
       at org.apache.felix.fileinstall.internal.DirectoryWatcher.startBundles(DirectoryWatcher.java:1216)
       at org.apache.felix.fileinstall.internal.DirectoryWatcher.process(DirectoryWatcher.java:505)
       at org.apache.felix.fileinstall.internal.DirectoryWatcher.run(DirectoryWatcher.java:291)
Caused by: java.lang.NoClassDefFoundError: sun/reflect/ConstructorAccessorImpl

       at sun.misc.Unsafe.defineClass(Native Method)
       at sun.reflect.ClassDefiner.defineClass(ClassDefiner.java:63)
       at sun.reflect.MethodAccessorGenerator$1.run(MethodAccessorGenerator.java:399)
       at sun.reflect.MethodAccessorGenerator$1.run(MethodAccessorGenerator.java:396)
       at java.security.AccessController.doPrivileged(Native Method)
       at sun.reflect.MethodAccessorGenerator.generate(MethodAccessorGenerator.java:395)
       at sun.reflect.MethodAccessorGenerator.generateConstructor(MethodAccessorGenerator.java:94)
       at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:48)
       at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
       at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
       at org.codehaus.groovy.reflection.CachedMethod.createPogoMetaMethodSite(CachedMethod.java:239)
       at org.codehaus.groovy.runtime.callsite.PogoMetaMethodSite.createCachedMethodSite(PogoMetaMethodSite.java:212)
       at org.codehaus.groovy.runtime.callsite.PogoMetaMethodSite.createPogoMetaMethodSite(PogoMetaMethodSite.java:188)
       at groovy.lang.MetaClassImpl.createPogoCallSite(MetaClassImpl.java:3111)
       at org.codehaus.groovy.runtime.callsite.CallSiteArray.createPogoSite(CallSiteArray.java:147)
       at org.codehaus.groovy.runtime.callsite.CallSiteArray.createCallSite(CallSiteArray.java:161)
       at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:45)
       at groovy.lang.GroovyObject$setProperty.call(Unknown Source)
       at model.builder.core.Util$_cyReference_closure3.doCall(Util.groovy:61)

       at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
       at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
       at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
       at java.lang.reflect.Method.invoke(Method.java:606)
       at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:90)
       at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:233)
       at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:272)
       at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:909)
       at groovy.lang.Closure.call(Closure.java:411)
       at groovy.lang.Closure.call(Closure.java:427)
       at org.codehaus.groovy.runtime.DefaultGroovyMethods.each(DefaultGroovyMethods.java:1325)
       at org.codehaus.groovy.runtime.DefaultGroovyMethods.each(DefaultGroovyMethods.java:1297)
       at org.codehaus.groovy.runtime.dgm$148.invoke(Unknown Source)
       at org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite$PojoMetaMethodSiteNoUnwrapNoCoerce.invoke(PojoMetaMethodSite.java:271)
       at org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite.call(PojoMetaMethodSite.java:53)
       at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:45)
       at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:108)
       at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:116)
       at model.builder.core.Util.cyReference(Util.groovy:58)

       at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
       at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
       at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
       at java.lang.reflect.Method.invoke(Method.java:606)
       at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:90)
       at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:233)
       at org.codehaus.groovy.runtime.callsite.StaticMetaMethodSite.invoke(StaticMetaMethodSite.java:43)
       at org.codehaus.groovy.runtime.callsite.StaticMetaMethodSite.callStatic(StaticMetaMethodSite.java:99)
       at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallStatic(CallSiteArray.java:53)
       at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callStatic(AbstractCallSite.java:157)
       at model.builder.core.Activator.start(Activator.groovy:50)
       at org.apache.felix.framework.util.SecureAction.startActivator(SecureAction.java:629)
       at org.apache.felix.framework.Felix.activateBundle(Felix.java:1904)
       ... 6 more
Caused by: java.lang.ClassNotFoundException: sun.reflect.ConstructorAccessorImpl not found by groovy-all [172]

       at org.apache.felix.framework.ModuleImpl.findClassOrResourceByDelegation(ModuleImpl.java:812)
       at org.apache.felix.framework.ModuleImpl.access$400(ModuleImpl.java:72)
       at org.apache.felix.framework.ModuleImpl$ModuleClassLoader.loadClass(ModuleImpl.java:1807)
       at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
       at org.codehaus.groovy.runtime.callsite.CallSiteClassLoader.loadClass(CallSiteClassLoader.java:51)
       at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
       at org.codehaus.groovy.reflection.ClassLoaderForClassArtifacts.loadClass(ClassLoaderForClassArtifacts.java:57)
       ... 57 more

Additionally calling:

def swing = new SwingBuilder()

causes two exceptions...one for registerBasicWidgets and one for registerDataModels.

SwingBuilder construction seems to be not throw an exception on the third attempt after SwingBuilder fails twice.

registerBasicWidgets

Exception in thread "AWT-EventQueue-0" java.lang.RuntimeException: Could not init groovy.swing.SwingBuilder because of an exception in groovy.swing.SwingBuilder.registerBasicWidgets
       at groovy.util.FactoryBuilderSupport.callAutoRegisterMethods(FactoryBuilderSupport.java:212)
       at groovy.util.FactoryBuilderSupport.autoRegisterNodes(FactoryBuilderSupport.java:186)
       at groovy.util.FactoryBuilderSupport.<init>(FactoryBuilderSupport.java:160)
       at groovy.swing.SwingBuilder.<init>(SwingBuilder.groovy:102)
       at groovy.swing.SwingBuilder.<init>(SwingBuilder.groovy)
       at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
       at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)

       at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
       at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
       at org.codehaus.groovy.reflection.CachedConstructor.invoke(CachedConstructor.java:77)
       at org.codehaus.groovy.runtime.callsite.ConstructorSite$ConstructorSiteNoUnwrapNoCoerce.callConstructor(ConstructorSite.java:102)
       at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallConstructor(CallSiteArray.java:57)
       at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callConstructor(AbstractCallSite.java:182)
       at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callConstructor(AbstractCallSite.java:186)
       at model.builder.ui.UI.configuration(UI.groovy:30)
       at model.builder.ui.UI$configuration.call(Unknown Source)

       at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:45)
       at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:108)
       at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:124)
       at model.builder.core.Activator$1.actionPerformed(Activator.groovy:71)
       at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2018)
       at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2341)
       at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
       at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
       at javax.swing.AbstractButton.doClick(AbstractButton.java:376)
       at javax.swing.plaf.basic.BasicMenuItemUI.doClick(BasicMenuItemUI.java:833)
       at javax.swing.plaf.basic.BasicMenuItemUI$Handler.mouseReleased(BasicMenuItemUI.java:877)
       at java.awt.Component.processMouseEvent(Component.java:6505)
       at javax.swing.JComponent.processMouseEvent(JComponent.java:3321)
       at java.awt.Component.processEvent(Component.java:6270)
       at java.awt.Container.processEvent(Container.java:2229)
       at java.awt.Component.dispatchEventImpl(Component.java:4861)
       at java.awt.Container.dispatchEventImpl(Container.java:2287)
       at java.awt.Component.dispatchEvent(Component.java:4687)
       at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4832)
       at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4492)
       at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4422)
       at java.awt.Container.dispatchEventImpl(Container.java:2273)
       at java.awt.Window.dispatchEventImpl(Window.java:2719)
       at java.awt.Component.dispatchEvent(Component.java:4687)
       at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:735)
       at java.awt.EventQueue.access$200(EventQueue.java:103)
       at java.awt.EventQueue$3.run(EventQueue.java:694)
       at java.awt.EventQueue$3.run(EventQueue.java:692)
       at java.security.AccessController.doPrivileged(Native Method)
       at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
       at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:87)
       at java.awt.EventQueue$4.run(EventQueue.java:708)
       at java.awt.EventQueue$4.run(EventQueue.java:706)
       at java.security.AccessController.doPrivileged(Native Method)
       at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
       at java.awt.EventQueue.dispatchEvent(EventQueue.java:705)
       at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:242)
       at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:161)
       at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150)
       at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:146)
       at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:138)
       at java.awt.EventDispatchThread.run(EventDispatchThread.java:91)
Caused by: java.lang.reflect.InvocationTargetException

       at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
       at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
       at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
       at java.lang.reflect.Method.invoke(Method.java:606)
       at groovy.util.FactoryBuilderSupport.callAutoRegisterMethods(FactoryBuilderSupport.java:207)
       ... 57 more
Caused by: java.lang.NoClassDefFoundError: sun/reflect/ConstructorAccessorImpl

       at sun.misc.Unsafe.defineClass(Native Method)
       at sun.reflect.ClassDefiner.defineClass(ClassDefiner.java:63)
       at sun.reflect.MethodAccessorGenerator$1.run(MethodAccessorGenerator.java:399)
       at sun.reflect.MethodAccessorGenerator$1.run(MethodAccessorGenerator.java:396)
       at java.security.AccessController.doPrivileged(Native Method)
       at sun.reflect.MethodAccessorGenerator.generate(MethodAccessorGenerator.java:395)
       at sun.reflect.MethodAccessorGenerator.generateConstructor(MethodAccessorGenerator.java:94)
       at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:48)
       at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
       at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
       at org.codehaus.groovy.reflection.CachedMethod.createPogoMetaMethodSite(CachedMethod.java:239)
       at org.codehaus.groovy.runtime.callsite.PogoMetaMethodSite.createCachedMethodSite(PogoMetaMethodSite.java:212)
       at org.codehaus.groovy.runtime.callsite.PogoMetaMethodSite.createPogoMetaMethodSite(PogoMetaMethodSite.java:188)
       at groovy.lang.MetaClassImpl.createPogoCallCurrentSite(MetaClassImpl.java:3121)
       at org.codehaus.groovy.runtime.callsite.CallSiteArray.createCallCurrentSite(CallSiteArray.java:108)
       at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallCurrent(CallSiteArray.java:49)
       at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:133)
       at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:145)
       at groovy.swing.SwingBuilder.registerBasicWidgets(SwingBuilder.groovy:178)
       ... 62 more
Caused by: java.lang.ClassNotFoundException: sun.reflect.ConstructorAccessorImpl not found by groovy-all [172]

       at org.apache.felix.framework.ModuleImpl.findClassOrResourceByDelegation(ModuleImpl.java:812)
       at org.apache.felix.framework.ModuleImpl.access$400(ModuleImpl.java:72)
       at org.apache.felix.framework.ModuleImpl$ModuleClassLoader.loadClass(ModuleImpl.java:1807)
       at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
       at org.codehaus.groovy.runtime.callsite.CallSiteClassLoader.loadClass(CallSiteClassLoader.java:51)
       at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
       at org.codehaus.groovy.reflection.ClassLoaderForClassArtifacts.loadClass(ClassLoaderForClassArtifacts.java:57)
       ... 81 more

registerDataModels

Exception in thread "AWT-EventQueue-0" java.lang.RuntimeException: Could not init groovy.swing.SwingBuilder because of an exception in groovy.swing.SwingBuilder.registerDataModels
       at groovy.util.FactoryBuilderSupport.callAutoRegisterMethods(FactoryBuilderSupport.java:212)
       at groovy.util.FactoryBuilderSupport.autoRegisterNodes(FactoryBuilderSupport.java:186)
       at groovy.util.FactoryBuilderSupport.<init>(FactoryBuilderSupport.java:160)
       at groovy.swing.SwingBuilder.<init>(SwingBuilder.groovy:102)
       at groovy.swing.SwingBuilder.<init>(SwingBuilder.groovy)
       at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
       at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)

       at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
       at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
       at org.codehaus.groovy.reflection.CachedConstructor.invoke(CachedConstructor.java:77)
       at org.codehaus.groovy.runtime.callsite.ConstructorSite$ConstructorSiteNoUnwrapNoCoerce.callConstructor(ConstructorSite.java:102)
       at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callConstructor(AbstractCallSite.java:186)
       at model.builder.ui.UI.configuration(UI.groovy:30)
       at model.builder.ui.UI$configuration.call(Unknown Source)
       at model.builder.core.Activator$1.actionPerformed(Activator.groovy:71)
       at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2018)
       at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2341)
       at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
       at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
       at javax.swing.AbstractButton.doClick(AbstractButton.java:376)
       at javax.swing.plaf.basic.BasicMenuItemUI.doClick(BasicMenuItemUI.java:833)
       at javax.swing.plaf.basic.BasicMenuItemUI$Handler.mouseReleased(BasicMenuItemUI.java:877)
       at java.awt.Component.processMouseEvent(Component.java:6505)
       at javax.swing.JComponent.processMouseEvent(JComponent.java:3321)
       at java.awt.Component.processEvent(Component.java:6270)
       at java.awt.Container.processEvent(Container.java:2229)
       at java.awt.Component.dispatchEventImpl(Component.java:4861)
       at java.awt.Container.dispatchEventImpl(Container.java:2287)
       at java.awt.Component.dispatchEvent(Component.java:4687)
       at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4832)
       at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4492)
       at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4422)
       at java.awt.Container.dispatchEventImpl(Container.java:2273)
       at java.awt.Window.dispatchEventImpl(Window.java:2719)
       at java.awt.Component.dispatchEvent(Component.java:4687)
       at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:735)
       at java.awt.EventQueue.access$200(EventQueue.java:103)
       at java.awt.EventQueue$3.run(EventQueue.java:694)
       at java.awt.EventQueue$3.run(EventQueue.java:692)
       at java.security.AccessController.doPrivileged(Native Method)
       at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
       at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:87)
       at java.awt.EventQueue$4.run(EventQueue.java:708)
       at java.awt.EventQueue$4.run(EventQueue.java:706)
       at java.security.AccessController.doPrivileged(Native Method)
       at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
       at java.awt.EventQueue.dispatchEvent(EventQueue.java:705)
       at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:242)
       at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:161)
       at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150)
       at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:146)
       at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:138)
       at java.awt.EventDispatchThread.run(EventDispatchThread.java:91)
Caused by: java.lang.reflect.InvocationTargetException

       at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
       at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
       at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
       at java.lang.reflect.Method.invoke(Method.java:606)
       at groovy.util.FactoryBuilderSupport.callAutoRegisterMethods(FactoryBuilderSupport.java:207)
       ... 52 more
Caused by: java.lang.NoClassDefFoundError: sun/reflect/ConstructorAccessorImpl

       at sun.misc.Unsafe.defineClass(Native Method)
       at sun.reflect.ClassDefiner.defineClass(ClassDefiner.java:63)
       at sun.reflect.MethodAccessorGenerator$1.run(MethodAccessorGenerator.java:399)
       at sun.reflect.MethodAccessorGenerator$1.run(MethodAccessorGenerator.java:396)
       at java.security.AccessController.doPrivileged(Native Method)
       at sun.reflect.MethodAccessorGenerator.generate(MethodAccessorGenerator.java:395)
       at sun.reflect.MethodAccessorGenerator.generateConstructor(MethodAccessorGenerator.java:94)
       at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:48)
       at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
       at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
       at org.codehaus.groovy.reflection.CachedMethod.createPogoMetaMethodSite(CachedMethod.java:239)
       at org.codehaus.groovy.runtime.callsite.PogoMetaMethodSite.createCachedMethodSite(PogoMetaMethodSite.java:212)
       at org.codehaus.groovy.runtime.callsite.PogoMetaMethodSite.createPogoMetaMethodSite(PogoMetaMethodSite.java:188)
       at groovy.lang.MetaClassImpl.createPogoCallCurrentSite(MetaClassImpl.java:3121)
       at org.codehaus.groovy.runtime.callsite.CallSiteArray.createCallCurrentSite(CallSiteArray.java:108)
       at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallCurrent(CallSiteArray.java:49)
       at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:133)
       at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:145)
       at groovy.swing.SwingBuilder.registerDataModels(SwingBuilder.groovy:209)
       ... 57 more
Caused by: java.lang.ClassNotFoundException: sun.reflect.ConstructorAccessorImpl not found by groovy-all [172]

       at org.apache.felix.framework.ModuleImpl.findClassOrResourceByDelegation(ModuleImpl.java:812)
       at org.apache.felix.framework.ModuleImpl.access$400(ModuleImpl.java:72)
       at org.apache.felix.framework.ModuleImpl$ModuleClassLoader.loadClass(ModuleImpl.java:1807)
       at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
       at org.codehaus.groovy.runtime.callsite.CallSiteClassLoader.loadClass(CallSiteClassLoader.java:51)
       at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
       at org.codehaus.groovy.reflection.ClassLoaderForClassArtifacts.loadClass(ClassLoaderForClassArtifacts.java:57)
       ... 76 more


Is there a location where I can prevent the class load by sun.reflect.* name?

Also I'm wondering if running groovy is an issue for non-Sun jvms?  The classloading seems pretty fragile.

Thanks!

Anthony Bargnesi


On Wed, Sep 18, 2013 at 3:38 PM, Anthony Bargnesi <abar...@gmail.com> wrote:
Jochen,

Thanks for the help.  I've commented out the if in ClassLoaderForClassArtifacts and deleted GroovySunClassLoader and SunClassLoader.  Full patch is below.

Groovy still tries to load class sun.reflect.ConstructorAccessorImpl when executing the following code:

        def table = cyNetwork.defaultNodeTable
        table.getMatchingRows(NAME, label).
            collect { row ->
                long id = row.get(table.primaryKey.name, Long.class)
                if (!id) return null
                cyNetwork.getNode(id)
            }.find()

The full stacktrace seems to indicate using sun.reflect.ConstructorAccessorImpl to create the closure though I'm not sure if I understand it correctly.

java.lang.NoClassDefFoundError: sun/reflect/ConstructorAccessorImpl
       at sun.misc.Unsafe.defineClass(Native Method)
       at sun.reflect.ClassDefiner.defineClass(ClassDefiner.java:63)
       at sun.reflect.MethodAccessorGenerator$1.run(MethodAccessorGenerator.java:399)
       at sun.reflect.MethodAccessorGenerator$1.run(MethodAccessorGenerator.java:396)
       at java.security.AccessController.doPrivileged(Native Method)
       at sun.reflect.MethodAccessorGenerator.generate(MethodAccessorGenerator.java:395)
       at sun.reflect.MethodAccessorGenerator.generateConstructor(MethodAccessorGenerator.java:94)
       at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:48)
       at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
       at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
       at org.codehaus.groovy.reflection.CachedMethod.createPogoMetaMethodSite(CachedMethod.java:239)
       at org.codehaus.groovy.runtime.callsite.PogoMetaMethodSite.createCachedMethodSite(PogoMetaMethodSite.java:212)
       at org.codehaus.groovy.runtime.callsite.PogoMetaMethodSite.createPogoMetaMethodSite(PogoMetaMethodSite.java:188)
       at groovy.lang.MetaClassImpl.createPogoCallSite(MetaClassImpl.java:3111)
       at org.codehaus.groovy.runtime.callsite.CallSiteArray.createPogoSite(CallSiteArray.java:147)
       at org.codehaus.groovy.runtime.callsite.CallSiteArray.createCallSite(CallSiteArray.java:161)
       at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:45)
       at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:108)
       at org.codehaus.groovy.runtime.callsite.BooleanReturningMethodInvoker.invoke(BooleanReturningMethodInvoker.java:49)
       at org.codehaus.groovy.runtime.callsite.BooleanClosureWrapper.call(BooleanClosureWrapper.java:52)
       at org.codehaus.groovy.runtime.DefaultGroovyMethods.find(DefaultGroovyMethods.java:2856)
       at org.codehaus.groovy.runtime.DefaultGroovyMethods.find(DefaultGroovyMethods.java:2902)
       at org.codehaus.groovy.runtime.dgm$165.invoke(Unknown Source)
       at org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite$PojoMetaMethodSiteNoUnwrapNoCoerce.invoke(PojoMetaMethodSite.java:271)
       at org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite.call(PojoMetaMethodSite.java:53)
       at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:112)
       at org.openbel.kamnav.common.util.NodeUtil.findNode(NodeUtil.groovy:38)
       at org.openbel.kamnav.common.util.NodeUtil$findNode.callStatic(Unknown Source)
       at org.openbel.kamnav.core.task.ExpandNode$_run_closure1.doCall(ExpandNode.groovy:44)
       at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
       at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
       at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
       at java.lang.reflect.Method.invoke(Method.java:606)
       at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:90)
       at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:233)
       at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:272)
       at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:909)
       at groovy.lang.Closure.call(Closure.java:411)
       at groovy.lang.Closure.call(Closure.java:427)
       at org.codehaus.groovy.runtime.DefaultGroovyMethods.each(DefaultGroovyMethods.java:1325)
       at org.codehaus.groovy.runtime.DefaultGroovyMethods.each(DefaultGroovyMethods.java:1297)
       at org.codehaus.groovy.runtime.dgm$148.invoke(Unknown Source)
       at org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite$PojoMetaMethodSiteNoUnwrapNoCoerce.invoke(PojoMetaMethodSite.java:271)
       at org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite.call(PojoMetaMethodSite.java:53)
       at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:45)
       at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:108)
       at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:116)
       at org.openbel.kamnav.core.task.ExpandNode.run(ExpandNode.groovy:40)
       at org.cytoscape.work.internal.task.JDialogTaskManager$TaskRunnable.run(JDialogTaskManager.java:279)
       at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
       at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334)
       at java.util.concurrent.FutureTask.run(FutureTask.java:166)
       at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
       at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
       at java.lang.Thread.run(Thread.java:724)
Caused by: java.lang.ClassNotFoundException: sun.reflect.ConstructorAccessorImpl not found by groovy-all [168]
       at org.apache.felix.framework.ModuleImpl.findClassOrResourceByDelegation(ModuleImpl.java:812)
       at org.apache.felix.framework.ModuleImpl.access$400(ModuleImpl.java:72)
       at org.apache.felix.framework.ModuleImpl$ModuleClassLoader.loadClass(ModuleImpl.java:1807)
       at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
       at org.codehaus.groovy.runtime.callsite.CallSiteClassLoader.loadClass(CallSiteClassLoader.java:51)
       at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
       at org.codehaus.groovy.reflection.ClassLoaderForClassArtifacts.loadClass(ClassLoaderForClassArtifacts.java:57)
       ... 55 more

Patch (applied to tag GROOVY_2_1_7)

diff --git a/src/main/org/codehaus/groovy/reflection/ClassLoaderForClassArtifacts.java b/src/main/org/codehaus/groovy/reflection/ClassLoaderForClassArtifacts.java
index 401e057..3007403 100644
--- a/src/main/org/codehaus/groovy/reflection/ClassLoaderForClassArtifacts.java
+++ b/src/main/org/codehaus/groovy/reflection/ClassLoaderForClassArtifacts.java
@@ -15,7 +15,6 @@
  */
 package org.codehaus.groovy.reflection;
 
-import org.codehaus.groovy.runtime.callsite.GroovySunClassLoader;
 import org.codehaus.groovy.runtime.callsite.CallSite;
 
 import java.lang.ref.SoftReference;
@@ -49,11 +48,11 @@ public class ClassLoaderForClassArtifacts extends ClassLoader {
         if (cls != null)
           return cls;
 
-        if (GroovySunClassLoader.sunVM != null) {
-            cls = GroovySunClassLoader.sunVM.doesKnow(name);
-            if (cls != null)
-              return cls;
-        }
+        //if (GroovySunClassLoader.sunVM != null) {
+            //cls = GroovySunClassLoader.sunVM.doesKnow(name);
+            //if (cls != null)
+              //return cls;
+        //}
 
         return super.loadClass(name);
     }
diff --git a/src/main/org/codehaus/groovy/reflection/ReflectionUtils.java b/src/main/org/codehaus/groovy/reflection/ReflectionUtils.java
index 6872823..5faf8ac 100644
--- a/src/main/org/codehaus/groovy/reflection/ReflectionUtils.java
+++ b/src/main/org/codehaus/groovy/reflection/ReflectionUtils.java
@@ -43,18 +43,7 @@ public class ReflectionUtils {
         IGNORED_PACKAGES.add("org.codehaus.groovy.vmplugin.v7");
     }
 
-    private static final Method MAGIC_METHOD;
-
-    static {
-        Method meth;
-        try {
-            Class srr = Class.forName("sun.reflect.Reflection");
-            meth = srr.getMethod("getCallerClass", Integer.TYPE);
-        } catch (Throwable t) {
-            meth = null;
-        }
-        MAGIC_METHOD = meth;
-    }
+    private static final Method MAGIC_METHOD = null;
 
     /**
      * Determine whether or not the getCallingClass methods will return
diff --git a/src/main/org/codehaus/groovy/reflection/SunClassLoader.java b/src/main/org/codehaus/groovy/reflection/SunClassLoader.java
deleted file mode 100644
index 154e98d..0000000
--- a/src/main/org/codehaus/groovy/reflection/SunClassLoader.java
+++ /dev/null
@@ -1,114 +0,0 @@
-/*
- * Copyright 2003-2009 the original author or authors.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.codehaus.groovy.reflection;
-
-import org.objectweb.asm.Opcodes;
-import org.objectweb.asm.ClassWriter;
-import org.objectweb.asm.MethodVisitor;
-import org.objectweb.asm.ClassReader;
-
-import java.util.Map;
-import java.util.HashMap;
-import java.io.IOException;
-import java.io.InputStream;
-import java.security.AccessController;
-import java.security.PrivilegedAction;
-
-/**
- * Special class loader, which when running on Sun VM allows to generate accessor classes for any method
- */
-public class SunClassLoader extends ClassLoader implements Opcodes {
-    protected final Map<String,Class> knownClasses = new HashMap<String,Class>();
-
-    protected static final SunClassLoader sunVM;
-
-    static {

-        SunClassLoader res;
-        try {
-            res = AccessController.doPrivileged(new PrivilegedAction<SunClassLoader>() {

-                public SunClassLoader run() {
-                    try {
-                        return new SunClassLoader();
-                    } catch (Throwable e) {
-                        return null;
-                    }
-                }
-            });
-        }
-        catch (Throwable e) {
-            res = null;
-        }
-        sunVM = res;
-    }
-
-    protected SunClassLoader() throws Throwable {
-        super (SunClassLoader.class.getClassLoader());
-
-        final Class magic = ClassLoader.getSystemClassLoader().loadClass("sun.reflect.MagicAccessorImpl");
-        knownClasses.put("sun.reflect.MagicAccessorImpl", magic);
-        loadMagic ();
-    }
-
-    private void loadMagic() {
-        ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS);
-        cw.visit(Opcodes.V1_4, Opcodes.ACC_PUBLIC, "sun/reflect/GroovyMagic", null, "sun/reflect/MagicAccessorImpl", null);
-        MethodVisitor mv = cw.visitMethod(Opcodes.ACC_PUBLIC, "<init>", "()V", null, null);
-        mv.visitCode();
-        mv.visitVarInsn(ALOAD, 0);
-        mv.visitMethodInsn(INVOKESPECIAL, "sun/reflect/MagicAccessorImpl", "<init>", "()V");
-        mv.visitInsn(RETURN);
-        mv.visitMaxs(0,0);
-        mv.visitEnd();
-        cw.visitEnd();
-
-        define(cw.toByteArray(), "sun.reflect.GroovyMagic");
-    }
-
-    protected void loadFromRes(String name) throws IOException {
-        final InputStream asStream = SunClassLoader.class.getClassLoader().getResourceAsStream(resName(name));
-        ClassReader reader = new ClassReader(asStream);
-        final ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS);
-        reader.accept(cw, ClassWriter.COMPUTE_MAXS);
-        asStream.close();
-        define(cw.toByteArray(), name);
-    }
-
-    protected static String resName(String s) {
-        return s.replace('.','/') + ".class";
-    }
-
-    protected void define(byte[] bytes, final String name) {
-        knownClasses.put(name, defineClass(name, bytes, 0, bytes.length));
-    }
-
-    protected synchronized Class loadClass(String name, boolean resolve) throws ClassNotFoundException {
-        final Class aClass = knownClasses.get(name);
-        if (aClass != null)
-          return aClass;
-        else {
-            try {
-                return super.loadClass(name, resolve);
-            }
-            catch (ClassNotFoundException e) {
-                return getClass().getClassLoader().loadClass(name);
-            }
-        }
-    }
-
-    public Class doesKnow(String name) {
-        return knownClasses.get(name);
-    }
-}
diff --git a/src/main/org/codehaus/groovy/runtime/callsite/CallSiteGenerator.java b/src/main/org/codehaus/groovy/runtime/callsite/CallSiteGenerator.java
index 2ec174a..6ee62a7 100644
--- a/src/main/org/codehaus/groovy/runtime/callsite/CallSiteGenerator.java
+++ b/src/main/org/codehaus/groovy/runtime/callsite/CallSiteGenerator.java
@@ -242,7 +242,7 @@ public class CallSiteGenerator {
     }
 
     public static boolean isCompilable (CachedMethod method) {
-        return GroovySunClassLoader.sunVM != null || Modifier.isPublic(method.cachedClass.getModifiers()) && method.isPublic() && publicParams(method);
+        return Modifier.isPublic(method.cachedClass.getModifiers()) && method.isPublic() && publicParams(method);
     }
 
     private static boolean publicParams(CachedMethod method) {
diff --git a/src/main/org/codehaus/groovy/runtime/callsite/GroovySunClassLoader.java b/src/main/org/codehaus/groovy/runtime/callsite/GroovySunClassLoader.java
deleted file mode 100644
index 19c9d37..0000000
--- a/src/main/org/codehaus/groovy/runtime/callsite/GroovySunClassLoader.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * Copyright 2003-2009 the original author or authors.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.codehaus.groovy.runtime.callsite;
-
-import org.objectweb.asm.ClassReader;
-import org.objectweb.asm.ClassVisitor;
-import org.objectweb.asm.ClassWriter;
-import org.codehaus.groovy.reflection.SunClassLoader;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.security.AccessController;
-import java.security.PrivilegedAction;
-
-public class GroovySunClassLoader extends SunClassLoader {

-
-    public static final SunClassLoader sunVM;
-
-    static {
-            sunVM = AccessController.doPrivileged(new PrivilegedAction<SunClassLoader>() {
-                public SunClassLoader run() {
-                    try {
-                        if (SunClassLoader.sunVM != null) {
-                            return new GroovySunClassLoader();
-                        }
-                    }
-                    catch (Throwable t) {//
-                    }
-                    return null;
-                }
-            });
-    }
-
-    protected GroovySunClassLoader () throws Throwable {
-        super();
-        loadAbstract ();
-        loadFromRes("org.codehaus.groovy.runtime.callsite.MetaClassSite");
-        loadFromRes("org.codehaus.groovy.runtime.callsite.MetaMethodSite");
-        loadFromRes("org.codehaus.groovy.runtime.callsite.PogoMetaMethodSite");
-        loadFromRes("org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite");
-        loadFromRes("org.codehaus.groovy.runtime.callsite.StaticMetaMethodSite");
-    }
-
-    private void loadAbstract() throws IOException {
-        final InputStream asStream = GroovySunClassLoader.class.getClass().getClassLoader().getResourceAsStream(resName("org.codehaus.groovy.runtime.callsite.AbstractCallSite"));
-        ClassReader reader = new ClassReader(asStream);
-        final ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS);
-        final ClassVisitor cv = new ClassVisitor(4, cw) {
-            public void visit(int version, int access, String name, String signature, String superName, String[] interfaces) {
-                super.visit(version, access, name, signature, "sun/reflect/GroovyMagic", interfaces);
-            }           
-        };
-        reader.accept(cv, ClassWriter.COMPUTE_MAXS);
-        asStream.close();
-        define(cw.toByteArray(), "org.codehaus.groovy.runtime.callsite.AbstractCallSite");
-    }
-
-}

Jim White

unread,
Sep 18, 2013, 4:50:03 PM9/18/13
to us...@groovy.codehaus.org
How would it be possible for java.lang.reflect.* to work if you are preventing the JVM's implementation classes of it to load?  Groovy requires reflection to operate.  If you don't allow reflection then you can't run Groovy.

Jim

Anthony Bargnesi

unread,
Sep 18, 2013, 5:00:00 PM9/18/13
to us...@groovy.codehaus.org
The exception was rethrown from CacheMethods.java.  I removed the throw.

diff --git a/src/main/org/codehaus/groovy/reflection/CachedMethod.java b/src/main/org/codehaus/groovy/reflection/CachedMethod.java
index d47d795..a9ae35c 100644
--- a/src/main/org/codehaus/groovy/reflection/CachedMethod.java
+++ b/src/main/org/codehaus/groovy/reflection/CachedMethod.java
@@ -239,7 +239,6 @@ public class CachedMethod extends MetaMethod implements Comparable {
                     return (CallSite) constr.newInstance(site, metaClass, this, params, constr);
                 } catch (Error e) {
                     skipCompiled=true;
-                    throw e;
                 } catch (Throwable e) {
                     skipCompiled=true;
                 }

Now I don't receive any exceptions, but now notice a serious performance degradation.

Is this expected?  I assume skipCompiled = true is a bad thing, but can you eleborate on the cost here?

Thanks!

Anthony Bargnesi

Jochen Theodorou

unread,
Sep 18, 2013, 5:07:48 PM9/18/13
to us...@groovy.codehaus.org
Am 18.09.2013 23:00, schrieb Anthony Bargnesi:
[...]
> Now I don't receive any exceptions, but now notice a serious performance
> degradation.
>
> Is this expected? I assume skipCompiled = true is a bad thing, but can
> you eleborate on the cost here?

skipCompile to true means no class generation and you run Groovy at the
speed of pure reflection. That should be about 5-10 times slower.

Using the invokedynamic version of Groovy is no option for you?

Anthony Bargnesi

unread,
Sep 18, 2013, 5:09:19 PM9/18/13
to us...@groovy.codehaus.org
My groovy code indeed works without being able to import sun.reflect.*, but I do not know why.  I'm still new to groovy.

The fact is that I can't control the karaf instance that my bundles are deployed within.  The sun.reflect package is not provided to OSGi bundles to import.

My options seem to be:

(a) petition cytoscape (karaf app) to add system packages for sun.reflect, sun.awt, etc..
(b) remove sun jvm requirement in groovy (what I've done here)
(c) supplement my OSGi bundles with a jar providing those missing packages (sun jvm implementation classes)

Would option (c) be possible using an open jdk build?

Thanks!

Anthony Bargnesi

unread,
Sep 18, 2013, 5:11:33 PM9/18/13
to us...@groovy.codehaus.org
The invoke dynamic (indy jar) didn't have OSGi metadata in the 2.1.7 release.  Has that changed in newer dev versions?

Jochen Theodorou

unread,
Sep 18, 2013, 4:50:44 PM9/18/13
to us...@groovy.codehaus.org
Am 18.09.2013 21:38, schrieb Anthony Bargnesi:
[...]
> The full stacktrace seems to indicate using
> sun.reflect.ConstructorAccessorImpl to create the closure though I'm not
> sure if I understand it correctly.
>
> java.lang.NoClassDefFoundError: sun/reflect/ConstructorAccessorImpl
> at sun.misc.Unsafe.defineClass(Native Method)
> at sun.reflect.ClassDefiner.defineClass(ClassDefiner.java:63)
> at sun.reflect.MethodAccessorGenerator$1.run(MethodAccessorGenerator.java:399)
> at sun.reflect.MethodAccessorGenerator$1.run(MethodAccessorGenerator.java:396)
> at java.security.AccessController.doPrivileged(Native Method)
> at sun.reflect.MethodAccessorGenerator.generate(MethodAccessorGenerator.java:395)
> at sun.reflect.MethodAccessorGenerator.generateConstructor(MethodAccessorGenerator.java:94)
> at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:48)
> at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
> at java.lang.reflect.Constructor.newInstance(Constructor.java:526)

If I understand this right, then this means reflection is generating a
class at runtime. And for that code sun/reflect/ConstructorAccessorImpl
is required.

What I don't understand is why access to
sun.reflect.DelegatingConstructorAccessorImpl is allowed, but for
sun.reflect.ConstructorAccessorImpl it is not.... ah... I think I
know... it seems that ConstructorAccessorImpl is created by reflection
at runtime, using our class loader.

According to
http://anshuiitk.blogspot.de/2010/11/excessive-full-garbage-collection.html
you should be able to prevent this by setting the system property
sun.reflect.noInflation to true. If I am right, then this is in fact a
general problem for cytospace. Do their "applications" normally not use
reflection?

Anthony Bargnesi

unread,
Sep 18, 2013, 3:38:50 PM9/18/13
to us...@groovy.codehaus.org
Jochen,

Thanks for the help.  I've commented out the if in ClassLoaderForClassArtifacts and deleted GroovySunClassLoader and SunClassLoader.  Full patch is below.

Groovy still tries to load class sun.reflect.ConstructorAccessorImpl when executing the following code:

        def table = cyNetwork.defaultNodeTable
        table.getMatchingRows(NAME, label).
            collect { row ->
                long id = row.get(table.primaryKey.name, Long.class)
                if (!id) return null
                cyNetwork.getNode(id)
            }.find()

The full stacktrace seems to indicate using sun.reflect.ConstructorAccessorImpl to create the closure though I'm not sure if I understand it correctly.

java.lang.NoClassDefFoundError: sun/reflect/ConstructorAccessorImpl
       at sun.misc.Unsafe.defineClass(Native Method)
       at sun.reflect.ClassDefiner.defineClass(ClassDefiner.java:63)
       at sun.reflect.MethodAccessorGenerator$1.run(MethodAccessorGenerator.java:399)
       at sun.reflect.MethodAccessorGenerator$1.run(MethodAccessorGenerator.java:396)
       at java.security.AccessController.doPrivileged(Native Method)
       at sun.reflect.MethodAccessorGenerator.generate(MethodAccessorGenerator.java:395)
       at sun.reflect.MethodAccessorGenerator.generateConstructor(MethodAccessorGenerator.java:94)
       at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:48)
       at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
       at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
-public class SunClassLoader extends ClassLoader implements Opcodes {
-    protected final Map<String,Class> knownClasses = new HashMap<String,Class>();
-
-    protected static final SunClassLoader sunVM;
-
-    static {

-        SunClassLoader res;
-        try {
-            res = AccessController.doPrivileged(new PrivilegedAction<SunClassLoader>() {

-                public SunClassLoader run() {
-                    try {
-                        return new SunClassLoader();
-                    } catch (Throwable e) {
-                        return null;
-                    }
-                }
-            });
-        }
-        catch (Throwable e) {
-            res = null;
-        }
-        sunVM = res;
-    }
-public class GroovySunClassLoader extends SunClassLoader {

-
-    public static final SunClassLoader sunVM;
-
-    static {
-            sunVM = AccessController.doPrivileged(new PrivilegedAction<SunClassLoader>() {
-                public SunClassLoader run() {
-                    try {
-                        if (SunClassLoader.sunVM != null) {
-                            return new GroovySunClassLoader();
-                        }
-                    }
-                    catch (Throwable t) {//
-                    }
-                    return null;
-                }
-            });
-    }

Anthony Bargnesi

unread,
Sep 18, 2013, 4:08:42 PM9/18/13
to us...@groovy.codehaus.org
It's also attempting to load sun.reflect.ConstructorAccessorImpl on bundle activation with this groovy code:

static Expando cyReference(BundleContext bc, Closure cyAct, ... cyInterfaces) {
    Expando e = new Expando()
    cyInterfaces.each {
        def impl = cyAct.call(bc, it)
        def name = it.simpleName
        e.setProperty(name[0].toLowerCase() + name[1..-1], impl)
    }
    e
}

Stacktrace:

- Error while starting bundle: file:/home/tony/work/model-builder/tools/cytoscape/work/bundles/model-builder-core-1.0.0.jar
org.osgi.framework.BundleException: Activator start error in bundle model.builder.core [169].
       at org.apache.felix.framework.Felix.activateBundle(Felix.java:1951)
       at org.apache.felix.framework.Felix.startBundle(Felix.java:1822)
       at org.apache.felix.framework.BundleImpl.start(BundleImpl.java:927)
       at org.apache.felix.fileinstall.internal.DirectoryWatcher.startBundle(DirectoryWatcher.java:1244)
       at org.apache.felix.fileinstall.internal.DirectoryWatcher.startBundles(DirectoryWatcher.java:1216)
       at org.apache.felix.fileinstall.internal.DirectoryWatcher.process(DirectoryWatcher.java:505)
       at org.apache.felix.fileinstall.internal.DirectoryWatcher.run(DirectoryWatcher.java:291)
Caused by: java.lang.NoClassDefFoundError: sun/reflect/ConstructorAccessorImpl

       at sun.misc.Unsafe.defineClass(Native Method)
       at sun.reflect.ClassDefiner.defineClass(ClassDefiner.java:63)
       at sun.reflect.MethodAccessorGenerator$1.run(MethodAccessorGenerator.java:399)
       at sun.reflect.MethodAccessorGenerator$1.run(MethodAccessorGenerator.java:396)
       at java.security.AccessController.doPrivileged(Native Method)
       at sun.reflect.MethodAccessorGenerator.generate(MethodAccessorGenerator.java:395)
       at sun.reflect.MethodAccessorGenerator.generateConstructor(MethodAccessorGenerator.java:94)
       at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:48)
       at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
       at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
       at org.codehaus.groovy.reflection.CachedMethod.createPogoMetaMethodSite(CachedMethod.java:239)
       at org.codehaus.groovy.runtime.callsite.PogoMetaMethodSite.createCachedMethodSite(PogoMetaMethodSite.java:212)
       at org.codehaus.groovy.runtime.callsite.PogoMetaMethodSite.createPogoMetaMethodSite(PogoMetaMethodSite.java:188)
       at groovy.lang.MetaClassImpl.createPogoCallSite(MetaClassImpl.java:3111)
       at org.codehaus.groovy.runtime.callsite.CallSiteArray.createPogoSite(CallSiteArray.java:147)
       at org.codehaus.groovy.runtime.callsite.CallSiteArray.createCallSite(CallSiteArray.java:161)
       at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:45)
       at groovy.lang.GroovyObject$setProperty.call(Unknown Source)
       at model.builder.core.Util$_cyReference_closure3.doCall(Util.groovy:61)
       at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
       at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
       at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
       at java.lang.reflect.Method.invoke(Method.java:606)
       at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:90)
       at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:233)
       at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:272)
       at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:909)
       at groovy.lang.Closure.call(Closure.java:411)
       at groovy.lang.Closure.call(Closure.java:427)
       at org.codehaus.groovy.runtime.DefaultGroovyMethods.each(DefaultGroovyMethods.java:1325)
       at org.codehaus.groovy.runtime.DefaultGroovyMethods.each(DefaultGroovyMethods.java:1297)
       at org.codehaus.groovy.runtime.dgm$148.invoke(Unknown Source)
       at org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite$PojoMetaMethodSiteNoUnwrapNoCoerce.invoke(PojoMetaMethodSite.java:271)
       at org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite.call(PojoMetaMethodSite.java:53)
       at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:45)
       at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:108)
       at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:116)
       at model.builder.core.Util.cyReference(Util.groovy:58)

       at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
       at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
       at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
       at java.lang.reflect.Method.invoke(Method.java:606)
       at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:90)
       at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:233)
       at org.codehaus.groovy.runtime.callsite.StaticMetaMethodSite.invoke(StaticMetaMethodSite.java:43)
       at org.codehaus.groovy.runtime.callsite.StaticMetaMethodSite.callStatic(StaticMetaMethodSite.java:99)
       at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallStatic(CallSiteArray.java:53)
       at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callStatic(AbstractCallSite.java:157)
       at model.builder.core.Activator.start(Activator.groovy:50)
       at org.apache.felix.framework.util.SecureAction.startActivator(SecureAction.java:629)
       at org.apache.felix.framework.Felix.activateBundle(Felix.java:1904)
       ... 6 more
Caused by: java.lang.ClassNotFoundException: sun.reflect.ConstructorAccessorImpl not found by groovy-all [172]

       at org.apache.felix.framework.ModuleImpl.findClassOrResourceByDelegation(ModuleImpl.java:812)
       at org.apache.felix.framework.ModuleImpl.access$400(ModuleImpl.java:72)
       at org.apache.felix.framework.ModuleImpl$ModuleClassLoader.loadClass(ModuleImpl.java:1807)
       at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
       at org.codehaus.groovy.runtime.callsite.CallSiteClassLoader.loadClass(CallSiteClassLoader.java:51)
       at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
       at org.codehaus.groovy.reflection.ClassLoaderForClassArtifacts.loadClass(ClassLoaderForClassArtifacts.java:57)
       ... 57 more

Additionally calling:

def swing = new SwingBuilder()

causes two exceptions...one for registerBasicWidgets and one for registerDataModels.

SwingBuilder construction seems to be not throw an exception on the third attempt after SwingBuilder fails twice.

registerBasicWidgets

Exception in thread "AWT-EventQueue-0" java.lang.RuntimeException: Could not init groovy.swing.SwingBuilder because of an exception in groovy.swing.SwingBuilder.registerBasicWidgets
       at groovy.util.FactoryBuilderSupport.callAutoRegisterMethods(FactoryBuilderSupport.java:212)
       at groovy.util.FactoryBuilderSupport.autoRegisterNodes(FactoryBuilderSupport.java:186)
       at groovy.util.FactoryBuilderSupport.<init>(FactoryBuilderSupport.java:160)
       at groovy.swing.SwingBuilder.<init>(SwingBuilder.groovy:102)
       at groovy.swing.SwingBuilder.<init>(SwingBuilder.groovy)
       at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
       at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
       at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
       at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
       at org.codehaus.groovy.reflection.CachedConstructor.invoke(CachedConstructor.java:77)
       at org.codehaus.groovy.runtime.callsite.ConstructorSite$ConstructorSiteNoUnwrapNoCoerce.callConstructor(ConstructorSite.java:102)
       at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallConstructor(CallSiteArray.java:57)
       at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callConstructor(AbstractCallSite.java:182)
       at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callConstructor(AbstractCallSite.java:186)
       at model.builder.ui.UI.configuration(UI.groovy:30)
       at model.builder.ui.UI$configuration.call(Unknown Source)
       at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:45)
       at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:108)
       at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
       at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
       at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
       at java.lang.reflect.Method.invoke(Method.java:606)
       at groovy.util.FactoryBuilderSupport.callAutoRegisterMethods(FactoryBuilderSupport.java:207)
       ... 57 more
Caused by: java.lang.NoClassDefFoundError: sun/reflect/ConstructorAccessorImpl

       at sun.misc.Unsafe.defineClass(Native Method)
       at sun.reflect.ClassDefiner.defineClass(ClassDefiner.java:63)
       at sun.reflect.MethodAccessorGenerator$1.run(MethodAccessorGenerator.java:399)
       at sun.reflect.MethodAccessorGenerator$1.run(MethodAccessorGenerator.java:396)
       at java.security.AccessController.doPrivileged(Native Method)
       at sun.reflect.MethodAccessorGenerator.generate(MethodAccessorGenerator.java:395)
       at sun.reflect.MethodAccessorGenerator.generateConstructor(MethodAccessorGenerator.java:94)
       at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:48)
       at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
       at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
       at org.codehaus.groovy.reflection.CachedMethod.createPogoMetaMethodSite(CachedMethod.java:239)
       at org.codehaus.groovy.runtime.callsite.PogoMetaMethodSite.createCachedMethodSite(PogoMetaMethodSite.java:212)
       at org.codehaus.groovy.runtime.callsite.PogoMetaMethodSite.createPogoMetaMethodSite(PogoMetaMethodSite.java:188)
       at groovy.lang.MetaClassImpl.createPogoCallCurrentSite(MetaClassImpl.java:3121)
       at org.codehaus.groovy.runtime.callsite.CallSiteArray.createCallCurrentSite(CallSiteArray.java:108)
       at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallCurrent(CallSiteArray.java:49)
       at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:133)
       at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:145)
       at groovy.swing.SwingBuilder.registerBasicWidgets(SwingBuilder.groovy:178)
       ... 62 more
Caused by: java.lang.ClassNotFoundException: sun.reflect.ConstructorAccessorImpl not found by groovy-all [172]

       at org.apache.felix.framework.ModuleImpl.findClassOrResourceByDelegation(ModuleImpl.java:812)
       at org.apache.felix.framework.ModuleImpl.access$400(ModuleImpl.java:72)
       at org.apache.felix.framework.ModuleImpl$ModuleClassLoader.loadClass(ModuleImpl.java:1807)
       at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
       at org.codehaus.groovy.runtime.callsite.CallSiteClassLoader.loadClass(CallSiteClassLoader.java:51)
       at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
       at org.codehaus.groovy.reflection.ClassLoaderForClassArtifacts.loadClass(ClassLoaderForClassArtifacts.java:57)
       ... 81 more

registerDataModels

Exception in thread "AWT-EventQueue-0" java.lang.RuntimeException: Could not init groovy.swing.SwingBuilder because of an exception in groovy.swing.SwingBuilder.registerDataModels
       at groovy.util.FactoryBuilderSupport.callAutoRegisterMethods(FactoryBuilderSupport.java:212)
       at groovy.util.FactoryBuilderSupport.autoRegisterNodes(FactoryBuilderSupport.java:186)
       at groovy.util.FactoryBuilderSupport.<init>(FactoryBuilderSupport.java:160)
       at groovy.swing.SwingBuilder.<init>(SwingBuilder.groovy:102)
       at groovy.swing.SwingBuilder.<init>(SwingBuilder.groovy)
       at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
       at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
       at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
       at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
       at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
       at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
       at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
       at java.lang.reflect.Method.invoke(Method.java:606)
       at groovy.util.FactoryBuilderSupport.callAutoRegisterMethods(FactoryBuilderSupport.java:207)
       ... 52 more
Caused by: java.lang.NoClassDefFoundError: sun/reflect/ConstructorAccessorImpl

       at sun.misc.Unsafe.defineClass(Native Method)
       at sun.reflect.ClassDefiner.defineClass(ClassDefiner.java:63)
       at sun.reflect.MethodAccessorGenerator$1.run(MethodAccessorGenerator.java:399)
       at sun.reflect.MethodAccessorGenerator$1.run(MethodAccessorGenerator.java:396)
       at java.security.AccessController.doPrivileged(Native Method)
       at sun.reflect.MethodAccessorGenerator.generate(MethodAccessorGenerator.java:395)
       at sun.reflect.MethodAccessorGenerator.generateConstructor(MethodAccessorGenerator.java:94)
       at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:48)
       at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
       at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
       at org.codehaus.groovy.reflection.CachedMethod.createPogoMetaMethodSite(CachedMethod.java:239)
       at org.codehaus.groovy.runtime.callsite.PogoMetaMethodSite.createCachedMethodSite(PogoMetaMethodSite.java:212)
       at org.codehaus.groovy.runtime.callsite.PogoMetaMethodSite.createPogoMetaMethodSite(PogoMetaMethodSite.java:188)
       at groovy.lang.MetaClassImpl.createPogoCallCurrentSite(MetaClassImpl.java:3121)
       at org.codehaus.groovy.runtime.callsite.CallSiteArray.createCallCurrentSite(CallSiteArray.java:108)
       at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallCurrent(CallSiteArray.java:49)
       at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:133)
       at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:145)
       at groovy.swing.SwingBuilder.registerDataModels(SwingBuilder.groovy:209)
       ... 57 more
Caused by: java.lang.ClassNotFoundException: sun.reflect.ConstructorAccessorImpl not found by groovy-all [172]

       at org.apache.felix.framework.ModuleImpl.findClassOrResourceByDelegation(ModuleImpl.java:812)
       at org.apache.felix.framework.ModuleImpl.access$400(ModuleImpl.java:72)
       at org.apache.felix.framework.ModuleImpl$ModuleClassLoader.loadClass(ModuleImpl.java:1807)
       at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
       at org.codehaus.groovy.runtime.callsite.CallSiteClassLoader.loadClass(CallSiteClassLoader.java:51)
       at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
       at org.codehaus.groovy.reflection.ClassLoaderForClassArtifacts.loadClass(ClassLoaderForClassArtifacts.java:57)
       ... 76 more


Is there a location where I can prevent the class load by sun.reflect.* name?

Also I'm wondering if running groovy is an issue for non-Sun jvms?  The classloading seems pretty fragile.

Thanks!

Anthony Bargnesi
On Wed, Sep 18, 2013 at 3:38 PM, Anthony Bargnesi <abar...@gmail.com> wrote:

Jim White

unread,
Sep 18, 2013, 7:39:34 PM9/18/13
to us...@groovy.codehaus.org
Option (c) could work as long as reflection doesn't get in trouble because of the multiple copies of the classes.  I suspect it would be okay.  

That will leave what to do for Android up in the air.


I dealt with a similar problem when it became apparent that Groovy has been suffering because of a decade old bug in the Bean Introspector that Sun kept making worse.  It was finally fixed by doing an totally new implementation in JDK 1.7 but it seems that it will not fixed in JDK 1.6 so I backported the new introspector.


I googled around to see what folks have done to deal with this in the past.  This issue for Sling may be relevant:


Jim

Anthony Bargnesi

unread,
Sep 18, 2013, 8:28:10 PM9/18/13
to us...@groovy.codehaus.org
The invoke dynamic jar (groovy-all-2.1.7-indy.jar) seems to work.  I copied the META-INF/MANIFEST.MF from groovy-all-2.1.7.jar.

This seems the best option for now.

Jochen Theodorou

unread,
Sep 19, 2013, 3:34:04 AM9/19/13
to us...@groovy.codehaus.org
Am 18.09.2013 23:09, schrieb Anthony Bargnesi:
[...]
> My options seem to be:
>
> (a) petition cytoscape (karaf app) to add system packages for
> sun.reflect, sun.awt, etc..

well, sun.reflect would be a good start. This package is quite common,
not only on the Sun VM. Otherwise reflection is no good invocation
option. rflection is special, because of runtime code generation from
Groovy and from the reflection package itself. Not sure awt is rewuired

> (b) remove sun jvm requirement in groovy (what I've done here)

and you did see, it did not really help. It is no real requirement we
have there. But the code assumes, that if those classes cannot be
loaded, that we then simply can continue. That OSGI container seems to
throw errors here, which I find strange.

> (c) supplement my OSGi bundles with a jar providing those missing
> packages (sun jvm implementation classes)
>
> Would option (c) be possible using an open jdk build?

not sure that works if native code is supposed to be accessed. You could
certainly take the classes from the open JDK and try it out, but we
cannot add them to Groovy, because the License does not fit.

Anthony Bargnesi

unread,
Sep 19, 2013, 12:12:45 PM9/19/13
to us...@groovy.codehaus.org
Jochen,

I hit some issues with the invokedynamic support.

First I had to add org.codehaus.groovy.vmplugin.v7;version="2.1.7" to Export-Package in the groovy-all-2.1.7-indy.jar bundle.

Now the bundles load but I'm hitting the following error constructing an object where the constructor is created via @TupleConstructor:

org.osgi.framework.BundleException: Activator start error in bundle org.openbel.kamnav.core [213].
       at org.apache.felix.framework.Felix.activateBundle(Felix.java:1951)
       at org.apache.felix.framework.Felix.startBundle(Felix.java:1822)
       at org.apache.felix.framework.BundleImpl.start(BundleImpl.java:927)
       at org.apache.felix.fileinstall.internal.DirectoryWatcher.startBundle(DirectoryWatcher.java:1244)
       at org.apache.felix.fileinstall.internal.DirectoryWatcher.startBundles(DirectoryWatcher.java:1216)
       at org.apache.felix.fileinstall.internal.DirectoryWatcher.startAllBundles(DirectoryWatcher.java:1205)
       at org.apache.felix.fileinstall.internal.DirectoryWatcher.process(DirectoryWatcher.java:500)
       at org.apache.felix.fileinstall.internal.DirectoryWatcher.run(DirectoryWatcher.java:291)
Caused by: java.lang.InternalError: JVM cannot find invoker for (Class,CyApplicationManager,CyEventHelper,VisualMappingManager)Object
       at java.lang.invoke.Invokers.lookupInvoker(Invokers.java:91)
       at java.lang.invoke.Invokers.exactInvoker(Invokers.java:73)
       at java.lang.invoke.MethodHandles.exactInvoker(MethodHandles.java:1468)
       at java.lang.invoke.MethodHandleImpl.makeGuardWithTest(MethodHandleImpl.java:1074)
       at java.lang.invoke.MethodHandles.guardWithTest(MethodHandles.java:2259)
       at java.lang.invoke.SwitchPoint.guardWithTest(SwitchPoint.java:173)
       at org.codehaus.groovy.vmplugin.v7.Selector$MethodSelector.setGuards(Selector.java:725)
       at org.codehaus.groovy.vmplugin.v7.Selector$MethodSelector.setCallSiteTarget(Selector.java:817)
       at org.codehaus.groovy.vmplugin.v7.IndyInterface.selectMethod(IndyInterface.java:208)
       at org.openbel.kamnav.core.Activator.start(Activator.groovy:56)
       at org.apache.felix.framework.util.SecureAction.startActivator(SecureAction.java:629)
       at org.apache.felix.framework.Felix.activateBundle(Felix.java:1904)
       ... 7 more

Googling around I find this exception in some of your threads.  Any hints?  I can create a small SSCCE that reproduces the issue if needed.

Thanks!
Anthony Bargnesi

Jochen Theodorou

unread,
Sep 19, 2013, 3:35:50 PM9/19/13
to us...@groovy.codehaus.org
Am 19.09.2013 18:12, schrieb Anthony Bargnesi:
> Jochen,
>
> I hit some issues with the invokedynamic support.
>
> First I had to add *org.codehaus.groovy.vmplugin.v7;version="2.1.7"* to
> Export-Package in the groovy-all-2.1.7-indy.jar bundle.
>
> Now the bundles load but I'm hitting the following error constructing an
> object where the constructor is created via @TupleConstructor:
[...]
> Caused by: java.lang.InternalError: JVM cannot find invoker for
> (Class,CyApplicationManager,CyEventHelper,VisualMappingManager)Object
> at java.lang.invoke.Invokers.lookupInvoker(Invokers.java:91)
> at java.lang.invoke.Invokers.exactInvoker(Invokers.java:73)

last time I had this was with the class being marked private - which is
not legal.It says it cannot find the invoker, but normally it means it
has no access to it.

[...]
> Googling around I find this exception in some of your threads. Any
> hints? I can create a small SSCCE that reproduces the issue if needed.

That would be very helpful. If I can reproduce it, I can mabye produce a
workaround

Anthony Bargnesi

unread,
Sep 19, 2013, 3:41:31 PM9/19/13
to us...@groovy.codehaus.org
I've created a new thread ("type error with variable argument") for this issue at:


I was diverging from the intention of this post.
Reply all
Reply to author
Forward
0 new messages