说到编译 JDK,大家应该都不会陌生,而且网上在编译 JDK 方面的文章不可胜数。不过,在我看过的相关文章里,都是编译完 JDK,可以跑 javac、java 和 hello, world 等操作就算完事了。编译一个 JDK 不难,只要依赖齐全基本都能完成编译。但是,自行编译的 JDK 可靠性如何,不经过可靠的测试很难说明。
本文不介绍如何编译 JDK,而是介绍编译 JDK 之后,如何对编译产物进行回归测试,验证我们自行构建的 JDK 的可靠性。
获取 jtreg
jtreg 是 OpenJDK 的回归测试工具。
方式一:自行构建
能够编译 JDK 的环境,一般可以直接编译 jtreg。
git clone https://github.com/openjdk/jtreg.git
cd jtreg
bash make/build.sh
执行脚本,最后看到打包 jtreg.zip 步骤,就是构建成功了。
[build.sh][INFO] CYGWIN_OR_MSYS=0
[build.sh][INFO] JAVA_HOME: /Users/wuweijie/Library/Java/JavaVirtualMachines/temurin-17.0.7/Contents/Home
[build.sh][INFO] Downloading https://archive.apache.org/dist/ant/binaries/apache-ant-1.10.8-bin.zip to /Users/wuweijie/projects/jtreg/make/../build/deps/apache-ant-1.10.8-bin.zip
[build.sh][INFO] Unpacking /Users/wuweijie/projects/jtreg/make/../build/deps/apache-ant-1.10.8-bin.zip in /Users/wuweijie/projects/jtreg/make/../build/deps/ant
[build.sh][INFO] ANT: /Users/wuweijie/projects/jtreg/make/../build/deps/ant/apache-ant-1.10.8/bin/ant
# 省略过程日志
cd /Users/wuweijie/projects/jtreg/build/images; /usr/bin/zip -rq /Users/wuweijie/projects/jtreg/build/images/jtreg.zip jtreg
构建好的 jtreg 在目录 build/images/jtreg
中。
方式二:下载第三方构建
Adoptium 提供了构建好的 jtreg
获取并构建 GoogleTest
自行克隆编译,可以使用 cmake:
git clone https://github.com/google/googletest.git -b v1.13.0
cd googletest
cmake .
make
日志输出如下:
wuweijie at wuweijies-MacBook-Air in ~/projects/googletest on v1.13.0
± cmake .
-- The C compiler identification is AppleClang 14.0.3.14030022
-- The CXX compiler identification is AppleClang 14.0.3.14030022
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/cc - skipped
-- Detecting C compile features
-- Detecting C compile features - done
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Found Python: /opt/homebrew/Frameworks/Python.framework/Versions/3.11/bin/python3.11 (found version "3.11.3") found components: Interpreter
-- Performing Test CMAKE_HAVE_LIBC_PTHREAD
-- Performing Test CMAKE_HAVE_LIBC_PTHREAD - Success
-- Found Threads: TRUE
-- Configuring done (1.2s)
-- Generating done (0.0s)
-- Build files have been written to: /Users/wuweijie/projects/googletest
wuweijie at wuweijies-MacBook-Air in ~/projects/googletest on v1.13.0!
± make
[ 12%] Building CXX object googletest/CMakeFiles/gtest.dir/src/gtest-all.cc.o
[ 25%] Linking CXX static library ../lib/libgtest.a
[ 25%] Built target gtest
[ 37%] Building CXX object googlemock/CMakeFiles/gmock.dir/src/gmock-all.cc.o
[ 50%] Linking CXX static library ../lib/libgmock.a
[ 50%] Built target gmock
[ 62%] Building CXX object googlemock/CMakeFiles/gmock_main.dir/src/gmock_main.cc.o
[ 75%] Linking CXX static library ../lib/libgmock_main.a
[ 75%] Built target gmock_main
[ 87%] Building CXX object googletest/CMakeFiles/gtest_main.dir/src/gtest_main.cc.o
[100%] Linking CXX static library ../lib/libgtest_main.a
[100%] Built target gtest_main
编译产物在 lib
目录下。
OpenJDK configure 指定 jtreg 与 gtest
- jtreg 可以通过
--with-jtreg
指定路径,路径为 jtreg 构建产物的目录。 - GoogleTest 可以通过
--with-gtest
指定路径,路径为 GoogleTest 仓库跟目录。
例如:
bash configure --with-jtreg=/Users/wuweijie/projects/jtreg/build/images/jtreg --with-gtest=/Users/wuweijie/projects/googletest
执行 configure
的时候,日志中出现以下内容即代表 jtreg / googletest 已经被识别到。
checking for jtreg test harness... /Users/wuweijie/projects/jtreg/build/images/jtreg
checking jtreg version number... 7.4-dev
checking for gtest... /Users/wuweijie/projects/googletest
构建 OpenJDK
环境准备好了,就执行编译。
make images
编译结束后,就可以执行测试了。
运行测试
JDK 的测试分了 4 个层次:
tier1
:最基本的测试层次。tier1
中的测试都经过精心挑选和优化,快速、稳定。 第一层中的测试失败通常会快速跟进,要么修复,要么将相关测试添加到问题列表中。GitHub Actions 中跑的就是tier1
的测试。tier2
:这个测试层次涵盖了更多的领域。 除其他外,这些测试包含运行时间太长而无法在第 1 层运行的测试,或者可能需要特殊配置的测试,或者不太稳定的测试,或者涵盖更广泛的非核心 JVM 和 JDK 功能/组件(例如 XML)。tier3
:此测试组包括压力更大的测试、先前层未涵盖的极端情况的测试,以及需要 GUI 的测试。tier4
:此测试组包括之前各层未涵盖的所有其他测试。 例如,它包括适用于 Hotspot 的 vmTestbase 套件,即使在超多核高性能环境上也可能需要运行多个小时。
对于 JDK 核心功能的验证,我们运行 tier1
就足够了。tier1
也是开发人员日常运行最多的测试。
make run-test-tier1
虽然是最低的测试层次,但在我的 Apple M1 环境也运行了好久,可能有一个半小时左右。测试运行完毕后,会输出统计信息。详细的测试记录在 build/macosx-aarch64-server-fastdebug/test-results
目录内。
Report written to /Users/wuweijie/projects/jdk/build/macosx-aarch64-server-fastdebug/test-results/jtreg_test_lib_test_tier1/html/report.html
Results written to /Users/wuweijie/projects/jdk/build/macosx-aarch64-server-fastdebug/test-support/jtreg_test_lib_test_tier1
Finished running test 'jtreg:test/lib-test:tier1'
Test report is stored in build/macosx-aarch64-server-fastdebug/test-results/jtreg_test_lib_test_tier1
==============================
Test summary
==============================
TEST TOTAL PASS FAIL ERROR
jtreg:test/hotspot/jtreg:tier1 2376 2376 0 0
jtreg:test/jdk:tier1 2380 2380 0 0
jtreg:test/langtools:tier1 4407 4407 0 0
jtreg:test/jaxp:tier1 0 0 0 0
jtreg:test/lib-test:tier1 30 30 0 0
==============================
TEST SUCCESS
Finished building target 'run-test-tier1' in configuration 'macosx-aarch64-server-fastdebug'
以上就是对 OpenJDK 运行回归测试的简要介绍。