[
https://issues.apache.org/jira/browse/GROOVY-9352?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17001768#comment-17001768
]
Daniel Sun commented on GROOVY-9352:
------------------------------------
As a side note, here is the stack trace I got when tried to reproduce the issue:
{code:java}
D:\_TEMP\groovy-compiler-bug-master>gradle build -PgroovyVersion=3.0.0-rc-2
Starting a Gradle Daemon (subsequent builds will be faster)
> Task :consumer:compileGroovy
startup failed:
General error during instruction selection: java.lang.NoClassDefFoundError:
com.google.gson.Gson
java.lang.RuntimeException: java.lang.NoClassDefFoundError: com.google.gson.Gson
at
org.codehaus.groovy.control.CompilationUnit.convertUncaughtExceptionToCompilationError(CompilationUnit.java:1107)
at
org.codehaus.groovy.control.CompilationUnit.applyToPrimaryClassNodes(CompilationUnit.java:1087)
at
org.codehaus.groovy.control.CompilationUnit.doPhaseOperation(CompilationUnit.java:633)
at
org.codehaus.groovy.control.CompilationUnit.processPhaseOperations(CompilationUnit.java:612)
at
org.codehaus.groovy.control.CompilationUnit.compile(CompilationUnit.java:589)
at
org.codehaus.groovy.control.CompilationUnit.compile(CompilationUnit.java:568)
at
org.gradle.api.internal.tasks.compile.ApiGroovyCompiler.execute(ApiGroovyCompiler.java:268)
at
org.gradle.api.internal.tasks.compile.ApiGroovyCompiler.execute(ApiGroovyCompiler.java:68)
at
org.gradle.api.internal.tasks.compile.GroovyCompilerFactory$DaemonSideCompiler.execute(GroovyCompilerFactory.java:87)
at
org.gradle.api.internal.tasks.compile.GroovyCompilerFactory$DaemonSideCompiler.execute(GroovyCompilerFactory.java:75)
at
org.gradle.api.internal.tasks.compile.daemon.AbstractDaemonCompiler$CompilerWorkAction.execute(AbstractDaemonCompiler.java:113)
at
org.gradle.workers.internal.DefaultWorkerServer.execute(DefaultWorkerServer.java:50)
at
org.gradle.workers.internal.AbstractClassLoaderWorker$1.create(AbstractClassLoaderWorker.java:47)
at
org.gradle.workers.internal.AbstractClassLoaderWorker$1.create(AbstractClassLoaderWorker.java:37)
at
org.gradle.internal.classloader.ClassLoaderUtils.executeInClassloader(ClassLoaderUtils.java:98)
at
org.gradle.workers.internal.AbstractClassLoaderWorker.executeInClassLoader(AbstractClassLoaderWorker.java:37)
at
org.gradle.workers.internal.IsolatedClassloaderWorker.execute(IsolatedClassloaderWorker.java:49)
at
org.gradle.workers.internal.WorkerDaemonServer.execute(WorkerDaemonServer.java:84)
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.gradle.process.internal.worker.request.WorkerAction$1.call(WorkerAction.java:129)
at
org.gradle.process.internal.worker.child.WorkerLogEventListener.withWorkerLoggingProtocol(WorkerLogEventListener.java:41)
at
org.gradle.process.internal.worker.request.WorkerAction.run(WorkerAction.java:126)
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.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:412)
at
org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64)
at
org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:48)
at
java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
at
java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
at
org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:56)
at java.base/java.lang.Thread.run(Thread.java:834)
Caused by: java.lang.NoClassDefFoundError: com.google.gson.Gson
at
org.codehaus.groovy.ast.decompiled.AsmReferenceResolver.resolveClass(AsmReferenceResolver.java:46)
at
org.codehaus.groovy.ast.decompiled.AsmReferenceResolver.resolveNonArrayType(AsmReferenceResolver.java:79)
at
org.codehaus.groovy.ast.decompiled.AsmReferenceResolver.resolveType(AsmReferenceResolver.java:70)
at
org.codehaus.groovy.ast.decompiled.MemberSignatureParser.createFieldNode(MemberSignatureParser.java:160)
at
org.codehaus.groovy.ast.decompiled.DecompiledClassNode.lazyInitMembers(DecompiledClassNode.java:205)
at
org.codehaus.groovy.ast.decompiled.DecompiledClassNode.getDeclaredMethods(DecompiledClassNode.java:120)
at
org.codehaus.groovy.ast.ClassNode.getDeclaredMethods(ClassNode.java:859)
at org.codehaus.groovy.ast.ClassNode.getMethods(ClassNode.java:874)
at
org.codehaus.groovy.transform.stc.StaticTypeCheckingVisitor.findMethodsWithGenerated(StaticTypeCheckingVisitor.java:4526)
at
org.codehaus.groovy.transform.stc.StaticTypeCheckingVisitor.findMethod(StaticTypeCheckingVisitor.java:4604)
at
org.codehaus.groovy.transform.stc.StaticTypeCheckingVisitor.visitMethodCallExpression(StaticTypeCheckingVisitor.java:3379)
at
org.codehaus.groovy.transform.sc.StaticCompilationVisitor.visitMethodCallExpression(StaticCompilationVisitor.java:397)
at
org.codehaus.groovy.ast.expr.MethodCallExpression.visit(MethodCallExpression.java:76)
at
org.codehaus.groovy.ast.CodeVisitorSupport.visitExpressionStatement(CodeVisitorSupport.java:117)
at
org.codehaus.groovy.ast.ClassCodeVisitorSupport.visitExpressionStatement(ClassCodeVisitorSupport.java:200)
at
org.codehaus.groovy.transform.stc.StaticTypeCheckingVisitor.visitExpressionStatement(StaticTypeCheckingVisitor.java:2157)
at
org.codehaus.groovy.ast.stmt.ExpressionStatement.visit(ExpressionStatement.java:40)
at
org.codehaus.groovy.ast.CodeVisitorSupport.visitBlockStatement(CodeVisitorSupport.java:86)
at
org.codehaus.groovy.ast.ClassCodeVisitorSupport.visitBlockStatement(ClassCodeVisitorSupport.java:164)
at
org.codehaus.groovy.transform.stc.StaticTypeCheckingVisitor.visitBlockStatement(StaticTypeCheckingVisitor.java:3834)
at
org.codehaus.groovy.ast.stmt.BlockStatement.visit(BlockStatement.java:69)
at
org.codehaus.groovy.ast.ClassCodeVisitorSupport.visitClassCodeContainer(ClassCodeVisitorSupport.java:138)
at
org.codehaus.groovy.ast.ClassCodeVisitorSupport.visitConstructorOrMethod(ClassCodeVisitorSupport.java:111)
at
org.codehaus.groovy.transform.stc.StaticTypeCheckingVisitor.visitConstructorOrMethod(StaticTypeCheckingVisitor.java:2146)
at
org.codehaus.groovy.ast.ClassCodeVisitorSupport.visitMethod(ClassCodeVisitorSupport.java:106)
at
org.codehaus.groovy.transform.stc.StaticTypeCheckingVisitor.startMethodInference(StaticTypeCheckingVisitor.java:2502)
at
org.codehaus.groovy.transform.stc.StaticTypeCheckingVisitor.visitMethod(StaticTypeCheckingVisitor.java:2460)
at
org.codehaus.groovy.transform.sc.StaticCompilationVisitor.visitMethod(StaticCompilationVisitor.java:224)
at org.codehaus.groovy.ast.ClassNode.visitMethods(ClassNode.java:1108)
at org.codehaus.groovy.ast.ClassNode.visitContents(ClassNode.java:1101)
at
org.codehaus.groovy.ast.ClassCodeVisitorSupport.visitClass(ClassCodeVisitorSupport.java:52)
at
org.codehaus.groovy.transform.stc.StaticTypeCheckingVisitor.visitClass(StaticTypeCheckingVisitor.java:409)
at
org.codehaus.groovy.transform.sc.StaticCompilationVisitor.visitClass(StaticCompilationVisitor.java:182)
at
org.codehaus.groovy.transform.sc.StaticCompileTransformation.visit(StaticCompileTransformation.java:65)
at
org.codehaus.groovy.transform.ASTTransformationVisitor.visitClass(ASTTransformationVisitor.java:144)
at
org.codehaus.groovy.transform.ASTTransformationVisitor$2.call(ASTTransformationVisitor.java:225)
at
org.codehaus.groovy.control.CompilationUnit.applyToPrimaryClassNodes(CompilationUnit.java:1073)
... 38 more
1 error
> Task :consumer:compileGroovy FAILED
FAILURE: Build failed with an exception.
* What went wrong:
Execution failed for task ':consumer:compileGroovy'.
> Compilation failed; see the compiler error output for details.
* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug
option to get more log output. Run with --scan to get full insights.
* Get more help at https://help.gradle.org
BUILD FAILED in 45s
3 actionable tasks: 3 executed
D:\_TEMP\groovy-compiler-bug-master>
{code}
> Static compilation fails with NoClassDefFoundError
> --------------------------------------------------
>
> Key: GROOVY-9352
> URL: https://issues.apache.org/jira/browse/GROOVY-9352
> Project: Groovy
> Issue Type: Bug
> Components: Static compilation
> Affects Versions: 2.5.8, 3.0.0-rc-2
> Reporter: Cédric Champeau
> Priority: Major
> Time Spent: 10m
> Remaining Estimate: 0h
>
> The static compiler is trying to resolve classes which it shouldn't. Imagine
> the following scenario:
>
> * a project written in Java exposes class `A` which has a private method
> using `D` as a parameter
> * `D` is an _implementation_ dependency of `A`, meaning it's not exposed in
> its public API, so consumers of `A` should never require `D` to build against
> `A`
> * a project `B` written in Groovy consumes `A` and tries to call a _public_
> method of `A`
> ** if the class is using `@CompileStatic`, compilation FAILS with a
> NoClassDefFoundError
> ** if the class doesn't use `@CompileStatic`, compilation passes as expected
> The reason is that when we compile `B`, we only put on the compile classpath
> the _API_ dependencies of `A`. But Groovy breaks because when it inspects
> class `A`, it tries to load internal implementation details (private fields,
> methods) and as such fails.
> This is a big problem because it effectively breaks the contract of
> API/implementation separation, and forces either the producer to declare `D`
> as an _implementation_ dependency, which it's not, or redeclare `D` as an
> implementation dependency of `B`, which it isn't either, just to make the
> compiler happy!
>
> The Gradle build itself is suffering from this. This is not nice because it
> forces compilation of things we don't need, and forces us to redeclare
> dependencies that we shouldn't.
>
> To reproduce, checkout this project:
> [https://github.com/melix/groovy-compiler-bug]
>
> and run `./gradlew build`
>
--
This message was sent by Atlassian Jira
(v8.3.4#803005)