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 > >> > >
