在 Centos 7 上编译 OpenJDK 23 及错误处理

在 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 asciiencoding utf-8,最终成功实现带中文注释的编译

配置和编译

jdk 目录下执行下面命令,前面的 yum install xxx 只是安装一些可能没有安装的工具,关键在 sh configuremake

注意 --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,最终效果如下。

相关推荐
llwszx2 小时前
深入理解Java锁原理(一):偏向锁的设计原理与性能优化
java·spring··偏向锁
云泽野3 小时前
【Java|集合类】list遍历的6种方式
java·python·list
二进制person3 小时前
Java SE--方法的使用
java·开发语言·算法
小阳拱白菜4 小时前
java异常学习
java
FrankYoou6 小时前
Jenkins 与 GitLab CI/CD 的核心对比
java·docker
一位摩羯座DBA6 小时前
Redhat&Centos挂载镜像
linux·运维·centos
学习3人组6 小时前
CentOS配置网络
linux·网络·centos
麦兜*6 小时前
Spring Boot启动优化7板斧(延迟初始化、组件扫描精准打击、JVM参数调优):砍掉70%启动时间的魔鬼实践
java·jvm·spring boot·后端·spring·spring cloud·系统架构
KK溜了溜了6 小时前
JAVA-springboot 整合Redis
java·spring boot·redis
天河归来6 小时前
使用idea创建springboot单体项目
java·spring boot·intellij-idea