将项目的 Groovy 版本2.5.13
从3.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
}