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

Reply via email to