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

使用Java 11 Gradle项目却出现JDK 9相关报错的排查咨询

关于Java 11 Gradle项目中JMockit报错的问题

问题描述

我在IntelliJ IDEA开发Java 11 Gradle项目时,调试测试遇到一条疑似无关的报错,内容如下:

java.lang.IllegalStateException: Running on JDK 9 requires -javaagent:<proper path>/jmockit-1.n.jar or -Djdk.attach.allowAttachSelf
    at java.base/java.util.ServiceLoader$ProviderImpl.newInstance(ServiceLoader.java:780)
    at java.base/java.util.ServiceLoader$ProviderImpl.get(ServiceLoader.java:722)
    at java.base/java.util.ServiceLoader$3.next(ServiceLoader.java:1395)
    at java.base/java.lang.Iterable.forEach(Iterable.java:74)
    at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor$CollectAllTestClassesExecutor.processAllTestClasses(JUnitPlatformTestClassProcessor.java:97)
    at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor$CollectAllTestClassesExecutor.access$000(JUnitPlatformTestClassProcessor.java:79)
    at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor.stop(JUnitPlatformTestClassProcessor.java:75)
    at org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor.stop(SuiteTestClassProcessor.java:61)
    at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:36)
    at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24)
    at org.gradle.internal.dispatch.ContextClassLoaderDispatch.dispatch(ContextClassLoaderDispatch.java:33)
    at org.gradle.internal.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:94)
    at org.gradle.api.internal.tasks.testing.worker.TestWorker.stop(TestWorker.java:133)
    at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:36)
    at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24)
    at org.gradle.internal.remote.internal.hub.MessageHubBackedObjectConnection$DispatchWrapper.dispatch(MessageHubBackedObjectConnection.java:182)
    at org.gradle.internal.remote.internal.hub.MessageHubBackedObjectConnection$DispatchWrapper.dispatch(MessageHubBackedObjectConnection.java:164)
    at org.gradle.internal.remote.internal.hub.MessageHub$Handler.run(MessageHub.java:414)
    at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64)
    at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:48)
    at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
    at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
    at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:56)
    at java.base/java.lang.Thread.run(Thread.java:834)

已检查IntelliJ的Settings、Project Structure以及外部依赖JAR,均显示使用Java 11,未发现Java 9相关配置。想咨询:

  1. 该报错在Java 11环境下是否正常?
  2. 是否需要处理?
  3. 除上述位置外还有哪些需检查的地方?

问题解答

1. Java 11环境下出现这个报错正常吗?

不正常。这是JMockit 1.x版本的兼容性bug:它的代码仅判断当前是否为JDK 9,未区分更高版本的JDK(比如11),导致在JDK 11上也触发了针对JDK 9的提示,本质是旧版本JMockit对JDK 9+的适配不彻底,和Java 11本身无关。

2. 是否需要处理?

需要处理。从报错栈可以看到,测试类处理阶段已经抛出异常并停止,不解决会导致测试无法正常执行。有两种处理方式:

  • 升级JMockit到2.x版本:2.x系列完全适配JDK 9+,不会再出现这个判断逻辑问题,是最优解。
  • 添加JVM参数(临时方案):如果暂时无法升级,在测试的JVM参数中添加-Djdk.attach.allowAttachSelf,或者配置-javaagent指向项目中jmockit-1.n.jar的实际路径。

3. 还需要检查哪些地方?

除已检查的位置外,这些地方可能隐藏JDK配置或依赖问题:

  • Gradle构建脚本:检查build.gradle/build.gradle.kts中的sourceCompatibility、targetCompatibility是否设置为11,同时查看test任务是否单独指定了JDK版本。
  • IntelliJ Run/Debug配置:打开测试的Run Configuration,确认VM options中没有指定旧JDK的参数,且JRE选项未误选Java 9。
  • Gradle全局配置:检查~/.gradle/gradle.properties中是否存在org.gradle.java.home配置,确认其指向的是Java 11路径。
  • 系统环境变量:查看JAVA_HOME、PATH中是否有Java 9的路径优先级高于Java 11,Gradle可能会读取系统环境变量的JDK。
  • JMockit依赖版本:确认项目依赖的JMockit是否为1.x版本,这是触发报错的核心原因,升级到2.x可直接解决问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 01:25:03