loading...

Removing illegal reflective access warnings in Grails 4

erichelgeson profile image Eric Helgeson ・4 min read

When using JDK11 with Grails 4 you likely have seen these messages:

WARNING: An illegal reflective access operation has occurred
WARNING: Illegal reflective access by org.codehaus.groovy.reflection.CachedConstructor$1 (file:/Users/erichelgeson/.gradle/caches/modules-2/files-2.1/org.codehaus.groovy/groovy/2.5.6/6936e700f0fb1b50bac0698ada4347a769d40199/groovy-2.5.6.jar) to constructor com.sun.jmx.mbeanserver.JmxMBeanServer(java.lang.String,javax.management.MBeanServer,javax.management.MBeanServerDelegate)
WARNING: Please consider reporting this to the maintainers of org.codehaus.groovy.reflection.CachedConstructor$1
WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations
WARNING: All illegal access operations will be denied in a future release

This is because Groovy 2.5 uses reflection. In Groovy 3 they've already made great strides on this.

For now we can add the correct packages to the --add-opens JVM args to get rid of them.

NOTE: This is the same way Groovy 2.5 removes them when calling groovy with the GROOVY_TURN_OFF_JAVA_WARNINGS environment variable.

In our build.gradle file we can define a list of modules to open:

def jvmOpenModulesArgs = [
        "--add-opens=java.management/com.sun.jmx.mbeanserver=ALL-UNNAMED",
        "--add-opens=java.base/java.io=ALL-UNNAMED",
        "--add-opens=java.base/java.lang=ALL-UNNAMED",
        "--add-opens=java.base/java.lang.annotation=ALL-UNNAMED",
        "--add-opens=java.base/java.lang.invoke=ALL-UNNAMED",
        "--add-opens=java.base/java.lang.module=ALL-UNNAMED",
        "--add-opens=java.base/java.lang.ref=ALL-UNNAMED",
        "--add-opens=java.base/java.lang.reflect=ALL-UNNAMED",
        "--add-opens=java.base/java.math=ALL-UNNAMED",
        "--add-opens=java.base/java.net=ALL-UNNAMED",
        "--add-opens=java.base/java.net.spi=ALL-UNNAMED",
        "--add-opens=java.base/java.nio=ALL-UNNAMED",
        "--add-opens=java.base/java.nio.channels=ALL-UNNAMED",
        "--add-opens=java.base/java.nio.channels.spi=ALL-UNNAMED",
        "--add-opens=java.base/java.nio.charset=ALL-UNNAMED",
        "--add-opens=java.base/java.nio.charset.spi=ALL-UNNAMED",
        "--add-opens=java.base/java.nio.file=ALL-UNNAMED",
        "--add-opens=java.base/java.nio.file.attribute=ALL-UNNAMED",
        "--add-opens=java.base/java.nio.file.spi=ALL-UNNAMED",
        "--add-opens=java.base/java.security=ALL-UNNAMED",
        "--add-opens=java.base/java.security.acl=ALL-UNNAMED",
        "--add-opens=java.base/java.security.cert=ALL-UNNAMED",
        "--add-opens=java.base/java.security.interfaces=ALL-UNNAMED",
        "--add-opens=java.base/java.security.spec=ALL-UNNAMED",
        "--add-opens=java.base/java.text=ALL-UNNAMED",
        "--add-opens=java.base/java.text.spi=ALL-UNNAMED",
        "--add-opens=java.base/java.time=ALL-UNNAMED",
        "--add-opens=java.base/java.time.chrono=ALL-UNNAMED",
        "--add-opens=java.base/java.time.format=ALL-UNNAMED",
        "--add-opens=java.base/java.time.temporal=ALL-UNNAMED",
        "--add-opens=java.base/java.time.zone=ALL-UNNAMED",
        "--add-opens=java.base/java.util=ALL-UNNAMED",
        "--add-opens=java.base/java.util.concurrent=ALL-UNNAMED",
        "--add-opens=java.base/java.util.concurrent.atomic=ALL-UNNAMED",
        "--add-opens=java.base/java.util.concurrent.locks=ALL-UNNAMED",
        "--add-opens=java.base/java.util.function=ALL-UNNAMED",
        "--add-opens=java.base/java.util.jar=ALL-UNNAMED",
        "--add-opens=java.base/java.util.regex=ALL-UNNAMED",
        "--add-opens=java.base/java.util.spi=ALL-UNNAMED",
        "--add-opens=java.base/java.util.stream=ALL-UNNAMED",
        "--add-opens=java.base/java.util.zip=ALL-UNNAMED",
        "--add-opens=java.datatransfer/java.awt.datatransfer=ALL-UNNAMED",
        "--add-opens=java.desktop/java.applet=ALL-UNNAMED",
        "--add-opens=java.desktop/java.awt=ALL-UNNAMED",
        "--add-opens=java.desktop/java.awt.color=ALL-UNNAMED",
        "--add-opens=java.desktop/java.awt.desktop=ALL-UNNAMED",
        "--add-opens=java.desktop/java.awt.dnd=ALL-UNNAMED",
        "--add-opens=java.desktop/java.awt.dnd.peer=ALL-UNNAMED",
        "--add-opens=java.desktop/java.awt.event=ALL-UNNAMED",
        "--add-opens=java.desktop/java.awt.font=ALL-UNNAMED",
        "--add-opens=java.desktop/java.awt.geom=ALL-UNNAMED",
        "--add-opens=java.desktop/java.awt.im=ALL-UNNAMED",
        "--add-opens=java.desktop/java.awt.im.spi=ALL-UNNAMED",
        "--add-opens=java.desktop/java.awt.image=ALL-UNNAMED",
        "--add-opens=java.desktop/java.awt.image.renderable=ALL-UNNAMED",
        "--add-opens=java.desktop/java.awt.peer=ALL-UNNAMED",
        "--add-opens=java.desktop/java.awt.print=ALL-UNNAMED",
        "--add-opens=java.desktop/java.beans=ALL-UNNAMED",
        "--add-opens=java.desktop/java.beans.beancontext=ALL-UNNAMED",
        "--add-opens=java.instrument/java.lang.instrument=ALL-UNNAMED",
        "--add-opens=java.logging/java.util.logging=ALL-UNNAMED",
        "--add-opens=java.management/java.lang.management=ALL-UNNAMED",
        "--add-opens=java.prefs/java.util.prefs=ALL-UNNAMED",
        "--add-opens=java.rmi/java.rmi=ALL-UNNAMED",
        "--add-opens=java.rmi/java.rmi.activation=ALL-UNNAMED",
        "--add-opens=java.rmi/java.rmi.dgc=ALL-UNNAMED",
        "--add-opens=java.rmi/java.rmi.registry=ALL-UNNAMED",
        "--add-opens=java.rmi/java.rmi.server=ALL-UNNAMED",
        "--add-opens=java.sql/java.sql=ALL-UNNAMED"
]

Then add them to our bootRun task:

bootRun {
    jvmArgs('-noverify',
            '-XX:TieredStopAtLevel=1',
            '-Xmx1024m')
    jvmArgs(jvmOpenModulesArgs)
    // ...
}

And any task with GroovyCompile & Test

tasks.withType(GroovyCompile) {
    options.forkOptions.jvmArgs = jvmOpenModulesArgs
}
tasks.withType(Test) {
    jvmArgs = jvmOpenModulesArgs
}

That's it - no more pesky reflective access warnings when the JVM starts up. Thanks to Daniel Sun helping me find the right modules.

Discussion

pic
Editor guide
 

I got this error as soon as I configured my mac to use Java11 and Grails4, and type grails -version at the command prompt.
It was not allowing me to create an app so was not able to get the build.gradle file for the application.

Step1. Added . export JAVA_OPTS="$JAVA_OPTS --add-opens....(as per the link in GROOVY_TURN_OFF_JAVA_WARNINGS)

Step2. Then created the grails Application

Step3. Then updated the build.gradle file for the application as mentioned above.

thank you

 

These are just warnings, they wouldn't have prevented anything from working. There is no need to do those extra steps.

 

Works great. If you want same behaviour for testing:

tasks.withType(Test) {
jvmArgs = jvmOpenModulesArgs
}

 

Ha, thought of that last evening I should add tests in too! Will update the post.

I think there could be a simpler way to add it to the forked boot task too, but the few things I tried didn't work. Will update the post if someone suggests one.

 

where to add all these stuff.

 

In build.gradle, as mentioned in the article.