It might be good to make the max JDK version supported by a Groovy release clearly visible in the release mail & on the web page... G-)

e.g.:


   Groovy 4.0


Groovy 4.0 is the previous stable version of Groovy designed for JDK8+ with much improved JPMS support.
starting 4.0.24 it supports JDK24
starting 4.0.27 it supports JDK25
starting 4.0.29 it supports JDK26

Cheers,
mg


Am 10.10.2025 um 23:42 schrieb Paul King:
What Jochen said but see also:

[#GROOVY-11757] Explore the use of asm-jdk-bridge for Groovy - ASF JIRA https://share.google/CKb8mvYhLXTjUDQzE

This would allow us not to be so reliant on ASM versions.

Other details:
4.0.24 was the first version to support JDK24,
4.0.27 was the first 4 version to support JDK25,
4.0.29 will be the first 4 version to support JDK26


On Sat, Oct 11, 2025, 2:36 AM Jochen Theodorou <[email protected]> wrote:

    The problem is the following:

    * we read classfiles
    * they have a bytecode version, that depends on the version of Java,
    those classfiles have been compiled with
    * we use the asm lib to read those class files
    * asm can only read classfiles compatible with the bytecode
    version on
    the release of that asm lib
    * Java nowadays changes the bytecode version with almost every
    major release
    * if the bytecode version is too new you run into problems like:
     >>     Caused by: java.lang.IllegalArgumentException: Unsupported
    class
     >>     file major version 69
     >>     at
    groovyjarjarasm.asm.ClassReader.<init>(ClassReader.java:200)

    One thing that helps: upgrade Groovy.

    There is in theory a solution to this by using the new class file API
    from Java. But the next lts version of Java that supports the
    class file
    API is Java 25

    bye Jochen


    On 10/10/25 16:15, Tommy Svensson wrote:
    > Sorry, but I don't have anything to say about the specific problem!
    >
    > That said I found this: https://openjdk.org <https://openjdk.org>
    >
    > Is it possible the open source world can take this JVM code and
    take it
    > in an own, fully backwards compatible direction, so that we can
    avoid
    > problems like this ?
    >
    > Tommy Svensson
    >
    > [email protected] <mailto:[email protected]>
    >
    >
    >
    >
    > Från: Blake McBride <[email protected]>
    <mailto:[email protected]>
    > Svara: [email protected] <[email protected]>
    > <mailto:[email protected]>
    > Datum: 10 oktober 2025 at 01:26:18
    > Till: [email protected] <[email protected]>
    > <mailto:[email protected]>
    > Ämne: Re: Error in Java 25
    >
    >> I fixed the problem by upgrading to Groovy 4.0.28
    >>
    >> On Thu, Oct 9, 2025 at 4:45 PM Blake McBride <[email protected]
    >> <mailto:[email protected]>> wrote:
    >>
    >>     Hello,
    >>
    >>     I am trying to run an app that runs fine under Java 21 but will
    >>     not run under Java 25.
    >>     The problem appears to be Groovy.
    >>
    >>     Sure appreciate any help.
    >>
    >>
    >>     I am running the following:
    >>
    >>     Groovy:  4.0.26
    >>     Java:  25
    >>     Apache tomcat: 11.0.8
    >>
    >>     I get the error when trying to run a .groovy file.  So, it
    isn't
    >>     a .class file.  The Groovy file has not been compiled.  Again,
    >>     this code works fine under Java 8, 11, 17, and 21.
    >>
    >>     The error under Java 25:
    >>
    >>     09-Oct-2025 16:27:47.947 SEVERE [main]
    >>  org.apache.catalina.core.StandardContext.listenerStart Exception
    >>     sending context initialized event to listener instance of class
    >>     [org.kissweb.restServer.StartupListener]
    >>     BUG! exception in phase 'semantic analysis' in source unit '/
    >>  drive1/ROOT/home/blake/Stack360/Kiss/src/main/backend/
    >>     KissInit.groovy' Unsupported class file major version 69
    >>     at
    >>
     
org.codehaus.groovy.control.CompilationUnit$ISourceUnitOperation.doPhaseOperation(CompilationUnit.java:901)
    >>     at
    >>
     
org.codehaus.groovy.control.CompilationUnit.processPhaseOperations(CompilationUnit.java:692)
    >>     at
    >>
     
org.codehaus.groovy.control.CompilationUnit.compile(CompilationUnit.java:666)
    >>     at
    >>
     groovy.lang.GroovyClassLoader.doParseClass(GroovyClassLoader.java:365)
    >>     at
    >>
     
groovy.lang.GroovyClassLoader.lambda$parseClass$2(GroovyClassLoader.java:314)
    >>     at
    >>
     
org.codehaus.groovy.runtime.memoize.StampedCommonCache.compute(StampedCommonCache.java:163)
    >>     at
    >>
     
org.codehaus.groovy.runtime.memoize.StampedCommonCache.getAndPut(StampedCommonCache.java:154)
    >>     at
    >>
     groovy.lang.GroovyClassLoader.parseClass(GroovyClassLoader.java:314)
    >>     at
    org.kissweb.restServer.GroovyClass.<init>(GroovyClass.java:59)
    >>     at
    >>
     
org.kissweb.restServer.GroovyService.loadGroovyClass(GroovyService.java:400)
    >>     at
    >>
     org.kissweb.restServer.GroovyService.internalGroovy(GroovyService.java:265)
    >>     at
    >>
     org.kissweb.restServer.MainServlet.initializeSystem(MainServlet.java:352)
    >>     at
    >>
     
org.kissweb.restServer.StartupListener.contextInitialized(StartupListener.java:37)
    >>     at
    >>
     
org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4015)
    >>     at
    >>
     
org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:4438)
    >>     at
    >>
     org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:164)
    >>     at
    >>
     org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:566)
    >>     at
    >>
     org.apache.catalina.core.StandardHost.addChild(StandardHost.java:652)
    >>     at
    >>
     org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:926)
    >>     at
    >>
     org.apache.catalina.startup.HostConfig$DeployWar.run(HostConfig.java:1842)
    >>     at java.base/
    >>
     java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:545)
    >>     at
    java.base/java.util.concurrent.FutureTask.run(FutureTask.java:328)
    >>     at
    >>
     
org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75)
    >>     at java.base/
    >>
     
java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:125)
    >>     at
    >>
     org.apache.catalina.startup.HostConfig.deployWARs(HostConfig.java:730)
    >>     at
    >>
     org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:381)
    >>     at
    org.apache.catalina.startup.HostConfig.start(HostConfig.java:1582)
    >>     at
    >>
     org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:265)
    >>     at
    >>
     
org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:109)
    >>     at
    >>
     
org.apache.catalina.util.LifecycleBase.setStateInternal(LifecycleBase.java:389)
    >>     at
    >>
     org.apache.catalina.util.LifecycleBase.setState(LifecycleBase.java:336)
    >>     at
    >>
     
org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:743)
    >>     at
    >>
     org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:769)
    >>     at
    >>
     org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:164)
    >>     at
    >>
     
org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1164)
    >>     at
    >>
     
org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1160)
    >>     at
    java.base/java.util.concurrent.FutureTask.run(FutureTask.java:328)
    >>     at
    >>
     
org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75)
    >>     at java.base/
    >>
     
java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:149)
    >>     at
    >>
     
org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:716)
    >>     at
    >>
     
org.apache.catalina.core.StandardEngine.startInternal(StandardEngine.java:203)
    >>     at
    >>
     org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:164)
    >>     at
    >>
     
org.apache.catalina.core.StandardService.startInternal(StandardService.java:412)
    >>     at
    >>
     org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:164)
    >>     at
    >>
     
org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:866)
    >>     at
    >>
     org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:164)
    >>     at
    org.apache.catalina.startup.Catalina.start(Catalina.java:759)
    >>     at java.base/
    >>
     
jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:104)
    >>     at java.base/java.lang.reflect.Method.invoke(Method.java:565)
    >>     at
    org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:342)
    >>     at
    org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:473)
    >>     Caused by: java.lang.IllegalArgumentException: Unsupported
    class
    >>     file major version 69
    >>     at groovyjarjarasm.asm.ClassReader.<init>(ClassReader.java:200)
    >>     at groovyjarjarasm.asm.ClassReader.<init>(ClassReader.java:180)
    >>     at groovyjarjarasm.asm.ClassReader.<init>(ClassReader.java:166)
    >>     at groovyjarjarasm.asm.ClassReader.<init>(ClassReader.java:288)
    >>     at
    >>
     
org.codehaus.groovy.ast.decompiled.AsmDecompiler.parseClass(AsmDecompiler.java:83)
    >>     at
    >>
     
org.codehaus.groovy.control.ClassNodeResolver.findDecompiled(ClassNodeResolver.java:255)
    >>     at
    >>
     
org.codehaus.groovy.control.ClassNodeResolver.tryAsLoaderClassOrScript(ClassNodeResolver.java:193)
    >>     at
    >>
     
org.codehaus.groovy.control.ClassNodeResolver.findClassNode(ClassNodeResolver.java:175)
    >>     at
    >>
     
org.codehaus.groovy.control.ClassNodeResolver.resolveName(ClassNodeResolver.java:129)
    >>     at
    >>
     
org.codehaus.groovy.control.ResolveVisitor.resolveToOuter(ResolveVisitor.java:782)
    >>     at
    >>
     org.codehaus.groovy.control.ResolveVisitor.resolve(ResolveVisitor.java:423)
    >>     at
    >>
     
org.codehaus.groovy.control.ResolveVisitor.visitClass(ResolveVisitor.java:1240)
    >>     at
    >>
     
org.codehaus.groovy.control.ResolveVisitor.startResolving(ResolveVisitor.java:258)
    >>     at
    >>
     
org.codehaus.groovy.control.CompilationUnit.lambda$addPhaseOperations$3(CompilationUnit.java:207)
    >>     at
    >>
     
org.codehaus.groovy.control.CompilationUnit$ISourceUnitOperation.doPhaseOperation(CompilationUnit.java:897)
    >>     ... 50 more
    >>

Reply via email to