You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@groovy.apache.org by "Uwe Schindler (JIRA)" <ji...@apache.org> on 2015/09/10 18:16:45 UTC

[jira] [Created] (GROOVY-7587) Groovy 2.2 and 2.4 all fail to execute almost any script with Java 9 JIGSAW preview builds

Uwe Schindler created GROOVY-7587:
-------------------------------------

             Summary: Groovy 2.2 and 2.4 all fail to execute almost any script with Java 9 JIGSAW preview builds
                 Key: GROOVY-7587
                 URL: https://issues.apache.org/jira/browse/GROOVY-7587
             Project: Groovy
          Issue Type: Bug
          Components: groovy-runtime
    Affects Versions: 2.4.4, 2.2.2
         Environment: java version "1.9.0-ea"
Java(TM) SE Runtime Environment (build 1.9.0-ea-jigsaw-nightly-h3337-20150908-b80)
Java HotSpot(TM) 64-Bit Server VM (build 1.9.0-ea-jigsaw-nightly-h3337-20150908-b80, mixed mode)
            Reporter: Uwe Schindler
            Priority: Critical


The Lucene project successfully made their code running with the recently announced preview builds of Java 9. Unfortunately some parts of Lucene's build script and also the build of the Policeman's ForbiddenAPI checker (https://github.com/policeman-tools/forbidden-apis/) use groovy to execute some stuff that does not work with plain Ant. Similar issues are seen by Elasticsearch's scripting support plugin.

Unfortunately even simple scripts fail quite often. The issue always looks like this:

{code:java}
def temp = ClassLoader.getSystemClassLoader()
temp.toString()
{code}

{noformat}
java.lang.reflect.InaccessibleObjectException: Unable to make member of class jdk.internal.misc.ClassLoaders$AppClassLoader accessible:  module java.base does not export jdk.internal.misc to <unnamed module @1a6f5124>
        at sun.reflect.Reflection.throwInaccessibleObjectException(java.base@9.0/Reflection.java:462)
        at java.lang.reflect.AccessibleObject.checkCanSetAccessible(java.base@9.0/AccessibleObject.java:194)
        at java.lang.reflect.AccessibleObject.setAccessible(java.base@9.0/AccessibleObject.java:157)
        at org.codehaus.groovy.reflection.CachedConstructor$1.run(CachedConstructor.java:44)
        at java.security.AccessController.doPrivileged(java.base@9.0/Native Method)
        at org.codehaus.groovy.reflection.CachedConstructor.<init>(CachedConstructor.java:42)
        at org.codehaus.groovy.reflection.CachedClass$2.initValue(CachedClass.java:79)
        at org.codehaus.groovy.reflection.CachedClass$2.initValue(CachedClass.java:69)
        at org.codehaus.groovy.util.LazyReference.getLocked(LazyReference.java:49)
        at org.codehaus.groovy.util.LazyReference.get(LazyReference.java:36)
        at org.codehaus.groovy.reflection.CachedClass.getConstructors(CachedClass.java:268)
        at groovy.lang.MetaClassImpl.<init>(MetaClassImpl.java:218)
        at groovy.lang.MetaClassImpl.<init>(MetaClassImpl.java:228)
        at groovy.lang.MetaClassRegistry$MetaClassCreationHandle.createNormalMetaClass(MetaClassRegistry.java:171)
        at groovy.lang.MetaClassRegistry$MetaClassCreationHandle.createWithCustomLookup(MetaClassRegistry.java:161)
        at groovy.lang.MetaClassRegistry$MetaClassCreationHandle.create(MetaClassRegistry.java:144)
        at org.codehaus.groovy.reflection.ClassInfo.getMetaClassUnderLock(ClassInfo.java:253)
        at org.codehaus.groovy.reflection.ClassInfo.getMetaClass(ClassInfo.java:285)
        at org.codehaus.groovy.reflection.ClassInfo.getMetaClass(ClassInfo.java:295)
        at org.codehaus.groovy.runtime.metaclass.MetaClassRegistryImpl.getMetaClass(MetaClassRegistryImpl.java:261)
        at org.codehaus.groovy.runtime.InvokerHelper.getMetaClass(InvokerHelper.java:871)
        at org.codehaus.groovy.runtime.callsite.CallSiteArray.createPojoSite(CallSiteArray.java:125)
        at org.codehaus.groovy.runtime.callsite.CallSiteArray.createCallSite(CallSiteArray.java:166)
        at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:48)
        at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:113)
        at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:117)
        at generate-deprecated.run(generate-deprecated.groovy:20)
        at org.codehaus.groovy.ant.Groovy.parseAndRunScript(Groovy.java:501)
        at org.codehaus.groovy.ant.Groovy.execGroovy(Groovy.java:448)
        at org.codehaus.groovy.ant.Groovy.execute(Groovy.java:313)
{noformat}

This always happens under the following circumstances. You have a public Object accessible from everywhere in the JDK. This object is working like a factory and creates an implementation of an abstract class. In the above example this is a classloader (abstract class). This returned instance is of course some JDK-internal class and the user code is intended to only call the visible methods on it.

Unfortunately groovy tries in the second line to create a metaclass to get "full insight" of this internal class. For that it tries to make everything accessible. And with Java 9 including JIGSAW this is no longer possible. You can use the APIs provided by the internal implementation, but you are not allowed to do any non-public stuff. This is disallowed by the Java module system and there is no way around (unless you disable the module system completely, which will not work in all cases in Java 9 once it is released).



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)