使用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相关配置。想咨询:
- 该报错在Java 11环境下是否正常?
- 是否需要处理?
- 除上述位置外还有哪些需检查的地方?
问题解答
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
相关产品推荐
相关产品推荐

