【问题标题】: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"
    }
    

    【讨论】:

      猜你喜欢
      • 2018-04-05
      • 1970-01-01
      • 2017-06-18
      • 2011-10-31
      • 2021-06-08
      • 2020-07-05
      • 1970-01-01
      • 2022-06-12
      • 2014-08-26
      相关资源
      最近更新 更多