Skip to content

Groovy 5 support #14736

Closed
Closed

Description

@matrei

Issue description

This ticket will track issues with upgrading Grails to Groovy 5.

Compilation errors

Groovy 5 updated the Groovy shell

/home/runner/work/grails-core/grails-core/grails-console/src/main/groovy/grails/ui/shell/support/GroovyshApplicationContext.groovy: 21: unable to resolve class org.apache.groovy.groovysh.Groovysh
> Task :grails-console:compileGroovy
 @ line 21, column 8.
   import org.apache.groovy.groovysh.Groovysh
          ^

/home/runner/work/grails-core/grails-core/grails-console/src/main/groovy/grails/ui/shell/support/GroovyshWebApplicationContext.groovy: 23: unable to resolve class org.apache.groovy.groovysh.Groovysh
 @ line 23, column 8.
   import org.apache.groovy.groovysh.Groovysh
          ^

2 errors

Spock

Spock does not currently support Groovy 5

Activity

  1. matrei commented on May 15, 2025

    @matrei
    ContributorAuthor

    Branch/PR for upgrading to Groovy 5 (when the time comes): #14737

  2. jdaugherty commented on Aug 22, 2025

    @jdaugherty
    Contributor

    Another error in the latest groovy snapshot:

    1: Task failed with an exception.
    -----------
    * What went wrong:
    Execution failed for task ':grails-datastore-core:compileGroovy'.
    > Unrecoverable compilation error: startup failed:
      General error during conversion: The interface Collection cannot be implemented more than once with different arguments: java.util.Collection<java.lang.Object> and java.util.Collection
      . At [30:1] 
      
      org.codehaus.groovy.syntax.RuntimeParserException: The interface Collection cannot be implemented more than once with different arguments: java.util.Collection<java.lang.Object> and java.util.Collection
      . At [30:1] 
            at org.codehaus.groovy.classgen.Verifier.checkForDuplicateInterfaces(Verifier.java:409)
            at org.codehaus.groovy.classgen.Verifier.visitClass(Verifier.java:235)
            at org.codehaus.groovy.tools.javac.JavaStubGenerator$1.visitClass(JavaStubGenerator.java:236)
            at org.codehaus.groovy.tools.javac.JavaStubGenerator.printClassContents(JavaStubGenerator.java:331)
            at org.codehaus.groovy.tools.javac.JavaStubGenerator.generateStubContent(JavaStubGenerator.java:204)
            at org.codehaus.groovy.tools.javac.JavaStubGenerator.generateFileStub(JavaStubGenerator.java:181)
            at org.codehaus.groovy.tools.javac.JavaStubGenerator.generateClass(JavaStubGenerator.java:161)
            at org.codehaus.groovy.tools.javac.JavaAwareCompilationUnit.lambda$new$2(JavaAwareCompilationUnit.java:111)
            at org.codehaus.groovy.control.CompilationUnit$IPrimaryClassNodeOperation.doPhaseOperation(CompilationUnit.java:920)
            at org.codehaus.groovy.control.CompilationUnit.processPhaseOperations(CompilationUnit.java:666)
            at org.codehaus.groovy.control.CompilationUnit.compile(CompilationUnit.java:640)
            at org.codehaus.groovy.control.CompilationUnit.compile(CompilationUnit.java:621)
            at org.gradle.api.internal.tasks.compile.ApiGroovyCompiler.execute(ApiGroovyCompiler.java:285)
            at org.gradle.api.internal.tasks.compile.ApiGroovyCompiler.execute(ApiGroovyCompiler.java:67)
            at org.gradle.api.internal.tasks.compile.GroovyCompilerFactory$DaemonSideCompiler.execute(GroovyCompilerFactory.java:115)
            at org.gradle.api.internal.tasks.compile.GroovyCompilerFactory$DaemonSideCompiler.execute(GroovyCompilerFactory.java:99)
            at org.gradle.api.internal.tasks.compile.daemon.AbstractIsolatedCompilerWorkerExecutor$CompilerWorkAction.execute(AbstractIsolatedCompilerWorkerExecutor.java:78)
            at org.gradle.workers.internal.DefaultWorkerServer.execute(DefaultWorkerServer.java:63)
            at org.gradle.workers.internal.AbstractClassLoaderWorker$1.create(AbstractClassLoaderWorker.java:54)
            at org.gradle.workers.internal.AbstractClassLoaderWorker$1.create(AbstractClassLoaderWorker.java:48)
            at org.gradle.internal.classloader.ClassLoaderUtils.executeInClassloader(ClassLoaderUtils.java:100)
            at org.gradle.workers.internal.AbstractClassLoaderWorker.executeInClassLoader(AbstractClassLoaderWorker.java:48)
            at org.gradle.workers.internal.IsolatedClassloaderWorker.run(IsolatedClassloaderWorker.java:49)
            at org.gradle.workers.internal.IsolatedClassloaderWorker.run(IsolatedClassloaderWorker.java:30)
            at org.gradle.workers.internal.WorkerDaemonServer.run(WorkerDaemonServer.java:108)
            at org.gradle.workers.internal.WorkerDaemonServer.run(WorkerDaemonServer.java:77)
            at org.gradle.process.internal.worker.request.WorkerAction.lambda$run$1(WorkerAction.java:150)
            at org.gradle.process.internal.worker.child.WorkerLogEventListener.withWorkerLoggingProtocol(WorkerLogEventListener.java:41)
            at org.gradle.process.internal.worker.request.WorkerAction.lambda$run$2(WorkerAction.java:150)
            at org.gradle.internal.operations.CurrentBuildOperationRef.with(CurrentBuildOperationRef.java:85)
            at org.gradle.process.internal.worker.request.WorkerAction.run(WorkerAction.java:142)
            at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
            at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
            at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
            at java.base/java.lang.reflect.Method.invoke(Method.java:569)
            at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:36)
            at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24)
            at org.gradle.internal.remote.internal.hub.MessageHubBackedObjectConnection$DispatchWrapper.dispatch(MessageHubBackedObjectConnection.java:182)
            at org.gradle.internal.remote.internal.hub.MessageHubBackedObjectConnection$DispatchWrapper.dispatch(MessageHubBackedObjectConnection.java:164)
            at org.gradle.internal.remote.internal.hub.MessageHub$Handler.run(MessageHub.java:414)
            at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64)
            at org.gradle.internal.concurrent.AbstractManagedExecutor$1.run(AbstractManagedExecutor.java:48)
            at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)
            at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
            at java.base/java.lang.Thread.run(Thread.java:840)
      
      1 error
    
    ==============================================================================
    
  3. matrei commented on Aug 22, 2025

    @matrei
    ContributorAuthor

    Another error in the latest groovy snapshot

    I have created a ticket in the Groovy bug tracker for this error.
    https://issues.apache.org/jira/browse/GROOVY-11736

  4. matrei commented on Sep 8, 2025

    @matrei
    ContributorAuthor
    GPathResultMapSpec > Test nested elements FAILED
        groovy.lang.MissingFieldException: No such field: id for class: groovy.xml.slurpersupport.NodeChild
           at org.grails.databinding.xml.GPathResultMap.<init>(GPathResultMap.groovy:35)
           at org.grails.databinding.xml.GPathResultMapSpec.Test nested elements(GPathResultMapSpec.groovy:44)

    Discussion: https://lists.apache.org/thread/9qz4xsmw702tgt45f2y8xz5h8ftj4tyl

    This issue has been resolved in Groovy 5.0.1 🎉

  5. matrei commented on Sep 8, 2025

    @matrei
    ContributorAuthor
    Execution failed for task ':grails-datamapping-core:compileGroovy'.
    > BUG! exception in phase 'semantic analysis' in source unit '/home/mattias/Projects/grails/grails-core/grails-datamapping-> core/src/main/groovy/org/grails/datastore/gorm/GormEntity.groovy' ClassNode#getTypeClass for org.grails.datastore.gorm.GormEntityApi called before the type class is set

    This issue has been resolved in Groovy 5.0.1 🎉

  6. matrei commented on Sep 8, 2025

    @matrei
    ContributorAuthor
    Execution failed for task ':grails-datastore-core:compileGroovy'.
    > Unrecoverable compilation error: startup failed:
     General error during conversion: The interface Collection cannot be implemented more than once with different >arguments: java.util.Collection<java.lang.Object> and java.util.Collection
     . At [30:1] 
     
     org.codehaus.groovy.syntax.RuntimeParserException: The interface Collection cannot be implemented more than once with different arguments: java.util.Collection<java.lang.Object> and java.util.Collection
    

    This issue has been resolved in Groovy 5.0.1 🎉

  7. matrei commented on Sep 9, 2025

    @matrei
    ContributorAuthor

    Error: java.lang.ClassCastException: class org.codehaus.groovy.ast.ClassNode cannot be cast to class org.codehaus.groovy.ast.InnerClassNode

    Build scan: https://ge.grails.org/s/qzyrkrxky2xeu

    FAILURE: Build failed with an exception.
    
    * What went wrong:
    Execution failed for task ':grails-datastore-core:compileTestGroovy'.
    > BUG! exception in phase 'semantic analysis' in source unit '/home/mattias/Projects/grails-core/grails-datastore-core/src/test/groovy/org/grails/datastore/mapping/model/JpaMappingSyntaxTests.groovy' class org.codehaus.groovy.ast.ClassNode cannot be cast to class org.codehaus.groovy.ast.InnerClassNode (org.codehaus.groovy.ast.ClassNode and org.codehaus.groovy.ast.InnerClassNode are in unnamed module of loader org.gradle.internal.classloader.VisitableURLClassLoader @6cd5cc65)
    
    * Try:
    > Run with --info or --debug option to get more log output.
    > Get more help at https://help.gradle.org.
    
    * Exception is:
    org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':grails-datastore-core:compileTestGroovy'.
    	at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.lambda$executeIfValid$1(ExecuteActionsTaskExecuter.java:130)
    	at org.gradle.internal.Try$Failure.ifSuccessfulOrElse(Try.java:293)
    	at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeIfValid(ExecuteActionsTaskExecuter.java:128)
    	at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:116)
    	at org.gradle.api.internal.tasks.execution.ProblemsTaskPathTrackingTaskExecuter.execute(ProblemsTaskPathTrackingTaskExecuter.java:41)
    	at org.gradle.api.internal.tasks.execution.FinalizePropertiesTaskExecuter.execute(FinalizePropertiesTaskExecuter.java:46)
    	at org.gradle.api.internal.tasks.execution.ResolveTaskExecutionModeExecuter.execute(ResolveTaskExecutionModeExecuter.java:51)
    	at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:57)
    	at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:74)
    	at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:36)
    	at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.executeTask(EventFiringTaskExecuter.java:77)
    	at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:55)
    	at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:52)
    	at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:210)
    	at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:205)
    	at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:67)
    	at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:60)
    	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:167)
    	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:60)
    	at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:54)
    	at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter.execute(EventFiringTaskExecuter.java:52)
    	at org.gradle.execution.plan.LocalTaskNodeExecutor.execute(LocalTaskNodeExecutor.java:42)
    	at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:331)
    	at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:318)
    	at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.lambda$execute$0(DefaultTaskExecutionGraph.java:314)
    	at org.gradle.internal.operations.CurrentBuildOperationRef.with(CurrentBuildOperationRef.java:85)
    	at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:314)
    	at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:303)
    	at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.execute(DefaultPlanExecutor.java:459)
    	at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.run(DefaultPlanExecutor.java:376)
    	at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64)
    	at org.gradle.internal.concurrent.AbstractManagedExecutor$1.run(AbstractManagedExecutor.java:48)
    Caused by: BUG! exception in phase 'semantic analysis' in source unit '/home/mattias/Projects/grails-core/grails-datastore-core/src/test/groovy/org/grails/datastore/mapping/model/JpaMappingSyntaxTests.groovy' class org.codehaus.groovy.ast.ClassNode cannot be cast to class org.codehaus.groovy.ast.InnerClassNode (org.codehaus.groovy.ast.ClassNode and org.codehaus.groovy.ast.InnerClassNode are in unnamed module of loader org.gradle.internal.classloader.VisitableURLClassLoader @6cd5cc65)
    	at org.gradle.api.internal.tasks.compile.ApiGroovyCompiler.execute(ApiGroovyCompiler.java:285)
    	at org.gradle.api.internal.tasks.compile.ApiGroovyCompiler.execute(ApiGroovyCompiler.java:67)
    	at org.gradle.api.internal.tasks.compile.GroovyCompilerFactory$DaemonSideCompiler.execute(GroovyCompilerFactory.java:115)
    	at org.gradle.api.internal.tasks.compile.GroovyCompilerFactory$DaemonSideCompiler.execute(GroovyCompilerFactory.java:99)
    	at org.gradle.api.internal.tasks.compile.daemon.AbstractIsolatedCompilerWorkerExecutor$CompilerWorkAction.execute(AbstractIsolatedCompilerWorkerExecutor.java:78)
    	at org.gradle.workers.internal.DefaultWorkerServer.execute(DefaultWorkerServer.java:63)
    	at org.gradle.workers.internal.AbstractClassLoaderWorker$1.create(AbstractClassLoaderWorker.java:54)
    	at org.gradle.workers.internal.AbstractClassLoaderWorker$1.create(AbstractClassLoaderWorker.java:48)
    	at org.gradle.internal.classloader.ClassLoaderUtils.executeInClassloader(ClassLoaderUtils.java:100)
    	at org.gradle.workers.internal.AbstractClassLoaderWorker.executeInClassLoader(AbstractClassLoaderWorker.java:48)
    	at org.gradle.workers.internal.IsolatedClassloaderWorker.run(IsolatedClassloaderWorker.java:49)
    	at org.gradle.workers.internal.IsolatedClassloaderWorker.run(IsolatedClassloaderWorker.java:30)
    	at org.gradle.workers.internal.WorkerDaemonServer.run(WorkerDaemonServer.java:108)
    	at org.gradle.workers.internal.WorkerDaemonServer.run(WorkerDaemonServer.java:77)
    	at org.gradle.process.internal.worker.request.WorkerAction.lambda$run$1(WorkerAction.java:150)
    	at org.gradle.process.internal.worker.child.WorkerLogEventListener.withWorkerLoggingProtocol(WorkerLogEventListener.java:41)
    	at org.gradle.process.internal.worker.request.WorkerAction.lambda$run$2(WorkerAction.java:150)
    	at org.gradle.internal.operations.CurrentBuildOperationRef.with(CurrentBuildOperationRef.java:85)
    	at org.gradle.process.internal.worker.request.WorkerAction.run(WorkerAction.java:142)
    	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
    	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    	at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:36)
    	at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24)
    	at org.gradle.internal.remote.internal.hub.MessageHubBackedObjectConnection$DispatchWrapper.dispatch(MessageHubBackedObjectConnection.java:182)
    	at org.gradle.internal.remote.internal.hub.MessageHubBackedObjectConnection$DispatchWrapper.dispatch(MessageHubBackedObjectConnection.java:164)
    	at org.gradle.internal.remote.internal.hub.MessageHub$Handler.run(MessageHub.java:414)
    	at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64)
    	at org.gradle.internal.concurrent.AbstractManagedExecutor$1.run(AbstractManagedExecutor.java:48)
    Caused by: java.lang.ClassCastException: class org.codehaus.groovy.ast.ClassNode cannot be cast to class org.codehaus.groovy.ast.InnerClassNode (org.codehaus.groovy.ast.ClassNode and org.codehaus.groovy.ast.InnerClassNode are in unnamed module of loader org.gradle.internal.classloader.VisitableURLClassLoader @6cd5cc65)
    	at org.grails.compiler.gorm.GormEntityTransformation.visit(GormEntityTransformation.groovy:163)
    	at org.grails.compiler.gorm.JpaGormEntityTransformation.visit(JpaGormEntityTransformation.groovy:69)
    	at org.grails.compiler.gorm.GlobalJpaEntityTransform.visitClass(GlobalJpaEntityTransform.groovy:65)
    	at org.grails.compiler.gorm.GlobalJpaEntityTransform.visit(GlobalJpaEntityTransform.groovy:57)
    	... 29 more

    Groovy ticket: https://issues.apache.org/jira/projects/GROOVY/issues/GROOVY-11754

    This issue has been resolved by 574b576 🎉

  8. matrei commented on Sep 13, 2025

    @matrei
    ContributorAuthor

    Error: Can't have an abstract method in a non-abstract class

    But the method is actually implemented in the parent class.

    > Task :grails-core:compileGroovy
    startup failed:
    /home/mattias/Projects/grails/grails-core/grails-core/src/main/groovy/grails/boot/config/tools/ProfilingGrailsApplicationPostProcessor.groovy: 35: Can't have an abstract method in a non-abstract class. The class 'grails.boot.config.tools.ProfilingGrailsApplicationPostProcessor' must be declared abstract or the method 'void onApplicationEvent(E)' must be implemented.
     @ line 35, column 1.
       class ProfilingGrailsApplicationPostProcessor extends GrailsApplicationPostProcessor implements BeanPostProcessor {
       ^
    
    1 error

    Groovy ticket: https://issues.apache.org/jira/browse/GROOVY-11753

    This issue has been resolved by apache/groovy#2292 🎉

  9. dauer commented on Dec 11, 2025

    @dauer
    Contributor

    Spock 2.4 with support for Groovy 5 has been released 🎉

  10. added this to the grails:8.0.0-M1 milestone on Jan 20, 2026
  11. moved this to In Progress in Apache Grailson Feb 5, 2026
  12. jdaugherty commented on Jul 5, 2026

    @jdaugherty
    Contributor

    Fixed by #15557

  13. moved this from In Progress to Done in Apache Grailson Jul 5, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions