0

将项目的 Groovy 版本2.5.133.0.9. 一切似乎都在工作,但 CodeNarc 插件在尝试编译包含 tag 的类时显示错误@Immutable。错误:

Compilation failed for [CustomCompilerPhaseSourceDecorator[SourceFile["ClassTaggedWithImmutable.groovy"]]]; org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed:
    General error during conversion: groovy.transform.AnnotationCollectorMode cannot be cast to groovy.transform.AnnotationCollectorMode
    
    java.lang.ClassCastException: groovy.transform.AnnotationCollectorMode cannot be cast to groovy.transform.AnnotationCollectorMode
        at org.codehaus.groovy.transform.ASTTransformationCollectorCodeVisitor.lambda$findCollectedAnnotations$1(ASTTransformationCollectorCodeVisitor.java:187)
        at java.util.Optional.map(Optional.java:215)
        at org.codehaus.groovy.transform.ASTTransformationCollectorCodeVisitor.findCollectedAnnotations(ASTTransformationCollectorCodeVisitor.java:187)
        at org.codehaus.groovy.transform.ASTTransformationCollectorCodeVisitor.visitAnnotations(ASTTransformationCollectorCodeVisitor.java:93)
        at org.codehaus.groovy.ast.ClassCodeVisitorSupport.visitClass(ClassCodeVisitorSupport.java:49)
        at org.codehaus.groovy.transform.ASTTransformationCollectorCodeVisitor.visitClass(ASTTransformationCollectorCodeVisitor.java:77)
        at org.codehaus.groovy.transform.ASTTransformationVisitor.lambda$addPhaseOperations$1(ASTTransformationVisitor.java:206)
        at org.codehaus.groovy.control.CompilationUnit$IPrimaryClassNodeOperation.doPhaseOperation(CompilationUnit.java:942)
        at org.codehaus.groovy.control.CompilationUnit.processPhaseOperations(CompilationUnit.java:671)
        at org.codehaus.groovy.control.CompilationUnit.compile(CompilationUnit.java:635)
        at org.codehaus.groovy.control.CompilationUnit$compile$11.call(Unknown Source)
        at org.codenarc.source.AbstractSourceCode.init(AbstractSourceCode.groovy:98)
        at org.codenarc.source.AbstractSourceCode.getAst(AbstractSourceCode.groovy:85)
        at org.codenarc.rule.AbstractAstVisitorRule.applyTo(AbstractAstVisitorRule.java:90)
        at org.codenarc.rule.AbstractRule.applyTo(AbstractRule.java:143)
        at org.codenarc.rule.Rule$applyTo.call(Unknown Source)
        at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:47)
        at org.codenarc.rule.Rule$applyTo.call(Unknown Source)
        at org.codenarc.analyzer.AbstractSourceAnalyzer$_collectViolations_closure3.doCall(AbstractSourceAnalyzer.groovy:46)
        at sun.reflect.GeneratedMethodAccessor2361.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        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:274)
        at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1035)
        at org.codehaus.groovy.runtime.callsite.PogoMetaClassSite.call(PogoMetaClassSite.java:38)
        at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:139)
        at org.codenarc.analyzer.AbstractSourceAnalyzer.measureRuleProcessingTime(AbstractSourceAnalyzer.groovy:58)
        at sun.reflect.GeneratedMethodAccessor2359.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        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.callCurrent(PogoMetaMethodSite.java:61)
        at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallCurrent(CallSiteArray.java:51)
        at org.codehaus.groovy.runtime.callsite.PogoMetaMethodSite.callCurrent(PogoMetaMethodSite.java:66)
        at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:194)
        at org.codenarc.analyzer.AbstractSourceAnalyzer.collectViolations(AbstractSourceAnalyzer.groovy:44)
        at org.codenarc.ant.AntFileSetSourceAnalyzer.processFile(AntFileSetSourceAnalyzer.java:188)
        at org.codenarc.ant.AntFileSetSourceAnalyzer.access$000(AntFileSetSourceAnalyzer.java:44)
        at org.codenarc.ant.AntFileSetSourceAnalyzer$1.run(AntFileSetSourceAnalyzer.java:176)
        at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
        at java.util.concurrent.FutureTask.run(FutureTask.java:266)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
        at java.lang.Thread.run(Thread.java:748) 

标记为的每个类都会引发此错误,@Immutable但这不会中断 codenarc任务,它实际上执行代码检查,最后构建成功。这种情况只有在 Groovy 版本大于等于 3.0.0 时才会发生。低于(2.xx)编译正常。

关于项目的一些信息:Gradle 6.9.1;Spring Boot 2.6.1;CodeNarc 工具版本 2.2.0(通过 CodeNarc Gradle 插件使用)

我尝试过的一些操作

  • 使用不同版本的 Groovy 3
  • 升级 Gradle 版本
  • 手动设置 CodeNarc 插件使用的 Groovy 版本
  • 使用不同版本的codenarc
  • 手动定义ASTTransformation阶段通过@GroovyASTTransformation
  • 使用 XML CodeNarc 配置文件禁用插件并再次启用它
  • 修改 codenarcMain 的编译类路径
  • 使用 codenarc 规则来避免无状态类检查(此规则跳过@Immutable类)这实际上跳过了不可变类,但在修订方面,但编译错误仍然显示错误。
  • 使用 codenarc Exclusion 配置参数手动强制它跳过类。发生与上一项相同的情况。
  • 修改和使用不同版本的org.codehaus.groovy:groovy-all(目前它使用相同的 Groovy 版本)。

CodeNarc 插件配置里面build.gradle

    codenarc {
        toolVersion '2.2.0'
        codenarcMain {
            maxPriority1Violations = 0
            maxPriority2Violations = 3
            maxPriority3Violations = 10
        }
        codenarcIntegrationTest {
            maxPriority1Violations = 0
            maxPriority2Violations = 0
            maxPriority3Violations = 0
        }
        sourceSets = [
            sourceSets.main,
            sourceSets.test,
            sourceSets.integrationTest
        ]
    }
    
    codenarcMain {
        compilationClasspath = sourceSets.main.compileClasspath + sourceSets.main.output
    }
    codenarcTest {
        compilationClasspath = sourceSets.test.compileClasspath + sourceSets.test.output
    }
    codenarcIntegrationTest {
        compilationClasspath = sourceSets.integrationTest.compileClasspath + sourceSets.integrationTest.output
    }
4

0 回答 0