在 Centos 7 上编译 OpenJDK 23
目的
希望在 JDK 源码中添加自己的中文注释,方便对学习过程进行记录。
其中遇到的错误主要有BootJDK的版本问题 和字符编码问题,没有去调查哪些版本是兼容的,本文主要处理字符编码问题。
操作环境
组件 | 版本 |
---|---|
操作系统 | Centos 7 |
待编译 JDK 的源码 | OpenJDK 23 |
Boot JDK | OpenJDK 21 |
操作步骤
下载 JDK 源码和 BootJDK
sh
# 下载OpenJDK源码(需要编译的版本)
wget https://codeload.github.com/openjdk/jdk/zip/refs/tags/jdk-23%2B12
# 下载编译好的OpenJDK作为BootJDK
wget https://download.java.net/java/GA/jdk21.0.2/f2283984656d49d69e91c558476027ac/13/GPL/openjdk-21.0.2_linux-x64_bin.tar.gz
下载后,对其进行解压,zip
格式使用 unzip
命令,tar
格式使用 tar
命令。没有相关工具则使用 yum install -y <xxx>
进行安装 。
假设解压完成后的目录分别为 jdk
(待编译目录)和 jdk-21.0.2
(BootJDK目录),之后操作涉及的步骤到在 jdk
目录中,和 jdk-21.0.2
无关。
更新 gcc 版本
gcc 的默认版本太低,需要进行更新
sh
gcc -v & \
yum install centos-release-scl -y & \
yum install devtoolset-8-gcc* -y & \
scl enable devtoolset-8 bash & \
gcc -v
其中 scl enable devtoolset-8 bash
只在当前命令行生效,每次重启 bash 都需要再次执行该命令。如果需要永久生效,可以设置环境变量,也可以替换掉 /usr/bin/gcc
对应的软连接
安装C.UTF-8编码集(Centos 7)
java
localedef -v -c -i en_US -f UTF-8 C.UTF-8
安装该编码集后,确实不再出现警告信息,但依然无法对文件中存在的中文字符进行正确编译。
修改 encoding
这里通过 IDEA 的 Deployment 功能,对 Linux 服务器上的
jdk
目录做一个映射,然后将其下载到 Windows 本地系统中,方便使用 IDEA 工具进行修改。
通过 ctrl + shift + r
查找 encoding ascii
,修改其中一个文件(JavaCompilation.gmk)为 encoding utf-8
成功编译带中文注释的 jdk,虽然成功编译,但是最终的生成的images中并没有中文注释,似乎被忽略了一样。修改所有的 encoding ascii
为 encoding utf-8
,最终成功实现带中文注释的编译
配置和编译
在 jdk
目录下执行下面命令,前面的 yum install xxx
只是安装一些可能没有安装的工具,关键在 sh configure
和 make
。
注意 --with-boot-jdk
指定自己的 BootJDK 所在的文件路径
sh
yum groupinstall "Development Tools" -y & \
yum install freetype-devel -y & \
yum install fontconfig-devel -y & \
yum install cups-devel -y & \
yum install libXtst-devel libXt-devel libXrender-devel libXrandr-devel libXi-devel -y & \
yum install alsa-lib-devel -y & \
yum install libffi-devel -y & \
yum install autoconf -y & \
sh configure --with-boot-jdk=/opt/module/jdk-21.0.2 & \
make images
最终编译结果为 jdk/build/linux-x86_64-xxx/images/jdk
,剩下只需要在其它项目中指定该路径为 JAVA_HOME 即可。
其它
即使通过 IDEA 中的 Deployment 功能进行映射,但是 jdk 项目中的代码并没有高亮,也没有类和类之间的代码跳转。
另外,jdk 项目本身不能够指定另一个编译好的 JDK,否则会出现包名冲突。
解决这个问题的办法是,通过右键 Mark Directory as Sources Root
,最终效果如下。