不能。make test-tier1 是 OpenJDK 构建系统中基于 JTReg 的原生测试流程,仅执行带特殊注释的 .java 测试用例,不识别 JUnit 注解、不加载 junit.jar,也不支持 Maven/Gradle;JUnit 测试须脱离 OpenJDK 源码树,以外部独立项目方式,用已编译 JDK 运行。

make test-tier1 能不能直接跑 JUnit 测试
不能。OpenJDK 构建系统里的 make test-tier1 是 HotSpot 和 JDK 基础模块的**原生测试套件(JTReg)驱动流程**,不是为 JUnit 设计的。它会调用 jtreg 工具执行 .java 格式的测试用例(带特殊注释标记),而非 @Test 方法。即使你把 JUnit 依赖打进构建环境,make test-tier1 也不会识别或加载 junit.jar 或扫描 org.junit.Test 注解。
想在 OpenJDK 源码里加 JUnit 测试,得走 Maven 还是 Gradle
都不行——OpenJDK 官方构建不支持 Maven 或 Gradle。它的构建基于 configure + make,整个测试基础设施围绕 JTReg 和自研的 test/Makefile 展开。如果你硬要在 src/java.base/share/classes/ 附近写 JUnit 测试:
- 必须单独建一个外部 Maven/Gradle 项目,把 OpenJDK 的
build/linux-x86_64-server-release/jdk下的lib/modules作为运行时模块路径(--module-path) - 不能把测试代码塞进 OpenJDK 源码树的
test/目录下——那里只认 JTReg 格式 - JUnit 5 的
junit-jupiter-engine在 JDK 8/11 环境下需手动处理模块导出,容易触发IllegalAccessError
本地验证某个 JDK 类(比如 java.util.ArrayList)的 JUnit 测试怎么跑
最轻量、最可靠的做法是绕过 OpenJDK 构建系统,直接用 JDK 自身运行:
- 确保已编译好 OpenJDK(例如输出在
build/linux-x86_64-server-release/jdk) - 用该 JDK 启动 JUnit:
build/linux-x86_64-server-release/jdk/bin/java -cp "junit-platform-console-standalone-1.10.0.jar:your-test-classes" org.junit.platform.console.ConsoleLauncher --class-path your-test-classes --scan-class-path - 若测试涉及内部 API(如
Unsafe或jdk.internal.misc.Unsafe),需加启动参数:--add-opens java.base/jdk.internal.misc=ALL-UNNAMED - 别依赖
mvn test—— OpenJDK 源码根目录没有pom.xml,强行加会导致 classpath 混乱,尤其rt.jar/modules冲突
CI 场景下如何让 JUnit 测试和 OpenJDK 构建共存
不能混在同一构建流水线里。必须拆成两个独立阶段:
- Stage 1:用
make images编译出可运行的 JDK 镜像(耗时长,但只需一次) - Stage 2:拉取 Stage 1 输出的
jdk目录,用它作为JAVA_HOME运行外部 JUnit 测试项目(用./mvnw test或gradle test) - GitLab CI 示例中常见的
artifacts: reports: junit:只能解析 Surefire 生成的 XML,和 OpenJDK 的TEST-*.jtr日志格式不兼容
真正容易被忽略的是:OpenJDK 的 test/ 目录下所有测试都默认以 JDK 自举方式运行(即用刚编译出的 JDK 执行测试),而你的 JUnit 测试如果依赖 Spring 或 Mockito,就必然引入第三方类加载器逻辑——这和 OpenJDK 的模块系统边界存在隐式冲突,调试时看不到真实的 NoClassDefFoundError 根因,只会卡在 ModuleFinder 阶段。


















