当我们执行 java -version 命令时,通常会看到如下信息。
java version "1.8.0_201" Java(TM) SE Runtime Environment (build 1.8.0_201-b09) Java HotSpot(TM) 64-Bit Server VM (build 25.201-b09, mixed mode
当然,这是 oracle jdk 8u201 版本的输出结果。
如果我们是用的是 openJDK 构建出的 jdk 来看,它会是这样的。
openjdk version "1.8.0-internal" OpenJDK Runtime Environment (build 1.8.0-internal-root_2022_06_08_12_25-b00) OpenJDK 64-Bit Server VM (build 25.71-b00, mixed mode
当然,这是在没有修改源码且没有增加多余 configure 参数构建出的结果。
今天我想改一改这个输出信息,让它成为我自己拥有的 jdk,应该怎么办呢?
首先,我们下载 openjdk 8u312 版本的源码,可以从 openjdk 官网下载,也可以从一个更开发者友好的 adoptopenjdk 网站下载。
https://github.com/AdoptOpenJDK/openjdk8-upstream-binaries
下载好源码后,我们一顿操作猛如虎,配置、编译、打断点、运行调试,进入了 java -version 命令所执行到的关键源码位置。
可以看出,它最终执行了 sun/misc/Version 类的 print 方法,我们打开这个类。
public class Version { private static final String launcher_name = "openjdk"; private static final String java_version = "1.8.0-internal-debug"; private static final String java_runtime_name = "OpenJDK Runtime Environment"; private static final String java_profile_name = ""; private static final String java_runtime_version = "1.8.0-internal-debug-root_2022_06_09_16_41-b00"; public static void print() { print(System.err); } public static void print(PrintStream ps) { ... /* First line: platform version. */ ps.println(launcher_name + " version \"" + java_version + "\""); ... /* Second line: runtime version (ie, libraries). */ ps.print(java_runtime_name + " (build " + java_runtime_version); ... /* Third line: JVM information. */ String java_vm_name = System.getProperty("java.vm.name"); String java_vm_version = System.getProperty("java.vm.version"); String java_vm_info = System.getProperty("java.vm.info"); ps.println(java_vm_name + " (build " + java_vm_version + ", " + java_v