JAVA虚拟机(JVM)系列:
JAVA虚拟机(JVM)一:了解JAVA体系结构
JAVA虚拟机(JVM)二:JVM工作原理
JAVA虚拟机(JVM)三:类加载器子系统
JAVA虚拟机(JVM)四:JMM(Java内存模型)
JAVA虚拟机(JVM)五:JVM执行引擎
……
JAVA虚拟机(JVM)实战一:Docker容器环境下编译OpenJDK11
前言
参考building文档,通常情况下,编译OpenJDK11源码构建新的JDK需要以下步骤:
- 准备编译环境
- 下载OpenJDK11源码;
- 按自己需求修改OpenJDK11源码;
- 编译构建新的JDK;
一、Windows 准备
由于在Windows下,故直接用Docker 容器(刚好本地库有Ubuntu20.04镜像)作为基础环境。
另外,确保产物持久化,在Window宿主机下,创建openJDK源码目录( D:\soft\docker\openjdksrc ),再以数据盘方式挂载到容器内部。
powershell 创建源码目录
mkdir D:\soft\docker\openjdksrc;
二、准备环境
执行以下docker命令,创建编译基础环境
docker run -it -v D:\soft\docker\openjdksrc:/home/openjdksrc --name BuildOpenJDK11 Ubuntu:20.04
PS:
- -v A:B 参数,将宿主机的目录 A 映射到容器的目录 B
- 命令中的D:\soft\docker\openjdksrc就是之前创建好OpenJDK11源码的存放目录;
创建好容器后,一般是直接进入容器内部了,如果没有,则执行以下命令进入容器
docker exec -it BuildOpenJDK11 /bin/bash
先安装Git
apt install -y git
再安装OpenJDK11作为编译的引导版本
apt install -y openjdk-11-jdk
安装完毕后,查看版本
![](https://img.haomeiwen.com/i12972541/2b6058486b755a4c.png)
三、下载OpenJDK11源码
由于编译JDK 需要一个版本号至少为N - 1的JDK做引导,由上步可以看出,已发布的openjdk-11的小版本是 22;
为确保成功率,取最小版本差,故clone OpenJDK11 的小版本23作为编译对象;
git clone -branch jdk-11+23 --single-branch https://github.com/openjdk/jdk11.git
几分钟后,即可完成,完成后,目录下会多出一个jdk11的源码目录。
PS:为什么没有按照文档里的 hg clone下载,因为Git用习惯了,比较熟悉,而且用Git从github上下载,应该快不少。
四、按需调整OpenJDK11源码
接下来是您根据自己的需要去修改OpenJDK源码,我这里只作个简单的修改,目标是 打印java版本(Java -version)时,多打印一句"Build By Yufenfen!"
目标文件位于以下位置:
jdk11/src/java.base/share/classes/java/lang/VersionProps.java.template
用 Notepad++ 打开此文件,拉倒文件的尾部,在方法 private static void print(boolean err, boolean newln) 的最后面添加一行代码
ps.println("Build By Yufenfen!");
![](https://img.haomeiwen.com/i12972541/6de23cd03f2a5921.png)
保存退出文件。
四、编译JDK11
安装相关依赖
由于在编译过程中,会提示各种依赖缺失,故预先安装相关依赖
apt install -y build-essential libfreetype6-dev libcups2-dev libx11-dev libxext-dev libxrender-dev libxrandr-dev libxtst-dev libxt-dev libasound2-dev libffi-dev libfontconfig1-dev autoconf
apt install -y file diffutils pigz coreutils tar gawk cpio zip unzip
配置编译参数
进入jdk 源码目录,设置configure执行权限
cd jdk11
chmod +x configure
configure编译参数
# 这几个参数意义: 指定编译64位虚拟机器、编译级别、关闭警告当错误处理(这里尤其重要)
bash ./configure --with-target-bits=64 --with-debug-level=slowdebug --disable-warnings-as-errors
静等十秒左右,就可看到如下成果提示
![](https://img.haomeiwen.com/i12972541/220af6b63435cbb8.png)
编译OpenJDK11源码
Run make
make images
耐心等待,make完成,如果看到下面提示,则说明编译成功;
![](https://img.haomeiwen.com/i12972541/79c9f41609d90f6c.png)
五、验证新的JDK
- 进入目录build/linux-x86_64-normal-server-slowdebug/jdk/bin;
- 执行命令./java -version,可以看到下图信息,红框中就是我们修改的效果:
![](https://img.haomeiwen.com/i12972541/0b75994860d61f54.png)
至此,OpenJDK11源码的下载、修改、编译就这么完成了,是不是很简单呢?
如果您对这方面感兴趣,请关注我的文集:JVM ,后续会写更多JVM的实战经验。
网友评论