本文参考周志明的《深入理解Java虚拟机》做探讨。
一、 构建编译环境
1. 安装OpenJDK编译依赖库
在Ubuntu系统上构造编译环境需要安装OpenJDK编译依赖库,下面的表格来源于《深入理解Java虚拟机》
工具 | 库名称 | 安装命令 |
---|---|---|
FreeType | The FreeType Project | sudo apt-get install libfreetype6-dev |
CUPS | Common UNIX Printing System | sudo apt-get install libcups-dev |
X11 | X Window System | sudo apt-get install libx11-dev libxext-dev libxrender-dev libxrandr-dev libxtst-dev libxt-dev |
ALSA | Advanced Linux Sound Architecture | sudo apt-get install libasound2-dev |
libffi | Portable Foreign Function Interface Library | sudo apt-get install libffi-dev |
Autoconf | Extensible Package of M4 Macros | sudo apt-get install autoconf |
2. 安装Bootstrap JDK
编译OpenJDK12时,Bootstrap JDK必须使用JDK11及之后的版本。
sudo apt-get install openjdk-11-jdk
二、下载需要编译的源码OpenJDK12
本文所用的OpenJDK12源码来源github
https://github.com/jiankunking/openjdk12/archive/refs/heads/master.zip
三、编译OpenJDK12
在Ubuntu系统中进入上述OpenJDK12文件夹内,执行bash configure来检查依赖项、参数配置和构建输出目录结构等。如果编译过程中需要的工具链或者依赖项有缺失,命令执行后将会得到明确的提示。笔者在编译过程中就报错缺失fontconfig文件,于是重新安装此库
sudo apt-get install libfontconfig1-dev
执行成功后,会出现如下所示的结果(此结果基于bash configure --enable-debug --with-jvm-variants=server)
最后执行make命令,成功后即可在“build/配置名称”目录下看到如下目录结构
笔者整个过程中所遇问题汇总:
1. 无法建立软链接
failed to create symbolic link '/mnt/hgfs/Ubuntu/openjdk12-master/build/linux-x86_64-server-release/jdk/lib/tzdb.dat': Operation not supported
分析:由于笔者是通过在Windows系统中将OpenJDK12源码下载过来然后再用vmware的共享文件夹来传递到Ubuntu系统中的,而由于在共享文件夹中的磁盘格式的是windows 的磁盘格式,ln命令并不适用,此时是由于在编译动态库的时候会在库的结尾加入版本信息,然后再通过ln建立链接,此时只需要在pro文件中加入 CONFIG+=plugin之后编译的库名称中是不包含版本信息的,此时不会使用ln去建立链接,就可以在当前共享文件夹中进行编译。或者通过mv命令将文件夹移至虚拟机中的文件夹中也可。
2. gcc、g++版本问题
修改版本:
(1)首先安装gcc7(默认安装gcc9)
sudo apt-get install gcc-7 g++-7
(2)对gcc更换软链接
cd /usr/bin
sudo rm -r gcc #移除之前的软链接
sudo ln -sf gcc-7 gcc #建立gcc-7的软链接
sudo rm -r g++
sudo ln -sf g++-7 g++
(3)通过gcc -v命令查看gcc版本是否生效