【原创】利用Docker快速编译OpenJDK8
想深入学习JVM却一直卡在编译JDK上?本文帮你快速搞定!
概述
编译openjdk的文章,网上是一抓一大把,但一来需要安装linux系统,二来可能因为操作系统版本的差异,网上的教程无法覆盖导致中途卡壳。本文通过docker镜像,可以一键拉起一个可以编译openjdk的环境。接下来我会逐步给出教程,来展示这一过程。同时本文并不会涉及以下几点内容的讲解。
- docker的基本概念以及基本操作
- bash脚本的编写,sed命令的使用
- Mercurial的安装
源码下载
首先下载openjdk8的源码,下载地址(github地址) https://github.com/keerath/openjdk-8-source 。这一步骤就是由以下两个命令组成
hg clone http://hg.openjdk.java.net/jdk8/jdk8 openjdk8
cd openjdk8 && sh ./get_source.sh
完成这一步以后,将目录openjdk8打包成zip包,命名为openjdk8.zip
目录准备
新建一个新文件夹,将openjdk8.zip放入目录中。新建一个文件start.sh,内容如下
#!/bin/bash
cd /opt/
if [ ! -d "/opt/openjdk8" ];then
unzip openjdk8.zip
fi
cd /opt/openjdk8
sed -i "s@SUPPORTED_OS_VERSION = .*@SUPPORTED_OS_VERSION = 2.4% 2.5% 2.6% 3% 5%@g" hotspot/make/linux/Makefile
sed -r -i "s@-cp (\"\\$\\(NASHORN_OUTPUTDIR\\)/nasgen_classes\\$\\(PATH_SEP\\)\\$\\(NASHORN_OUTPUTDIR\\)/nashorn_classes\")@-Xbootclasspath/p:\1@g" nashorn/make/BuildNashorn.gmk
sed -i -r '67s@s/ -\\\(\[\^\s+\](.*)@s/ -\([^ I]\1@g' hotspot/make/linux/makefiles/adjust-mflags.sh
make clean
bash ./configure --enable-debug --with-jvm-variants=server --with-extra-cflags=-Wno-error --with-freetype-include=/usr/include/freetype2 --with-freetype-lib=/usr/lib/x86_64-linux-gnu
make images
再新建一个文件,命名为Dockerfile,内容如下
FROM ubuntu:18.04
RUN sed -i s@/archive.ubuntu.com/@/mirrors.aliyun.com/@g /etc/apt/sources.list
RUN apt-get update -y \
&& apt install -y openjdk-8-jdk libx11-dev libxext-dev libxrender-dev libxrandr-dev libxt-dev libxtst-dev \
&& apt install -y libfreetype6-dev build-essential cpio libcups2-dev libasound2-dev ccache \
&& apt install -y gcc-4.8 g++-4.8 make zip vim \
&& apt-get autoclean \
&& rm -rf /var/lib/apt/lists/*
RUN rm /usr/bin/gcc && rm /usr/bin/g++ && ln -s /usr/bin/gcc-4.8 /usr/bin/gcc && ln -s /usr/bin/g++-4.8 /usr/bin/g++
COPY openjdk8.zip start.sh /opt/
开始编译
准备好上面两个文件以后,我们打包成一个docker镜像,然后运行打包好的镜像
docker build -t ubuntu_jvm_build:0.0.1 .
docker run -it --rm --cpus=3 ubuntu_jvm_build:0.0.1 bash
root@59fe92eab89a:~# sh /opt/start.sh
然后就静静等待结果即可
验证结果
编译好的openjdk放置在build目录下面,执行以下的命令如果成功的话,说明编译成功。
root@59fe92eab89a:/opt/openjdk8# ./build/linux-x86_64-normal-server-fastdebug/jdk/bin/java -version
openjdk version "1.8.0-internal-fastdebug"
OpenJDK Runtime Environment (build 1.8.0-internal-fastdebug-_2022_11_12_01_04-b00)
OpenJDK 64-Bit Server VM (build 25.0-b70-fastdebug, mixed mode)
浙公网安备 33010602011771号