【问题标题】:Why am I getting "java.lang.NoClassDefFoundError: Could not initialize class io.mockk.impl.JvmMockKGateway" when using quarkusDev task in IntelliJ?为什么在 IntelliJ 中使用 quarkusDev 任务时出现“java.lang.NoClassDefFoundError: Could not initialize class io.mockk.impl.JvmMockKGateway”?
【发布时间】:2023-01-09 21:26:40
【问题描述】:
我正在使用 Gradle 7.5、Quarkus 2.12.3 和 mockk 1.13.3。当我尝试从命令行运行 quarkusDev 任务然后开始连续测试(通过按 r)时,所有测试都正常通过。
但是,当我执行与 IntelliJ 相同的操作(作为 gradle 运行配置)时,所有测试都失败并出现错误:
java.lang.NoClassDefFoundError: Could not initialize class io.mockk.impl.JvmMockKGateway
我该如何解决?
【问题讨论】:
标签:
kotlin
gradle
intellij-idea
quarkus
mockk
【解决方案1】:
屏蔽抛出的异常
经过多次调试,我发现了问题。抛出的异常实际上起源于HotSpotVirtualMachine.java,并在 ByteBuddy 作为 java 代理的附加过程中抛出。这是相关代码;
// The tool should be a different VM to the target. This check will
// eventually be enforced by the target VM.
if (!ALLOW_ATTACH_SELF && (pid == 0 || pid == CURRENT_PID)) {
throw new IOException("Can not attach to current VM");
}
关闭检查
因此可以通过将 ALLOW_ATTACH_SELF 常量设置为 true 来关闭检查。该常量是从名为jdk.attach.allowAttachSelf 的系统属性中设置的:
String s = VM.getSavedProperty("jdk.attach.allowAttachSelf");
ALLOW_ATTACH_SELF = "".equals(s) || Boolean.parseBoolean(s);
因此,就我而言,我只是将以下 JVM 参数添加到我的 gradle 文件中,测试开始通过:
tasks.quarkusDev {
jvmArgs += "-Djdk.attach.allowAttachSelf"
}