简体   繁体   English

Groovy版本升级后CodeNarc任务中AnnotationCollectorMode无法转换为AnnotationCollectorMode

[英]AnnotationCollectorMode cannot be cast to AnnotationCollectorMode in CodeNarc task after Groovy version upgrade

Upgrade Groovy version of a project from 2.5.13 to 3.0.9 .将项目的 Groovy 版本从2.5.13升级到3.0.9 Everything seems to be working but the CodeNarc plugin shows an error when trying to compile classes that includes tag @Immutable .一切似乎都在工作,但 CodeNarc 插件在尝试编译包含标记@Immutable的类时显示错误。 Error:错误:

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) 

This error is thrown for every single class tagged with @Immutable but this does not brake the codenarc task, it actually performs the code checking, and the build is successful at the end.对于每个带有 @Immutable 标记的@Immutable都会抛出此错误,但这不会阻止 codenarc任务,它实际上会执行代码检查,并且最终构建成功。 This situation only happens when Groovy version is grater or equal to 3.0.0.这种情况只发生在Groovy版本大于等于3.0.0时。 Lower than that (2.xx) the compilation goes normal.低于那个 (2.xx) 编译正常。

Some info about the project: Gradle 6.9.1;有关该项目的一些信息:Gradle 6.9.1; Spring Boot 2.6.1; Spring 启动 2.6.1; CodeNarc tool version 2.2.0 (it is used through CodeNarc Gradle plugin) CodeNarc 工具版本 2.2.0(通过 CodeNarc Gradle 插件使用)

Some actions I have tried我尝试过的一些动作

  • Use different versions of Groovy 3使用不同版本的 Groovy 3
  • Upgrade Gradle version升级Gradle版本
  • Manually set the Groovy version for CodeNarc plugin to use手动设置Groovy版本供CodeNarc插件使用
  • Use different versions of codenarc使用不同版本的codenarc
  • Manually define ASTTransformation phase through @GroovyASTTransformation通过@GroovyASTTransformation手动定义ASTTransformation阶段
  • Disable the plugin and enable it again using XML CodeNarc config file禁用插件并使用 XML CodeNarc 配置文件再次启用它
  • Modify compilationClasspath for codenarcMain修改codenarcMain的compilationClasspath
  • Use the codenarc rule to avoid Stateless classes checking (this rule skips @Immutable classes) this actually skipped the Immutable classes but in terms of revision, but the compile error still shows the error.使用codenarc rule to avoid Stateless classes checking(这个规则跳过@Immutable classes)这个其实跳过了Immutable classes但是在revision方面,但是编译报错还是显示错误。
  • Use codenarc Exclusion config parameter to manually force it to skip the classes.使用 codenarc Exclusion 配置参数手动强制它跳过类。 Happened the same that the previous item.发生与上一项相同的情况。
  • Modify and play with different versions of org.codehaus.groovy:groovy-all (currently it uses the same Groovy version).修改并使用不同版本的org.codehaus.groovy:groovy-all (目前它使用相同的 Groovy 版本)。

CodeNarc plugin configuration inside build.gradle build.gradle里面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
    }

It looks like the underlying problem occurs because you are including some "enhanced" rules in your CodeNarc ruleset.看起来潜在的问题是因为您在 CodeNarc 规则集中包含了一些“增强的”规则。 Those rules require that CodeNarc have the application classes being analyzed, as well as any referenced classes, on the classpath, and the way the Gradle CodeNarc plugin is executing is not including those.这些规则要求 CodeNarc 在类路径上具有正在分析的应用程序类以及任何引用的类,而 Gradle CodeNarc 插件的执行方式不包括这些。

See https://github.com/CodeNarc/CodeNarc/issues/680 .参见https://github.com/CodeNarc/CodeNarc/issues/680

Then your setting the compilationClasspath is producing the error above.然后您设置compilationClasspath会产生上面的错误。

Remove any enhanced rules from your ruleset: CloneWithoutCloneable, JUnitAssertEqualsConstantActualValue, MissingOverrideAnnotation, UnsafeImplementationAsMap, GrailsDomainGormMethods .从规则集中删除任何增强规则: CloneWithoutCloneable、JUnitAssertEqualsConstantActualValue、MissingOverrideAnnotation、UnsafeImplementationAsMap、GrailsDomainGormMethods And remove your compilationClasspath configuration.并删除您的compilationClasspath配置。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM