You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 10:53:18