Java 11项目中出现“JDK 9”相关错误的真相与修复指南

冬丽小哥_8764

冬丽小哥_8764

2026-09-19

730人浏览

原创

Java 11项目中出现“JDK 9”相关错误的真相与修复指南

该错误并非环境配置错误,而是JMockit在Java 9+模块化(JPMS)环境下因JVM attach机制变更引发的运行时限制,需显式启用-Djdk.attach.allowAttachSelf或配置-javaagent才能正常工作。

该错误并非环境配置错误,而是jmockit在java 9+模块化(jpms)环境下因jvm attach机制变更引发的运行时限制,需显式启用`-djdk.attach.allowattachself`或配置`-javaagent`才能正常工作。

你看到的错误信息中反复出现的 “Running on JDK 9 requires…” 并非说明你的项目实际运行在Java 9——它是一个典型的语义泛化表达:JDK官方文档与第三方库(如JMockit)普遍用“JDK 9”代指 JDK 9 及更高版本(≥9),因为Java 9是Java平台模块系统(JPMS)和java.lang.instrument/com.sun.tools.attach行为变更的分水岭。

从堆栈可见,错误源头明确指向 jmockit-1.n.jar,且触发路径为JUnit Platform测试类处理器(JUnitPlatformTestClassProcessor),说明问题发生在测试执行阶段,而非编译或IDE配置阶段。这与你在IntelliJ中看到的Project SDK、Module Language Level、External Libraries等设置完全无关——那些只影响编译与代码提示,而该错误属于JVM启动参数缺失导致的运行时拒绝服务

? 根本原因:JPMS对动态attach的严格限制

Java 9起,出于安全强化,默认禁止JVM通过com.sun.tools.attach API对自己(self-attach)或祖先进程进行动态代理注入。而JMockit高度依赖此机制实现无侵入式Mock(如@Mocked@Injectable)。因此,即使你使用的是Java 11或Java 17,只要未显式授权,就会抛出该IllegalStateException

✅ 正确理解:JDK 9 = JDK ≥ 9,不是版本误配,而是功能启用开关未打开。

✅ 两种标准解决方案(任选其一)

方案一:添加JVM系统属性(推荐,轻量易维护)

在IntelliJ中为测试配置添加JVM选项:

  1. 打开 Run → Edit Configurations…
  2. 左侧选择你的测试配置(如JUnitTest
  3. VM options 输入框中添加:
    -Djdk.attach.allowAttachSelf=true
  4. 点击Apply → OK,重新运行测试。

? 优势:无需修改构建脚本,适用于本地调试;对Gradle/Maven构建无侵入。

方案二:显式声明Java Agent(适合CI/统一管控)

若项目已集成JMockit依赖,需确保-javaagent路径正确,并在所有运行环境中生效:

Alibabacloud Sdk Client Initialization For Java
Alibabacloud Sdk Client Initialization For Java

在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。

下载

Gradle(build.gradle)中配置:

test {
    jvmArgs = ['-javaagent:' + System.getProperty('user.home') + '/.m2/repository/org/jmockit/jmockit/1.49/jmockit-1.49.jar']
    // 或更健壮的写法(自动解析依赖路径):
    // jvmArgs = ['-javaagent:' + configurations.testRuntimeClasspath.files.find { it.name.contains('jmockit') }.absolutePath]
}

Maven(pom.xml)中配置:

<plugin><groupid>org.apache.maven.plugins</groupid><artifactid>maven-surefire-plugin</artifactid><version>3.0.0-M10</version><configuration><argline>-javaagent:${settings.localRepository}/org/jmockit/jmockit/1.49/jmockit-1.49.jar</argline></configuration></plugin>

⚠️ 注意:jmockit-1.49.jar路径需与你实际引入的版本一致;建议使用mvn dependency:copy-dependencies确认本地仓库路径。

? 常见误区与避坑提醒

  • ❌ 不要试图降级JDK至8——既违背现代Java工程实践,也无法解决根本问题(JMockit 1.x本身已不兼容JDK 8的旧attach逻辑);
  • ❌ 不要修改module-info.java或加--add-opens——此错误与模块导出无关,而是JVM底层attach权限控制;
  • ❌ 不要在gradle.properties中设org.gradle.jvmargs来全局添加-Djdk.attach...——该参数仅作用于Gradle Daemon JVM,而非测试子进程;
  • ✅ 推荐长期演进:评估迁移到JUnit 5 Mocking ExtensionsMockito-inline,它们原生适配JPMS且无需Java Agent。

✅ 验证是否修复

成功添加配置后,再次运行测试,错误应消失,且JMockit功能(如@Mocked List<string></string>)可正常工作。你可在测试中加入简单断言验证:

@Test
public void testJMockitWorks() {
    new Expectations() {{
        mockedList.size(); result = 42;
    }};
    assertEquals(42, mockedList.size()); // 应通过
}

记住:这不是一个“可以忽略的警告”,而是阻断测试执行的硬性失败。但它的修复成本极低——只需一行JVM参数。理解其背后的JPMS设计哲学,比机械地复制粘贴解决方案更有价值。

Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

java

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
java
java

Java是一个通用术语,用于表示Java软件及其组件,包括“Java运行时环境 (JRE)”、“Java虚拟机 (JVM)”以及“插件”。php中文网还为大家带了Java相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

2023.06.15

8617

6

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

2023.07.05

5822

9

java自学难吗
java自学难吗

Java自学并不难。Java语言相对于其他一些编程语言而言,有着较为简洁和易读的语法,本专题为大家提供java自学难吗相关的文章,大家可以免费体验。

2023.07.31

5252

8

java配置jdk环境变量
java配置jdk环境变量

Java是一种广泛使用的高级编程语言,用于开发各种类型的应用程序。为了能够在计算机上正确运行和编译Java代码,需要正确配置Java Development Kit(JDK)环境变量。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.08.01

964

3

java保留两位小数
java保留两位小数

Java是一种广泛应用于编程领域的高级编程语言。在Java中,保留两位小数是指在进行数值计算或输出时,限制小数部分只有两位有效数字,并将多余的位数进行四舍五入或截取。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.08.02

808

3

java基本数据类型
java基本数据类型

java基本数据类型有:1、byte;2、short;3、int;4、long;5、float;6、double;7、char;8、boolean。本专题为大家提供java基本数据类型的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.02

1136

5

java有什么用
java有什么用

java可以开发应用程序、移动应用、Web应用、企业级应用、嵌入式系统等方面。本专题为大家提供java有什么用的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.02

2269

5

java在线网站
java在线网站

Java在线网站是指提供Java编程学习、实践和交流平台的网络服务。近年来,随着Java语言在软件开发领域的广泛应用,越来越多的人对Java编程感兴趣,并希望能够通过在线网站来学习和提高自己的Java编程技能。php中文网给大家带来了相关的视频、教程以及文章,欢迎大家前来学习阅读和下载。

2023.08.03

19631

3

配置java环境变量
配置java环境变量

配置Java环境变量是为了让操作系统能够识别和使用Java的相关命令和功能。本专题为大家提供配置java环境变量相关文章,帮助大家解决问题。

2023.08.03

1035

8

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
dev.java 官方:Learn Java
dev.java 官方:Learn Java

共0课时 | 0人学习

Java JDBC数据库连接官方教程
Java JDBC数据库连接官方教程

共0课时 | 0人学习