【原创】利用Docker快速编译OpenJDK8

想深入学习JVM却一直卡在编译JDK上?本文帮你快速搞定!

概述

编译openjdk的文章,网上是一抓一大把,但一来需要安装linux系统,二来可能因为操作系统版本的差异,网上的教程无法覆盖导致中途卡壳。本文通过docker镜像,可以一键拉起一个可以编译openjdk的环境。接下来我会逐步给出教程,来展示这一过程。同时本文并不会涉及以下几点内容的讲解。

  1. docker的基本概念以及基本操作
  2. bash脚本的编写,sed命令的使用
  3. 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)
posted @ 2022-11-23 16:38  textworld  阅读(1292)  评论(0)    收藏  举报