Groovy TypeChecked与类型检查扩展失效排查及自定义扩展需求
一、TypeChecked与类型检查扩展不生效的问题排查与修复
1. 核对GMavenPlus插件核心配置
确保pom.xml中GMavenPlus插件配置包含以下关键项,避免版本兼容或参数缺失问题:
<plugin> <groupId>org.codehaus.gmavenplus</groupId> <artifactId>gmavenplus-plugin</artifactId> <version>1.13.1</version> <!-- 使用最新稳定版,旧版本对TypeChecked支持存在缺陷 --> <executions> <execution> <goals> <goal>compile</goal> <goal>testCompile</goal> </goals> </execution> </executions> <configuration> <!-- 注册自定义类型检查扩展 --> <typeCheckingExtensions> <typeCheckingExtension>com.yourpackage.YourCustomExtension</typeCheckingExtension> </typeCheckingExtensions> <!-- 启用注解处理,确保@TypeChecked生效 --> <compilerArgs> <arg>-XenableAnnotations</arg> <!-- 若需全局强制类型检查,可添加 <arg>-Xtype-checking</arg> --> </compilerArgs> </configuration> <dependencies> <dependency> <groupId>org.codehaus.groovy</groupId> <artifactId>groovy-all</artifactId> <version>3.0.17</version> <!-- 与项目Groovy版本保持一致 --> <type>pom</type> </dependency> </dependencies> </plugin>
2. 确认TypeChecked注解的正确使用
若未全局开启类型检查,必须在需要检查的Groovy类上添加@TypeChecked注解:
import groovy.transform.TypeChecked @TypeChecked class DemoController { def testMethod() { println robot // 此时应触发未定义变量的编译错误 } }
3. 解决自定义扩展类的编译顺序问题
如果扩展类是项目内代码,需分两次编译:先编译扩展类,再编译其余业务代码,避免插件找不到未编译的扩展类。修改插件执行流程:
<executions> <!-- 第一步:编译类型检查扩展类 --> <execution> <id>compile-extensions</id> <goals> <goal>compile</goal> </goals> <configuration> <includes> <include>com/yourpackage/**/*TypeCheckingExtension.groovy</include> </includes> </configuration> </execution> <!-- 第二步:编译业务代码并启用扩展 --> <execution> <id>compile-main</id> <goals> <goal>compile</goal> </goals> <configuration> <excludes> <exclude>com/yourpackage/**/*TypeCheckingExtension.groovy</exclude> </excludes> <typeCheckingExtensions> <typeCheckingExtension>com.yourpackage.YourCustomExtension</typeCheckingExtension> </typeCheckingExtensions> <compilerArgs> <arg>-XenableAnnotations</arg> </compilerArgs> </configuration> </execution> </executions>
4. 验证扩展类的基础结构
确保自定义扩展类正确继承TypeCheckingExtension:
import org.codehaus.groovy.control.SourceUnit import org.codehaus.groovy.transform.stc.TypeCheckingExtension class YourCustomExtension extends TypeCheckingExtension { YourCustomExtension(SourceUnit sourceUnit) { super(sourceUnit) } @Override void setup() { // 可在此注册自定义检查规则 } }
二、参数数量不匹配的自定义错误输出实现
通过重写handleError方法,捕获INCORRECT_NUMBER_OF_ARGUMENTS类型的错误并输出自定义信息:
import org.codehaus.groovy.ast.expr.MethodCallExpression import org.codehaus.groovy.control.SourceUnit import org.codehaus.groovy.control.messages.SyntaxErrorMessage import org.codehaus.groovy.syntax.SyntaxException import org.codehaus.groovy.transform.stc.TypeCheckingExtension import static org.codehaus.groovy.transform.stc.StaticTypeCheckingSupport.ERROR_INCORRECT_NUMBER_OF_ARGUMENTS class ParamMismatchExtension extends TypeCheckingExtension { ParamMismatchExtension(SourceUnit sourceUnit) { super(sourceUnit) } @Override boolean handleError(GroovyTypeCheckingException error) { if (error.code == ERROR_INCORRECT_NUMBER_OF_ARGUMENTS) { def methodCall = error.expression as MethodCallExpression def methodName = methodCall.methodAsString def expectedMatch = error.message =~ /expected (\d+) arguments/ def actualMatch = error.message =~ /but found (\d+)/ // 自定义错误内容 def customMsg = """[自定义编译错误] 方法调用参数不匹配: 方法名:${methodName} 预期参数数量:${expectedMatch[0][1]},实际传入:${actualMatch[0][1]} 请检查方法定义与调用代码的参数一致性。""" // 输出自定义错误 def syntaxEx = new SyntaxException(customMsg, error.line, error.column) sourceUnit.errorCollector.addErrorAndContinue(new SyntaxErrorMessage(syntaxEx, sourceUnit)) return true // 标记错误已处理,跳过默认输出 } return super.handleError(error) // 其他错误交给默认逻辑处理 } }
将上述扩展类按照前面的编译顺序配置到GMavenPlus插件中即可生效。
内容的提问来源于stack exchange,提问作者dim-strong
相关产品推荐
相关产品推荐

