java - 即使我使用的是 Java 11,错误消息也提到了 Java 9

标签 java java-9 jmockit javaagents java-platform-module-system

我有一个 Java 11 Gradle 项目可供工作。我正在使用 IntelliJ Idea。我有一些测试错误,所以我正在尝试调试。我询问的错误消息似乎与测试错误无关,但我可能是错的,它仍然困扰着我。这是消息:

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)

我已经查看了设置、项目结构以及外部库中的所有 Jars。我看到所有内容都在说 Java 11。我没有看到任何内容说 Java 9。这是我期望在 Java 11 中收到的消息吗?这是一条我不需要担心的消息吗?除了设置、项目结构和 JAR 之外,还有其他地方需要检查吗?

最佳答案

您的问题与 IntelliJ IDEA 完全无关。您只是碰巧从那里运行测试。相反,您应该提到您在测试中使用了 JMockit,这显然是问题的根本原因,如果您完全阅读错误消息而不是停在“JDK 9”,就像 Johannes 所说,这意味着“JDK >= 9":

java.lang.IllegalStateException:
  Running on JDK 9 requires
    -javaagent:<proper path>/jmockit-1.n.jar
    or -Djdk.attach.allowAttachSelf

您不仅在错误消息中看到“jmockit”,而且还看到了两种可能的解决方案。您尝试过其中任何一个吗?

顺便说一句,错误消息提到了 JDK 9,因为该版本引入了 JPMS(Java 平台模块系统)。 JEP 261: Module System是 JDK 9 的一部分,内容如下:

The com.sun.tools.attach API can no longer be used, by default, to attach an agent to the current process or an ancestor of the current process. Such attachment operations can be enabled by setting the system property jdk.attach.allowAttachSelf on the command line.

这改变了如何在没有 -javaagent 命令行参数的情况下将 Java 代理动态附加到正在运行的 JVM 的方式,特别是自附加,即启动附加的 JVM 也是目标 JVM。 JMockit 利用了该技术,这就是为什么您需要为 JDK 9+ 设置系统属性或使用在命令行上声明 JMockit 代理的传统方法。这两个选项都很容易实现。

关于java - 即使我使用的是 Java 11,错误消息也提到了 Java 9,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76794482/

相关文章:

java - 池化 NHttpClientConnectionManager : what is timeToLive attribute for?

java - Eclipse 不显示 Java 9 选项

java - "compiler message file broken"- 我猜是 Java 编译器错误?

jmockit 0.999.11 在 Windows 操作系统上无法识别 jdk 8

java - Java中的图片转换与矩阵乘法不起作用

java - 如果选项有效但否则如果不

jmockit - 有没有办法使用JMockit模拟spring的jdbcTemplate?

java - Spring Autowiring 保留 JMockit 模拟以进行其他测试

java - 在 Java 中处理多个时区

java - 由于 Java 9 HashMap.computeIfAbsent() 在尝试内存递归函数结果时抛出 ConcurrentModificationException