当我们执行 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 + "

本文详细介绍了如何修改OpenJDK源码,以改变`java -version`命令的输出信息。通过配置编译参数,调整`Version.java.template`、`GensrcMisc.gmk`和`spec.gmk.in`等文件,可以定制自己的JDK版本标识,模仿业界知名发行版如腾讯Kona、阿里Dragonwell和华为bisheng的做法,实现个性化JDK。
最低0.47元/天 解锁文章
1118

被折叠的 条评论
为什么被折叠?



