@Slf4j or @Log annotation doesn't seem to work in groovy++

130 views
Skip to first unread message

Jim Morris

unread,
May 18, 2011, 10:17:37 PM5/18/11
to groovyp...@googlegroups.com
I am using the @Slf4j Annotation in a groovy 1.8 script which works fine, however if I rename to .gpp (or annotate appropriately) to use Groovy++ it fails with the following error...

> groovy -cp logback-classic-0.9.28.jar:logback-core-0.9.28.jar:slf4j-api-1.6.1.jar test_log.gpp
BUG! ClassNode#getTypeClass for org.slf4j.Logger is called before the type class is set
        at org.codehaus.groovy.ast.ClassNode.getTypeClass(ClassNode.java:1311)
        at org.mbte.groovypp.compiler.ClassNodeCache.getClassNodeInfo(ClassNodeCache.java:181)
        at org.mbte.groovypp.compiler.ClassNodeCache.getMethods(ClassNodeCache.java:238)
        at org.mbte.groovypp.compiler.CompilerTransformer.findMethod(CompilerTransformer.java:256)
        at org.mbte.groovypp.compiler.transformers.MethodCallExpressionTransformer.findMethodVariatingArgs(MethodCallExpressionTransformer.java:610)
        at org.mbte.groovypp.compiler.transformers.MethodCallExpressionTransformer.findMethodWithClosureCoercion(MethodCallExpressionTransformer.java:832)
        at org.mbte.groovypp.compiler.transformers.MethodCallExpressionTransformer.createNormalMethodCall(MethodCallExpressionTransformer.java:113)
        at org.mbte.groovypp.compiler.transformers.MethodCallExpressionTransformer.transform(MethodCallExpressionTransformer.java:92)
        at org.mbte.groovypp.compiler.transformers.MethodCallExpressionTransformer.transform(MethodCallExpressionTransformer.java:36)
        at org.mbte.groovypp.compiler.transformers.ExprTransformer.transformExpression(ExprTransformer.groovy:103)
        at org.mbte.groovypp.compiler.CompilerTransformer.transform(CompilerTransformer.java:114)
        at org.mbte.groovypp.compiler.CompilerTransformer.transformToGround(CompilerTransformer.java:132)
        at org.mbte.groovypp.compiler.StaticCompiler.visitReturnStatement(StaticCompiler.java:732)
        at org.codehaus.groovy.ast.stmt.ReturnStatement.visit(ReturnStatement.java:47)
        at org.mbte.groovypp.compiler.StaticCompiler.visitBlockStatement(StaticCompiler.java:378)
        at org.codehaus.groovy.ast.stmt.BlockStatement.visit(BlockStatement.java:69)
        at org.mbte.groovypp.compiler.StaticCompiler.execute(StaticCompiler.java:1232)
        at org.mbte.groovypp.compiler.StaticMethodBytecode.<init>(StaticMethodBytecode.java:71)
        at org.mbte.groovypp.compiler.StaticMethodBytecode.replaceMethodCode(StaticMethodBytecode.java:95)
        at org.mbte.groovypp.compiler.CompileASTTransform.visit(CompileASTTransform.java:121)
        at org.codehaus.groovy.transform.ASTTransformationVisitor.visitClass(ASTTransformationVisitor.java:129)
        at org.codehaus.groovy.transform.ASTTransformationVisitor$2.call(ASTTransformationVisitor.java:172)
        at org.codehaus.groovy.control.CompilationUnit.applyToPrimaryClassNodes(CompilationUnit.java:957)
        at org.codehaus.groovy.control.CompilationUnit.doPhaseOperation(CompilationUnit.java:542)
        at org.codehaus.groovy.control.CompilationUnit.processPhaseOperations(CompilationUnit.java:520)
        at org.codehaus.groovy.control.CompilationUnit.compile(CompilationUnit.java:497)
        at groovy.lang.GroovyClassLoader.doParseClass(GroovyClassLoader.java:306)
        at groovy.lang.GroovyClassLoader.parseClass(GroovyClassLoader.java:283)
        at groovy.lang.GroovyClassLoader.parseClass(GroovyClassLoader.java:267)
        at groovy.lang.GroovyClassLoader.parseClass(GroovyClassLoader.java:197)
        at groovy.lang.GroovyShell$2.run(GroovyShell.java:215)
        at groovy.lang.GroovyShell$2.run(GroovyShell.java:213)
        at java.security.AccessController.doPrivileged(Native Method)
        at groovy.lang.GroovyShell.run(GroovyShell.java:213)
        at groovy.lang.GroovyShell.run(GroovyShell.java:159)
        at groovy.ui.GroovyMain.processOnce(GroovyMain.java:514)
        at groovy.ui.GroovyMain.run(GroovyMain.java:329)
        at groovy.ui.GroovyMain.process(GroovyMain.java:315)
        at groovy.ui.GroovyMain.processArgs(GroovyMain.java:112)
        at groovy.ui.GroovyMain.main(GroovyMain.java:93)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:597)
        at org.codehaus.groovy.tools.GroovyStarter.rootLoader(GroovyStarter.java:108)
        at org.codehaus.groovy.tools.GroovyStarter.main(GroovyStarter.java:130)
org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed:
/home/morris/work/groovy/test_log.gpp: 7: BUG! ClassNode#getTypeClass for org.slf4j.Logger is called before the type class is set
 @ line 7, column 3.
                log.info("I'm in the logger")
     ^

1 error

The script is the bare minimum to demonstrate this bug... test.gpp

import groovy.util.logging.Slf4j

@Slf4j
public class TestLog {

    public void doLog() {
        log.info("I'm in the logger")
    }

}


def t= new TestLog()
t.doLog()

 I am using Groovy Version: 1.8.0 JVM: 1.6.0_20 and groovypp-0.4.232_1.8.0.jar

I get a similar error using the @Log annotation...

/home/morris/work/groovy/test_log.gpp: 7: BUG! ClassNode#getTypeClass for java.util.logging.Logger is called before the type class is
Any ideas?

Alex Tkachman

unread,
May 19, 2011, 2:44:25 AM5/19/11
to groovyp...@googlegroups.com
It seems to be a bug. Please file an issue. I will have a look asap.

Richard Vowles

unread,
May 19, 2011, 3:03:18 AM5/19/11
to groovyp...@googlegroups.com
That is such a weird annotation. (@slf4j and the other logging ones)


On Thu, May 19, 2011 at 2:17 PM, Jim Morris <wolf...@gmail.com> wrote:
I am using the @Slf4j Annotation in a groovy 1.8 script which works fine, however if I rename to .gpp (or annotate appropriately) to use Groovy++ it fails with the following error...

--
---
Richard Vowles,
Grails, Groovy, Java
Consistency is the last refuge of the unimaginative - Oscar Wilde
ph: +64275467747, linkedin, skype:rvowles
get 2Gb shared disk space in the cloud - Dropbox, its incredibly useful! - http://tinyurl.com/cmcceh
podcast: http://www.illegalargument.com

Jim Morris

unread,
May 19, 2011, 3:34:28 AM5/19/11
to groovyp...@googlegroups.com
Done

Issue 379

Thanks

Alex Tkachman

unread,
May 19, 2011, 3:51:30 AM5/19/11
to groovyp...@googlegroups.com
Thanks a lot. I

On Thu, May 19, 2011 at 10:34 AM, Jim Morris <wolf...@gmail.com> wrote:
> Done
>
> Issue 379
>
> Thanks
>

Alex Tkachman

unread,
May 19, 2011, 7:05:45 AM5/19/11
to groovyp...@googlegroups.com
Fixed in the trunk. In fact it was bug in ast transform in groovy
core, which I had to work around.

Paul King

unread,
May 19, 2011, 7:16:54 AM5/19/11
to groovyp...@googlegroups.com
So what's the bug in groovy-core? We should fix that too?

Paul.

Alex Tkachman

unread,
May 19, 2011, 7:42:44 AM5/19/11
to groovyp...@googlegroups.com
in Slf4j.java

public FieldNode addLoggerFieldToClass(ClassNode classNode,
String logFieldName) {
return classNode.addField(logFieldName,
Opcodes.ACC_FINAL | Opcodes.ACC_TRANSIENT |
Opcodes.ACC_STATIC | Opcodes.ACC_PRIVATE,
new ClassNode("org.slf4j.Logger",
Opcodes.ACC_PUBLIC, ClassHelper.OBJECT_TYPE),
new MethodCallExpression(
new ClassExpression(new
ClassNode("org.slf4j.LoggerFactory", Opcodes.ACC_PUBLIC,
ClassHelper.OBJECT_TYPE)),
"getLogger",
new ClassExpression(classNode)));

}

It's a bug only if we want to be g++ friendly

The ClassNode constructor used above should never be used by AST
transform because such class nodes are so called primiry class nodes,
which correspond to some class definition in compiling module and do
not resolved by ResolveVisitor. What is especially bad is the fact
that you can not setRedirect for such class node (I had to work around
with reflection)

Richard Vowles

unread,
Jul 14, 2011, 2:56:00 AM7/14/11
to groovyp...@googlegroups.com
I'm still having this problem with the latest release (0.4.279_1.7.10) 

package blah;

import org.slf4j.Logger
import org.slf4j.LoggerFactory

@Typed
public class Test {
  private static Logger log = LoggerFactory.getLogger(Test.class);
}

causes it to blow up. 

Releasing the two different artifacts under separate trees would be very helpful as well - I can no-longer use a version range as I get the 1.8 in my dependencies :-( I use [0.4,1) - which means I get the latest releases as they happen, unfortunately i now need to do a [0.4.279_1.7.10]
--
---
Richard Vowles,
Grails, Groovy, Java
Consistency is the last refuge of the unimaginative - Oscar Wilde
ph: +64275467747, linkedin, twitter:richardvowles

Alex Tkachman

unread,
Jul 14, 2011, 3:16:59 AM7/14/11
to Groovy++
What exactly and how blows up?

On Jul 14, 9:56 am, Richard Vowles <rich...@bluetrainsoftware.com>
wrote:
> I'm still having this problem with the latest release (0.4.279_1.7.10)
>
> package blah;
>
> import org.slf4j.Logger
> import org.slf4j.LoggerFactory
>
> @Typed
> public class Test {
>   private static Logger log = LoggerFactory.getLogger(Test.class);
>
> }
>
> causes it to blow up.
>
> Releasing the two different artifacts under separate trees would be very
> helpful as well - I can no-longer use a version range as I get the 1.8 in my
> dependencies :-( I use [0.4,1) - which means I get the latest releases as
> they happen, unfortunately i now need to do a [0.4.279_1.7.10]
>
> > > On Thu, May 19, 2011 at 9:05 PM, Alex Tkachman <alex.tkach...@gmail.com>
> > wrote:
> > >> Fixed in the trunk. In fact it was bug in ast transform in groovy
> > >> core, which I had to work around.
>
> > >> On Thu, May 19, 2011 at 5:17 AM, Jim Morris <wolfma...@gmail.com>
> > org.mbte.groovypp.compiler.StaticCompiler.visitReturnStatement(StaticCompil er.java:732)
> > >>>         at
>
> > org.codehaus.groovy.ast.stmt.ReturnStatement.visit(ReturnStatement.java:47)
> > >>>         at
>
> > org.mbte.groovypp.compiler.StaticCompiler.visitBlockStatement(StaticCompile r.java:378)
> > sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImp l.java:25)

Richard Vowles

unread,
Jul 14, 2011, 4:16:03 AM7/14/11
to groovyp...@googlegroups.com

Same error

Richard Vowles

unread,
Jul 14, 2011, 4:44:17 AM7/14/11
to groovyp...@googlegroups.com
Sorry, I was on my phone. When compiling, I get this error, which seems the same as the one above?

java.lang.NoClassDefFoundError: org/slf4j/impl/StaticLoggerBinder
at java.lang.Class.getDeclaredMethods0(Native Method)
at java.lang.Class.privateGetDeclaredMethods(Class.java:2427)
at java.lang.Class.getDeclaredMethods(Class.java:1791)
at org.codehaus.groovy.vmplugin.v5.Java5.configureClassNode(Java5.java:318)
at org.codehaus.groovy.ast.ClassNode.lazyClassInit(ClassNode.java:263)
at org.codehaus.groovy.ast.ClassNode.getInterfaces(ClassNode.java:341)
at org.mbte.groovypp.compiler.ClassNodeCache.getAllInterfaces(ClassNodeCache.java:447)
at org.mbte.groovypp.compiler.ClassNodeCache.getAllInterfaces(ClassNodeCache.java:461)
at org.mbte.groovypp.compiler.ClassNodeCache.fillMethodsMaps(ClassNodeCache.java:271)
at org.mbte.groovypp.compiler.ClassNodeCache.getStaticMethods(ClassNodeCache.java:261)
at org.mbte.groovypp.compiler.CompilerTransformer.findMethod(CompilerTransformer.java:259)
at org.mbte.groovypp.compiler.transformers.MethodCallExpressionTransformer.findMethodVariatingArgs(MethodCallExpressionTransformer.java:610)
at org.mbte.groovypp.compiler.transformers.MethodCallExpressionTransformer.findMethodWithClosureCoercion(MethodCallExpressionTransformer.java:832)
at org.mbte.groovypp.compiler.transformers.MethodCallExpressionTransformer.createClassMethodCall(MethodCallExpressionTransformer.java:395)
at org.mbte.groovypp.compiler.transformers.MethodCallExpressionTransformer.transform(MethodCallExpressionTransformer.java:85)
at org.mbte.groovypp.compiler.transformers.MethodCallExpressionTransformer.transform(MethodCallExpressionTransformer.java:36)
at org.mbte.groovypp.compiler.transformers.ExprTransformer.transformExpression(ExprTransformer.groovy:103)
at org.mbte.groovypp.compiler.CompilerTransformer.transform(CompilerTransformer.java:114)
at org.mbte.groovypp.compiler.transformers.BinaryExpressionTransformer.evaluateAssign(BinaryExpressionTransformer.java:373)
at org.mbte.groovypp.compiler.transformers.BinaryExpressionTransformer.transform(BinaryExpressionTransformer.java:70)
at org.mbte.groovypp.compiler.transformers.BinaryExpressionTransformer.transform(BinaryExpressionTransformer.java:39)
at org.mbte.groovypp.compiler.transformers.ExprTransformer.transformExpression(ExprTransformer.groovy:103)
at org.mbte.groovypp.compiler.CompilerTransformer.transform(CompilerTransformer.java:114)
at org.codehaus.groovy.ast.ClassCodeExpressionTransformer.visitExpressionStatement(ClassCodeExpressionTransformer.java:139)
at org.mbte.groovypp.compiler.StaticCompiler.visitExpressionStatement(StaticCompiler.java:387)
at org.codehaus.groovy.ast.stmt.ExpressionStatement.visit(ExpressionStatement.java:40)
at org.mbte.groovypp.compiler.StaticCompiler.visitBlockStatement(StaticCompiler.java:357)
at org.codehaus.groovy.ast.stmt.BlockStatement.visit(BlockStatement.java:51)
at org.mbte.groovypp.compiler.StaticCompiler.execute(StaticCompiler.java:1212)
at org.mbte.groovypp.compiler.StaticMethodBytecode.<init>(StaticMethodBytecode.java:73)
at org.mbte.groovypp.compiler.StaticMethodBytecode.replaceMethodCode(StaticMethodBytecode.java:106)
at org.mbte.groovypp.compiler.CompileASTTransform.visit(CompileASTTransform.java:125)
at org.codehaus.groovy.transform.ASTTransformationVisitor.visitClass(ASTTransformationVisitor.java:129)
at org.codehaus.groovy.transform.ASTTransformationVisitor$2.call(ASTTransformationVisitor.java:172)
at org.codehaus.groovy.control.CompilationUnit.applyToPrimaryClassNodes(CompilationUnit.java:932)
at org.codehaus.groovy.control.CompilationUnit.doPhaseOperation(CompilationUnit.java:509)
at org.codehaus.groovy.control.CompilationUnit.processPhaseOperations(CompilationUnit.java:487)
at org.codehaus.groovy.control.CompilationUnit.compile(CompilationUnit.java:464)
at org.codehaus.groovy.control.CompilationUnit.compile(CompilationUnit.java:448)
at org.codehaus.gmaven.runtime.v1_7.ClassCompilerFeature$ClassCompilerImpl.compile(ClassCompilerFeature.java:148)
at org.codehaus.gmaven.plugin.compile.AbstractCompileMojo.compile(AbstractCompileMojo.java:200)
at org.codehaus.gmaven.plugin.compile.AbstractCompileMojo.process(AbstractCompileMojo.java:164)
at org.codehaus.gmaven.plugin.ComponentMojoSupport.doExecute(ComponentMojoSupport.java:60)
at org.codehaus.gmaven.plugin.MojoSupport.execute(MojoSupport.java:69)
at org.apache.maven.plugin.DefaultPluginManager.executeMojo(DefaultPluginManager.java:483)
at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoals(DefaultLifecycleExecutor.java:678)
at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoalWithLifecycle(DefaultLifecycleExecutor.java:540)
at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoal(DefaultLifecycleExecutor.java:519)
at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoalAndHandleFailures(DefaultLifecycleExecutor.java:371)
at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeTaskSegments(DefaultLifecycleExecutor.java:332)
at org.apache.maven.lifecycle.DefaultLifecycleExecutor.execute(DefaultLifecycleExecutor.java:181)
at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:356)
at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:137)
at org.apache.maven.cli.MavenCli.main(MavenCli.java:356)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.codehaus.classworlds.Launcher.launchEnhanced(Launcher.java:315)
at org.codehaus.classworlds.Launcher.launch(Launcher.java:255)
at org.codehaus.classworlds.Launcher.mainWithExitCode(Launcher.java:430)
at org.codehaus.classworlds.Launcher.main(Launcher.java:375)
Caused by: java.lang.ClassNotFoundException: org.slf4j.impl.StaticLoggerBinder
at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
at groovy.lang.GroovyClassLoader.loadClass(GroovyClassLoader.java:688)
at groovy.lang.GroovyClassLoader.loadClass(GroovyClassLoader.java:785)
at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
... 62 more


On Thu, Jul 14, 2011 at 7:16 PM, Alex Tkachman <alex.t...@gmail.com> wrote:
What exactly and how blows up?

--
---
Richard Vowles,
Grails, Groovy, Java
Consistency is the last refuge of the unimaginative - Oscar Wilde
ph: +64275467747, linkedin, twitter:richardvowles

Richard Vowles

unread,
Jul 14, 2011, 4:46:35 AM7/14/11
to groovyp...@googlegroups.com
And of course I didn't finish that. With @Typed it does this (won't compile), without @Typed it compiles and runs fine.

I was just wondering whether you had released it?


On Thu, Jul 14, 2011 at 8:44 PM, Richard Vowles <ric...@bluetrainsoftware.com> wrote:
Sorry, I was on my phone. When compiling, I get this error, which seems the same as the one above?


Reply all
Reply to author
Forward
0 new messages