Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Does not work on JDK 16 #231

Closed
boris-petrov opened this issue Jun 14, 2021 · 15 comments
Closed

Does not work on JDK 16 #231

boris-petrov opened this issue Jun 14, 2021 · 15 comments
Assignees

Comments

@boris-petrov
Copy link
Member

plugins {
	id 'java'
	id 'org.gretty' version '3.0.4'
}

repositories {
	jcenter()
}

Running gradle appStart on JDK 16 on this build.gradle file in an empty directory leads to:

Exception in thread "main" org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed:
General error during semantic analysis: Unsupported class file major version 60

java.lang.IllegalArgumentException: Unsupported class file major version 60
	at groovyjarjarasm.asm.ClassReader.<init>(ClassReader.java:196)
	at groovyjarjarasm.asm.ClassReader.<init>(ClassReader.java:177)
	at groovyjarjarasm.asm.ClassReader.<init>(ClassReader.java:163)
	at groovyjarjarasm.asm.ClassReader.<init>(ClassReader.java:284)
	at org.codehaus.groovy.ast.decompiled.AsmDecompiler.parseClass(AsmDecompiler.java:81)
	at org.codehaus.groovy.control.ClassNodeResolver.findDecompiled(ClassNodeResolver.java:251)
	at org.codehaus.groovy.control.ClassNodeResolver.tryAsLoaderClassOrScript(ClassNodeResolver.java:189)
	at org.codehaus.groovy.control.ClassNodeResolver.findClassNode(ClassNodeResolver.java:169)
	at org.codehaus.groovy.control.ClassNodeResolver.resolveName(ClassNodeResolver.java:125)
	at org.codehaus.groovy.ast.decompiled.AsmReferenceResolver.resolveClassNullable(AsmReferenceResolver.java:57)
	at org.codehaus.groovy.ast.decompiled.AsmReferenceResolver.resolveClass(AsmReferenceResolver.java:44)
	at org.codehaus.groovy.ast.decompiled.ClassSignatureParser.configureClass(ClassSignatureParser.java:42)
	at org.codehaus.groovy.ast.decompiled.DecompiledClassNode.lazyInitSupers(DecompiledClassNode.java:183)
	at org.codehaus.groovy.ast.decompiled.DecompiledClassNode.getUnresolvedSuperClass(DecompiledClassNode.java:128)
	at org.codehaus.groovy.ast.ClassNode.getUnresolvedSuperClass(ClassNode.java:1024)
	at org.codehaus.groovy.ast.ClassNode.getSuperClass(ClassNode.java:1018)
	at org.codehaus.groovy.ast.ClassNode.getMethods(ClassNode.java:913)
	at org.apache.groovy.ast.tools.ClassNodeUtils.hasPossibleStaticMethod(ClassNodeUtils.java:235)
	at org.codehaus.groovy.ast.ClassNode.hasPossibleStaticMethod(ClassNode.java:1342)
	at org.codehaus.groovy.control.StaticImportVisitor.findStaticMethod(StaticImportVisitor.java:567)
	at org.codehaus.groovy.control.StaticImportVisitor.findStaticMethodImportFromModule(StaticImportVisitor.java:509)
	at org.codehaus.groovy.control.StaticImportVisitor.transformMethodCallExpression(StaticImportVisitor.java:254)
	at org.codehaus.groovy.control.StaticImportVisitor.transform(StaticImportVisitor.java:113)
	at org.codehaus.groovy.ast.ClassCodeExpressionTransformer.visitExpressionStatement(ClassCodeExpressionTransformer.java:142)
	at org.codehaus.groovy.ast.stmt.ExpressionStatement.visit(ExpressionStatement.java:40)
	at org.codehaus.groovy.ast.ClassCodeVisitorSupport.visitClassCodeContainer(ClassCodeVisitorSupport.java:110)
	at org.codehaus.groovy.ast.ClassCodeVisitorSupport.visitConstructorOrMethod(ClassCodeVisitorSupport.java:121)
	at org.codehaus.groovy.ast.ClassCodeExpressionTransformer.visitConstructorOrMethod(ClassCodeExpressionTransformer.java:53)
	at org.codehaus.groovy.control.StaticImportVisitor.visitConstructorOrMethod(StaticImportVisitor.java:89)
	at org.codehaus.groovy.ast.ClassCodeVisitorSupport.visitMethod(ClassCodeVisitorSupport.java:132)
	at org.codehaus.groovy.ast.ClassNode.visitContents(ClassNode.java:1103)
	at org.codehaus.groovy.ast.ClassCodeVisitorSupport.visitClass(ClassCodeVisitorSupport.java:54)
	at org.codehaus.groovy.control.StaticImportVisitor.visitClass(StaticImportVisitor.java:83)
	at org.codehaus.groovy.control.CompilationUnit$14.call(CompilationUnit.java:708)
	at org.codehaus.groovy.control.CompilationUnit.applyToPrimaryClassNodes(CompilationUnit.java:1084)
	at org.codehaus.groovy.control.CompilationUnit.doPhaseOperation(CompilationUnit.java:640)
	at org.codehaus.groovy.control.CompilationUnit.processPhaseOperations(CompilationUnit.java:618)
	at org.codehaus.groovy.control.CompilationUnit.compile(CompilationUnit.java:595)
	at groovy.lang.GroovyClassLoader.doParseClass(GroovyClassLoader.java:401)
	at groovy.lang.GroovyClassLoader.access$300(GroovyClassLoader.java:89)
	at groovy.lang.GroovyClassLoader$5.provide(GroovyClassLoader.java:341)
	at groovy.lang.GroovyClassLoader$5.provide(GroovyClassLoader.java:338)
	at org.codehaus.groovy.runtime.memoize.ConcurrentCommonCache.getAndPut(ConcurrentCommonCache.java:147)
	at groovy.lang.GroovyClassLoader.parseClass(GroovyClassLoader.java:336)
	at groovy.lang.GroovyShell.parseClass(GroovyShell.java:546)
	at groovy.lang.GroovyShell.parse(GroovyShell.java:558)
	at groovy.lang.GroovyShell.parse(GroovyShell.java:594)
	at groovy.lang.GroovyShell.parse(GroovyShell.java:585)
	at groovy.lang.GroovyShell$parse.call(Unknown Source)
	at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:47)
	at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:115)
	at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:127)
	at org.akhikhl.gretty.GafferConfiguratorEx.run(GafferConfiguratorEx.groovy:53)
	at org.akhikhl.gretty.GafferConfiguratorEx$run.call(Unknown Source)
	at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:47)
	at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:115)
	at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:135)
	at org.akhikhl.gretty.Runner.initLogback(Runner.groovy:83)
	at org.akhikhl.gretty.Runner$initLogback.callCurrent(Unknown Source)
	at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallCurrent(CallSiteArray.java:51)
	at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:156)
	at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:168)
	at org.akhikhl.gretty.Runner.run(Runner.groovy:127)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:78)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:567)
	at org.codehaus.groovy.runtime.callsite.PlainObjectMetaMethodSite.doInvoke(PlainObjectMetaMethodSite.java:43)
	at org.codehaus.groovy.runtime.callsite.PogoMetaMethodSite$PogoCachedMethodSiteNoUnwrapNoCoerce.invoke(PogoMetaMethodSite.java:190)
	at org.codehaus.groovy.runtime.callsite.PogoMetaMethodSite.call(PogoMetaMethodSite.java:70)
	at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:47)
	at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:115)
	at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:119)
	at org.akhikhl.gretty.Runner.main(Runner.groovy:54)

1 error

	at org.codehaus.groovy.control.ErrorCollector.failIfErrors(ErrorCollector.java:311)
	at org.codehaus.groovy.control.CompilationUnit.applyToPrimaryClassNodes(CompilationUnit.java:1102)
	at org.codehaus.groovy.control.CompilationUnit.doPhaseOperation(CompilationUnit.java:640)
	at org.codehaus.groovy.control.CompilationUnit.processPhaseOperations(CompilationUnit.java:618)
	at org.codehaus.groovy.control.CompilationUnit.compile(CompilationUnit.java:595)
	at groovy.lang.GroovyClassLoader.doParseClass(GroovyClassLoader.java:401)
	at groovy.lang.GroovyClassLoader.access$300(GroovyClassLoader.java:89)
	at groovy.lang.GroovyClassLoader$5.provide(GroovyClassLoader.java:341)
	at groovy.lang.GroovyClassLoader$5.provide(GroovyClassLoader.java:338)
	at org.codehaus.groovy.runtime.memoize.ConcurrentCommonCache.getAndPut(ConcurrentCommonCache.java:147)
	at groovy.lang.GroovyClassLoader.parseClass(GroovyClassLoader.java:336)
	at groovy.lang.GroovyShell.parseClass(GroovyShell.java:546)
	at groovy.lang.GroovyShell.parse(GroovyShell.java:558)
	at groovy.lang.GroovyShell.parse(GroovyShell.java:594)
	at groovy.lang.GroovyShell.parse(GroovyShell.java:585)
	at groovy.lang.GroovyShell$parse.call(Unknown Source)
	at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:47)
	at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:115)
	at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:127)
	at org.akhikhl.gretty.GafferConfiguratorEx.run(GafferConfiguratorEx.groovy:53)
	at org.akhikhl.gretty.GafferConfiguratorEx$run.call(Unknown Source)
	at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:47)
	at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:115)
	at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:135)
	at org.akhikhl.gretty.Runner.initLogback(Runner.groovy:83)
	at org.akhikhl.gretty.Runner$initLogback.callCurrent(Unknown Source)
	at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallCurrent(CallSiteArray.java:51)
	at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:156)
	at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:168)
	at org.akhikhl.gretty.Runner.run(Runner.groovy:127)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:78)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:567)
	at org.codehaus.groovy.runtime.callsite.PlainObjectMetaMethodSite.doInvoke(PlainObjectMetaMethodSite.java:43)
	at org.codehaus.groovy.runtime.callsite.PogoMetaMethodSite$PogoCachedMethodSiteNoUnwrapNoCoerce.invoke(PogoMetaMethodSite.java:190)
	at org.codehaus.groovy.runtime.callsite.PogoMetaMethodSite.call(PogoMetaMethodSite.java:70)
	at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:47)
	at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:115)
	at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:119)
	at org.akhikhl.gretty.Runner.main(Runner.groovy:54)
Exception in thread "Thread-120" org.gradle.process.internal.ExecException: Process 'command '/usr/lib/jvm/java-16-openjdk/bin/java'' finished with non-zero exit value 1
	at org.gradle.process.internal.DefaultExecHandle$ExecResultImpl.assertNormalExitValue(DefaultExecHandle.java:414)
	at org.gradle.process.internal.DefaultJavaExecAction.execute(DefaultJavaExecAction.java:52)
	at org.gradle.process.internal.DefaultExecActionFactory.javaexec(DefaultExecActionFactory.java:198)
	at org.gradle.api.internal.project.DefaultProject.javaexec(DefaultProject.java:1145)
	at org.gradle.api.internal.project.DefaultProject.javaexec(DefaultProject.java:1140)
	at org.gradle.api.Project$javaexec$6.call(Unknown Source)
	at org.akhikhl.gretty.DefaultLauncher.javaExec(DefaultLauncher.groovy:100)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:78)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:567)
	at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:107)
	at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:323)
	at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:351)
	at org.codehaus.groovy.runtime.callsite.PogoMetaClassSite.callCurrent(PogoMetaClassSite.java:61)
	at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:185)
	at org.akhikhl.gretty.LauncherBase$_launchThread_closure3.doCall(LauncherBase.groovy:197)
	at org.akhikhl.gretty.LauncherBase$_launchThread_closure3.doCall(LauncherBase.groovy)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:78)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:567)
	at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:107)
	at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:323)
	at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:263)
	at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1035)
	at groovy.lang.Closure.call(Closure.java:412)
	at groovy.lang.Closure.call(Closure.java:406)
	at groovy.lang.Closure.run(Closure.java:493)
	at java.base/java.lang.Thread.run(Thread.java:831)

@f4lco - I don't understand what's going on. As I've mentioned before, Gretty seems to use Groovy 2.5.14 for some reason. Obviously that's true because of the error above. My only wild guess is that Gretty uses the Groovy version that the Gradle version that we build with uses - we build with Gradle 6.x which uses Groovy 2.5.14. I don't see where else that version would come from. And also, why doesn't the CI fail?! Any ideas?

@f4lco
Copy link
Collaborator

f4lco commented Jun 15, 2021

My only wild guess is that Gretty uses the Groovy version that the Gradle version that we build with uses - we build with Gradle 6.x which uses Groovy 2.5.14.

That is correct. Groovy makes it on the classpath as a transitive dependency of the runner projects. I guess the proper fix consists of

  • ensuring that Gretty modules no longer have Groovy in their api scope (this already bothered me while doing 57298bb but I did not dare to change it, and at the time I did not think it was a footgun)
  • add code to Gretty which determines the Groovy version that is currently running, and cause Gretty to put that Groovy version on the runner classpath

For the tests, the fact that the Java 16 build passes is unfortunate. I don't know if is easy to add a 'cross Gradle version' test run to the build matrix, like 'built with 6, tested on 7, Java 16'. It might be very easy or very hard.

@boris-petrov
Copy link
Member Author

Thanks for digging in this.

On your points:

  1. how can we remove Groovy from api? Isn't it used?
  2. why does Gretty have to put a Groovy version on the classpath? Doesn't Gradle already provide one? I.e. when a user runs gradle appStart there already is a Groovy running. Gretty is not forked in a new process so I believe Groovy should already be on the classpath? Or am I misunderstanding something?

Another solution to that problem would be to have two builds of Gretty 3... Gretty 3 - Gradle 6 and Gretty 3 - Gradle 7. Very horrible but will get the job done...

@f4lco
Copy link
Collaborator

f4lco commented Jun 17, 2021

how can we remove Groovy from api? Isn't it used?

That was a bit imprecise, rather than getting rid of it, I suggest to move the Groovy dependency from api to compileOnly, for example. That way the runner projects have no externally visible dependency on a Groovy version and expect Groovy libraries to be provided at runtime (which is exactly what Gretty would do, choosing the correct Groovy distribution depending on the Gradle version that is currently running).

why does Gretty have to put a Groovy version on the classpath? Doesn't Gradle already provide one? I.e. when a user runs gradle appStart there already is a Groovy running. Gretty is not forked in a new process so I believe Groovy should already be on the classpath? Or am I misunderstanding something?

"Gretty is not forked in a new process": to my understanding, that is partially true. Yes, as in "Gretty the Gradle plugin", Gretty must not have the Groovy dependency, because Gradle already provides one. I do think "Gretty the runner process" is a forked execution without inheriting the classpath of Gradle (see for example LauncherBase with the JavaExec, or the main method of the Runner). As a result, I think Gretty must explicitly pass on a Groovy distribution to the separate runner process. If I remember correctly, this currently happens as a a transitive dependency of the runner projects, which forms a dependency on the build environment (Gradle version).

I think that approach is much better long-term, and avoids having to meddle with separate Gretty builds and distributions. I'd consider to do it, but first we must have a known-good Gretty release in place. I do not perceive this as urgent. But if done, I'd really like a functioning previous release on official channels just in case this change messes up in some way.

boris-petrov added a commit that referenced this issue Jun 25, 2021
Until we fix Gretty on 16:
#231
@tommyettinger
Copy link

I'm still getting this error (or a similar one) with Gretty 3.0.5, Java 16, and Gradle 7.1, in a multi-module project. My relevant build,gradle source is:

buildscript {
	repositories {
		mavenCentral()
		gradlePluginPortal()
	}
	dependencies {
		classpath "org.gretty:gretty:3.0.5"
	}
}
apply plugin: "gwt"
apply plugin: "war"
apply plugin: "org.gretty"

...

I'm using GWT, which has two modes it can use to test a site -- dist, which is slower but builds an optimized site, and superDev, which allows debugging and hot-swapping code. The superDev task in my situation uses Gretty to serve the actual webpage being debugged, while GWT itself handles serving the debug-related supporting pages. Running superDev hits apparently multiple issues:

9:33:26 PM: Executing task 'superDev'...

Starting Gradle Daemon...
Gradle Daemon started in 2 s 439 ms
> Task :core:compileJava
> Task :html:prepareInplaceWebAppFolder UP-TO-DATE
> Task :html:createInplaceWebAppFolder UP-TO-DATE
> Task :html:compileJava
> Task :html:processResources NO-SOURCE
> Task :html:classes
> Task :html:prepareInplaceWebAppClasses
> Task :html:prepareInplaceWebApp
> Task :html:addSource

> Task :html:draftCompileGwt
C:\d\GitHub\SquidLib-Demos\SquidSquad\DawnlikeDemo\html\.
../assets
Copying resources from ../assets to war/
C:\d\GitHub\SquidLib-Demos\SquidSquad\DawnlikeDemo\html\..\assets
C:\d\GitHub\SquidLib-Demos\SquidSquad\DawnlikeDemo\html\assets
C:\d\GitHub\SquidLib-Demos\SquidSquad\DawnlikeDemo\html\.
../assets
Copying resources from ../assets to war/
C:\d\GitHub\SquidLib-Demos\SquidSquad\DawnlikeDemo\html\..\assets
C:\d\GitHub\SquidLib-Demos\SquidSquad\DawnlikeDemo\html\assets

> Task :html:startHttpServer
> Task :html:compileTestJava NO-SOURCE
> Task :html:processTestResources NO-SOURCE
> Task :html:testClasses UP-TO-DATE
Exception in thread "main" org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed:
General error during semantic analysis: Unsupported class file major version 60

java.lang.IllegalArgumentException: Unsupported class file major version 60
	at groovyjarjarasm.asm.ClassReader.<init>(ClassReader.java:196)
	at groovyjarjarasm.asm.ClassReader.<init>(ClassReader.java:177)
	at groovyjarjarasm.asm.ClassReader.<init>(ClassReader.java:163)
	at groovyjarjarasm.asm.ClassReader.<init>(ClassReader.java:284)
	at org.codehaus.groovy.ast.decompiled.AsmDecompiler.parseClass(AsmDecompiler.java:81)
	at org.codehaus.groovy.control.ClassNodeResolver.findDecompiled(ClassNodeResolver.java:251)
	at org.codehaus.groovy.control.ClassNodeResolver.tryAsLoaderClassOrScript(ClassNodeResolver.java:189)
	at org.codehaus.groovy.control.ClassNodeResolver.findClassNode(ClassNodeResolver.java:169)
	at org.codehaus.groovy.control.ClassNodeResolver.resolveName(ClassNodeResolver.java:125)
	at org.codehaus.groovy.ast.decompiled.AsmReferenceResolver.resolveClassNullable(AsmReferenceResolver.java:57)
	at org.codehaus.groovy.ast.decompiled.AsmReferenceResolver.resolveClass(AsmReferenceResolver.java:44)
	at org.codehaus.groovy.ast.decompiled.ClassSignatureParser.configureClass(ClassSignatureParser.java:42)
	at org.codehaus.groovy.ast.decompiled.DecompiledClassNode.lazyInitSupers(DecompiledClassNode.java:183)
	at org.codehaus.groovy.ast.decompiled.DecompiledClassNode.getUnresolvedSuperClass(DecompiledClassNode.java:128)
	at org.codehaus.groovy.ast.ClassNode.getUnresolvedSuperClass(ClassNode.java:1024)
	at org.codehaus.groovy.ast.ClassNode.getSuperClass(ClassNode.java:1018)
	at org.codehaus.groovy.ast.ClassNode.getMethods(ClassNode.java:913)
	at org.apache.groovy.ast.tools.ClassNodeUtils.hasPossibleStaticMethod(ClassNodeUtils.java:235)
	at org.codehaus.groovy.ast.ClassNode.hasPossibleStaticMethod(ClassNode.java:1347)
	at org.codehaus.groovy.control.StaticImportVisitor.findStaticMethod(StaticImportVisitor.java:566)
	at org.codehaus.groovy.control.StaticImportVisitor.findStaticMethodImportFromModule(StaticImportVisitor.java:508)
	at org.codehaus.groovy.control.StaticImportVisitor.transformMethodCallExpression(StaticImportVisitor.java:254)
	at org.codehaus.groovy.control.StaticImportVisitor.transform(StaticImportVisitor.java:113)
	at org.codehaus.groovy.ast.ClassCodeExpressionTransformer.visitExpressionStatement(ClassCodeExpressionTransformer.java:142)
	at org.codehaus.groovy.ast.stmt.ExpressionStatement.visit(ExpressionStatement.java:40)
	at org.codehaus.groovy.ast.ClassCodeVisitorSupport.visitClassCodeContainer(ClassCodeVisitorSupport.java:110)
	at org.codehaus.groovy.ast.ClassCodeVisitorSupport.visitConstructorOrMethod(ClassCodeVisitorSupport.java:121)
	at org.codehaus.groovy.ast.ClassCodeExpressionTransformer.visitConstructorOrMethod(ClassCodeExpressionTransformer.java:53)
	at org.codehaus.groovy.control.StaticImportVisitor.visitConstructorOrMethod(StaticImportVisitor.java:89)
	at org.codehaus.groovy.ast.ClassCodeVisitorSupport.visitMethod(ClassCodeVisitorSupport.java:132)
	at org.codehaus.groovy.ast.ClassNode.visitContents(ClassNode.java:1103)
	at org.codehaus.groovy.ast.ClassCodeVisitorSupport.visitClass(ClassCodeVisitorSupport.java:54)
	at org.codehaus.groovy.control.StaticImportVisitor.visitClass(StaticImportVisitor.java:83)
	at org.codehaus.groovy.control.CompilationUnit$14.call(CompilationUnit.java:708)
	at org.codehaus.groovy.control.CompilationUnit.applyToPrimaryClassNodes(CompilationUnit.java:1084)
	at org.codehaus.groovy.control.CompilationUnit.doPhaseOperation(CompilationUnit.java:640)
	at org.codehaus.groovy.control.CompilationUnit.processPhaseOperations(CompilationUnit.java:618)
	at org.codehaus.groovy.control.CompilationUnit.compile(CompilationUnit.java:595)
	at groovy.lang.GroovyClassLoader.doParseClass(GroovyClassLoader.java:401)
	at groovy.lang.GroovyClassLoader.access$300(GroovyClassLoader.java:89)
	at groovy.lang.GroovyClassLoader$5.provide(GroovyClassLoader.java:341)
	at groovy.lang.GroovyClassLoader$5.provide(GroovyClassLoader.java:338)
	at org.codehaus.groovy.runtime.memoize.ConcurrentCommonCache.getAndPut(ConcurrentCommonCache.java:147)
	at groovy.lang.GroovyClassLoader.parseClass(GroovyClassLoader.java:336)
	at groovy.lang.GroovyShell.parseClass(GroovyShell.java:546)
	at groovy.lang.GroovyShell.parse(GroovyShell.java:558)
	at groovy.lang.GroovyShell.parse(GroovyShell.java:594)
	at groovy.lang.GroovyShell.parse(GroovyShell.java:585)
	at groovy.lang.GroovyShell$parse.call(Unknown Source)
	at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:47)
	at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:115)
	at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:127)
	at org.akhikhl.gretty.GafferConfiguratorEx.run(GafferConfiguratorEx.groovy:53)
	at org.akhikhl.gretty.GafferConfiguratorEx$run.call(Unknown Source)
	at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:47)
	at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:115)
	at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:135)
	at org.akhikhl.gretty.Runner.initLogback(Runner.groovy:83)
	at org.akhikhl.gretty.Runner$initLogback.callCurrent(Unknown Source)
	at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallCurrent(CallSiteArray.java:51)
	at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:156)
	at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:168)
	at org.akhikhl.gretty.Runner.run(Runner.groovy:127)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:78)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:567)
	at org.codehaus.groovy.runtime.callsite.PlainObjectMetaMethodSite.doInvoke(PlainObjectMetaMethodSite.java:43)
	at org.codehaus.groovy.runtime.callsite.PogoMetaMethodSite$PogoCachedMethodSiteNoUnwrapNoCoerce.invoke(PogoMetaMethodSite.java:190)
	at org.codehaus.groovy.runtime.callsite.PogoMetaMethodSite.call(PogoMetaMethodSite.java:70)
	at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:47)
	at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:115)
	at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:119)
	at org.akhikhl.gretty.Runner.main(Runner.groovy:54)

1 error

	at org.codehaus.groovy.control.ErrorCollector.failIfErrors(ErrorCollector.java:311)
	at org.codehaus.groovy.control.CompilationUnit.applyToPrimaryClassNodes(CompilationUnit.java:1102)
	at org.codehaus.groovy.control.CompilationUnit.doPhaseOperation(CompilationUnit.java:640)
	at org.codehaus.groovy.control.CompilationUnit.processPhaseOperations(CompilationUnit.java:618)
	at org.codehaus.groovy.control.CompilationUnit.compile(CompilationUnit.java:595)
	at groovy.lang.GroovyClassLoader.doParseClass(GroovyClassLoader.java:401)
	at groovy.lang.GroovyClassLoader.access$300(GroovyClassLoader.java:89)
	at groovy.lang.GroovyClassLoader$5.provide(GroovyClassLoader.java:341)
	at groovy.lang.GroovyClassLoader$5.provide(GroovyClassLoader.java:338)
	at org.codehaus.groovy.runtime.memoize.ConcurrentCommonCache.getAndPut(ConcurrentCommonCache.java:147)
	at groovy.lang.GroovyClassLoader.parseClass(GroovyClassLoader.java:336)
	at groovy.lang.GroovyShell.parseClass(GroovyShell.java:546)
	at groovy.lang.GroovyShell.parse(GroovyShell.java:558)
	at groovy.lang.GroovyShell.parse(GroovyShell.java:594)
	at groovy.lang.GroovyShell.parse(GroovyShell.java:585)
	at groovy.lang.GroovyShell$parse.call(Unknown Source)
	at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:47)
	at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:115)
	at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:127)
	at org.akhikhl.gretty.GafferConfiguratorEx.run(GafferConfiguratorEx.groovy:53)
	at org.akhikhl.gretty.GafferConfiguratorEx$run.call(Unknown Source)
	at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:47)
	at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:115)
	at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:135)
	at org.akhikhl.gretty.Runner.initLogback(Runner.groovy:83)
	at org.akhikhl.gretty.Runner$initLogback.callCurrent(Unknown Source)
	at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallCurrent(CallSiteArray.java:51)
	at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:156)
	at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:168)
	at org.akhikhl.gretty.Runner.run(Runner.groovy:127)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:78)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:567)
	at org.codehaus.groovy.runtime.callsite.PlainObjectMetaMethodSite.doInvoke(PlainObjectMetaMethodSite.java:43)
	at org.codehaus.groovy.runtime.callsite.PogoMetaMethodSite$PogoCachedMethodSiteNoUnwrapNoCoerce.invoke(PogoMetaMethodSite.java:190)
	at org.codehaus.groovy.runtime.callsite.PogoMetaMethodSite.call(PogoMetaMethodSite.java:70)
	at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:47)
	at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:115)
	at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:119)
	at org.akhikhl.gretty.Runner.main(Runner.groovy:54)
Exception in thread "Thread-181" org.gradle.process.internal.ExecException: Process 'command 'C:\d\jvm\jdk16-hotspot\bin\java.exe'' finished with non-zero exit value 1
	at org.gradle.process.internal.DefaultExecHandle$ExecResultImpl.assertNormalExitValue(DefaultExecHandle.java:414)
	at org.gradle.process.internal.DefaultJavaExecAction.execute(DefaultJavaExecAction.java:52)
	at org.gradle.process.internal.DefaultExecActionFactory.javaexec(DefaultExecActionFactory.java:198)
	at org.gradle.api.internal.project.DefaultProject.javaexec(DefaultProject.java:1146)
	at org.gradle.api.internal.project.DefaultProject.javaexec(DefaultProject.java:1141)
	at org.gradle.api.Project$javaexec$6.call(Unknown Source)
	at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:47)
	at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:125)
	at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:139)
	at org.akhikhl.gretty.DefaultLauncher.javaExec(DefaultLauncher.groovy:100)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:78)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:567)
	at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:107)
	at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:323)
	at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:351)
	at org.codehaus.groovy.runtime.callsite.PogoMetaClassSite.callCurrent(PogoMetaClassSite.java:61)
	at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallCurrent(CallSiteArray.java:51)
	at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:171)
	at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:185)
	at org.akhikhl.gretty.LauncherBase$_launchThread_closure3.doCall(LauncherBase.groovy:197)
	at org.akhikhl.gretty.LauncherBase$_launchThread_closure3.doCall(LauncherBase.groovy)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:78)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:567)
	at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:107)
	at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:323)
	at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:263)
	at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1035)
	at groovy.lang.Closure.call(Closure.java:412)
	at groovy.lang.Closure.call(Closure.java:406)
	at groovy.lang.Closure.run(Closure.java:493)
	at java.base/java.lang.Thread.run(Thread.java:831)
> Task :html:beforeRun

This isn't terrible for me because I had resolved this in a fork that I build on JitPack, but it is somewhat of a letdown. I was hoping to have an official release at some point that was support-comparable to the hacked-together code I wrote while literally suffering a fever; oh well, I'll keep waiting. If anyone else wants to use my fork to get Java 8-through-16 and Gradle 7 working with the 3.x branch, there's https://jitpack.io/#tommyettinger/gretty/3.0.4.5 . You may need to put JitPack first in the order of repositories checked for your buildscript.

@boris-petrov
Copy link
Member Author

@tommyettinger - we wanted to release 3.0.5 because there were other issues that were fixed. There will be an "official release" supporting JDK 16 - hopefully soon. All of us are doing this in our free time. Your fork doesn't work on Gradle 6 so that's why we haven't used that way of adding support for JDK 16 - the "real" fix is a bit more complicated. Sorry we've let you down. :)

@tommyettinger
Copy link

It certainly is complicated... If there's anything I can do to help speed up the process, let me know. It's so odd that Gradle 7 breaks Gretty (and the Android Gradle Plugin), but very little else I've used. The usage I have is a project generator that can enforce using Gradle 7, but until that works with Android I'm not even sure I should be using Gradle 7.

@boris-petrov
Copy link
Member Author

Thanks for offering help! As for Gretty - you're a bit mistaken. Gretty (3.0.5) works totally fine on Gradle 7 - that's how I use it in my project. It also works fine on Gradle 6. In order to support both, we build Gretty with Gradle 6. Unfortunately Gretty uses the Groovy version of the Gradle version it was built with (for now) - that's Groovy 2.5 from Gradle 6. Groovy 2.5 doesn't work on JDK 16. That's the reason JDK 16 is not supported. And that's the reason your fork works - because you build it with Gradle 7. But in that way you break Gradle 6 support.

@tommyettinger
Copy link

Wow... that's complicated. Is there some technique Gradle provides to deal with incompatibilities like this? Or is this something that needs to be handled by, say, adapting which Groovy version is used to match the current Gradle version's built-in Groovy?

@boris-petrov
Copy link
Member Author

That's mostly an issue with Gretty as it is written to somehow "bundle" Groovy instead of using the one from the user's runtime. We (or rather @f4lco as always 😄) will just fix that and hopefully the issue will be resolved.

@boris-petrov
Copy link
Member Author

This should have been fixed by #232. Will reopen if that's not the case. Thanks, @f4lco!

@lipnitsk
Copy link

@f4lco I'm seeing this on my system where Groovy version does not match the one bundled with gradle:

java.lang.ExceptionInInitializerError
        at org.codehaus.groovy.runtime.InvokerHelper.<clinit>(InvokerHelper.java:88)
        at org.codehaus.groovy.runtime.callsite.CallSiteArray.createCallStaticSite(CallSiteArray.java:71)
        at org.codehaus.groovy.runtime.callsite.CallSiteArray.createCallSite(CallSiteArray.java:156)
        at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:47)
        at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:125)
        at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:139)
        at my.awesome.filters.SessionListener.<clinit>(SessionListener.groovy)
        at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
        at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
        at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
        at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:490)
        at org.apache.catalina.core.DefaultInstanceManager.newInstance(DefaultInstanceManager.java:151)
        at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4640)
        at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5179)
        at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
        at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:726)
        at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:698)
        at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:747)
        at org.apache.catalina.Container$addChild$1.call(Unknown Source)
        at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:47)
        at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:125)
        at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:139)
        at org.akhikhl.gretty.TomcatServerManager.startServer(TomcatServerManager.groovy:63)
        at org.akhikhl.gretty.ServerManager$startServer$0.call(Unknown Source)
        at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:47)
        at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:125)
        at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:139)
        at org.akhikhl.gretty.Runner.run(Runner.groovy:141)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.base/java.lang.reflect.Method.invoke(Method.java:566)
        at org.codehaus.groovy.runtime.callsite.PlainObjectMetaMethodSite.doInvoke(PlainObjectMetaMethodSite.java:43)
        at org.codehaus.groovy.runtime.callsite.PogoMetaMethodSite$PogoCachedMethodSiteNoUnwrapNoCoerce.invoke(PogoMetaMethodSite.java:193)
        at org.codehaus.groovy.runtime.callsite.PogoMetaMethodSite.call(PogoMetaMethodSite.java:73)
        at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:47)
        at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:125)
        at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:130)
        at org.akhikhl.gretty.Runner.main(Runner.groovy:54)
Caused by: groovy.lang.GroovyRuntimeException: Conflicting module versions. Module [groovy-xml is loaded in version 3.0.8 and you are trying to load version 3.0.9
        at org.codehaus.groovy.runtime.metaclass.MetaClassRegistryImpl$DefaultModuleListener.onModule(MetaClassRegistryImpl.java:510)
        at org.codehaus.groovy.runtime.m12n.ExtensionModuleScanner.scanExtensionModuleFromProperties(ExtensionModuleScanner.java:87)
        at org.codehaus.groovy.runtime.m12n.ExtensionModuleScanner.scanExtensionModuleFromMetaInf(ExtensionModuleScanner.java:81)
        at org.codehaus.groovy.runtime.m12n.ExtensionModuleScanner.scanClasspathModulesFrom(ExtensionModuleScanner.java:63)
        at org.codehaus.groovy.runtime.m12n.ExtensionModuleScanner.scanClasspathModules(ExtensionModuleScanner.java:54)
        at org.codehaus.groovy.runtime.metaclass.MetaClassRegistryImpl.<init>(MetaClassRegistryImpl.java:125)
        at org.codehaus.groovy.runtime.metaclass.MetaClassRegistryImpl.<init>(MetaClassRegistryImpl.java:86)
        at groovy.lang.GroovySystem.<clinit>(GroovySystem.java:37)
        ... 39 more

Is there any way to force to use Gretty to use my version of Groovy instead of the one Gradle comes with?

@boris-petrov
Copy link
Member Author

boris-petrov commented Oct 15, 2021 via email

@lipnitsk
Copy link

lipnitsk commented Oct 15, 2021

@boris-petrov does not work with 4.0.0, but works with 4.0.0-SNAPSHOT, but I have to add this:

    grettyRunnerTomcat10 "org.codehaus.groovy:groovy:3.0.9"
    grettyRunnerTomcat10 "org.codehaus.groovy:groovy-cli-commons:3.0.9"
    grettyRunnerTomcat10 "org.codehaus.groovy:groovy-json:3.0.9"

This workaround doesn't work on 4.0.0, unfortunately.

@f4lco
Copy link
Collaborator

f4lco commented Oct 17, 2021

@lipnitsk can you check back #237? Maybe that gives you new clues, and we might need to re-open that ticket as needed.
So far I'm was not very aware of compatibility issues from Groovy. Gretty has been forcing specific Groovy versions on the system classpath for ages without reports of problems.
If you continue to encounter problems, please write a comment containing/summarizing:

  • the Java version used
  • Gretty version
  • Gradle version
  • Groovy version of your app
  • best case: a link to a reproducer project. We could use that to debug and convert that into a test case and prevent future regressions.

If you're feeling adventurous, I also pointed out where to find the toggles for the Groovy version inside Gretty in #237 (comment). PRs are always welcome 😄 Thanks @lipnitsk for the report and your time.

@lipnitsk
Copy link

lipnitsk commented Nov 4, 2021

@f4lco sorry, haven't had much time to investigate this further. Any chance your fix for #238 would fix my issue? Also, it seems that 4.0.0-SNAPSHOT is gone from the repository so now I'm stuck without a working gretty version :(

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

4 participants