grails-core icon indicating copy to clipboard operation
grails-core copied to clipboard

Groovy 5 support

Open matrei opened this issue 7 months ago • 9 comments

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

  • A discussion is started at https://github.com/spockframework/spock/discussions/2160

matrei avatar May 14 '25 22:05 matrei

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

matrei avatar May 15 '25 09:05 matrei

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

==============================================================================

jdaugherty avatar Aug 22 '25 13:08 jdaugherty

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

matrei avatar Aug 22 '25 14:08 matrei

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 🎉

matrei avatar Sep 08 '25 08:09 matrei

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 🎉

matrei avatar Sep 08 '25 08:09 matrei

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 🎉

matrei avatar Sep 08 '25 08:09 matrei

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 574b5762a7a5158301209d4dd4360be33d6d528a 🎉

matrei avatar Sep 09 '25 07:09 matrei

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 https://github.com/apache/groovy/pull/2292 🎉

matrei avatar Sep 13 '25 06:09 matrei