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

从Java 11迁移到17时Groovy测试用例失败求助

解决Java 11升级到17后Spock测试的NoClassDefFoundError问题

针对你遇到的NoClassDefFound Could not initialize class org.spockframework.mock.runtime.CglibMockFactory$ConstructorFriendlyEnhancer错误,以下是经实践验证的解决方案:

1. 升级CGLib到Java17兼容版本

你当前使用的cglib-nodep:3.2.9版本过旧,不支持Java17的字节码规范和模块系统。建议升级到3.3.0及以上版本,示例依赖配置:

<dependency>
    <groupId>cglib</groupId>
    <artifactId>cglib-nodep</artifactId>
    <version>3.3.0</version>
    <scope>test</scope>
</dependency>

2. 添加兼容Java17的ASM依赖

CGLib依赖ASM库,Java17需要ASM 9.x版本配合。添加以下依赖:

<dependency>
    <groupId>org.ow2.asm</groupId>
    <artifactId>asm</artifactId>
    <version>9.5</version>
    <scope>test</scope>
</dependency>

3. 调整Maven Compiler Plugin配置

确保编译器明确使用Java17,并添加模块访问权限参数(Spock的CGLib需要反射访问Java核心类):

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.12.1</version> <!-- 升级到支持Java17的版本,替代3.9.0 -->
    <configuration>
        <source>17</source>
        <target>17</target>
        <release>17</release>
        <compilerArgs>
            <arg>--add-opens=java.base/java.lang=ALL-UNNAMED</arg>
            <arg>--add-opens=java.base/java.lang.reflect=ALL-UNNAMED</arg>
        </compilerArgs>
    </configuration>
</plugin>

4. 配置Maven Surefire Plugin传递VM参数

测试运行时同样需要赋予Spock反射访问权限,在Surefire插件中添加:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>3.2.2</version>
    <configuration>
        <argLine>
            --add-opens=java.base/java.lang=ALL-UNNAMED
            --add-opens=java.base/java.lang.reflect=ALL-UNNAMED
        </argLine>
    </configuration>
</plugin>

5. 升级Spock版本(可选)

Spock 2.3-groovy-3.0虽支持Java17,但2.4-groovy-3.0修复了更多兼容问题,可尝试升级:

<dependency>
    <groupId>org.spockframework</groupId>
    <artifactId>spock-core</artifactId>
    <version>2.4-groovy-3.0</version>
    <scope>test</scope>
</dependency>

6. 排查依赖冲突

执行mvn dependency:tree命令,检查是否有旧版本的CGLib或ASM被其他依赖引入,通过<exclusions>标签排除冲突的旧版本。


内容的提问来源于stack exchange,提问作者Ridhi Bhat

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 13:25:07