在 docker 上编译 openjdk8
欢迎访问我的 GitHub
这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos
本篇概览
以前曾经试过在 VMware 上安装 linux,再在 linux 上编译 openjdk8,但是每次都不顺利,例如 linux 环境,预装依赖软件,openjdk 源码的选择等环境都会遇到问题,一旦失败再重新开始挺费时间的,现在用 docker 就省事多了,镜像和容器的创建和删除都比较简单干净,专心做好 Dockerfile 就行,下面我们一起来实践一下吧。
本次实战用到的所有文件,已经打包到 github 上,路径是 git@github.com:zq2599/centos7_build_openjdk8.git,欢迎您来使用(git clone git@github.com:zq2599/centos7_build_openjdk8.git)
本次编译实战的基本步骤如下:
写的 Dockerfile 中要做的如下的事情:
安装依赖的软件;
把 openjdk 的源码复制到镜像中;
在编写 Dockerfile 之前要做三个重要的选择,如下:
linux:我选择了 centos7,之前试过 ubuntu16.04,但是在 configure 的时候提示"freetype"没有安装,我按照提示去装了,再次 configure 的时候继续提示"freetype"没有安装......(此问题现在还没解决,如果您解决过相同问题,请您告诉一下解决方法,谢谢了!)
openjdk 源码,这次要编译的是 openjdk8,源码的下载地址在这里
Bootstrap JDK:即编译时要用到的 JDK,下载了 openjdk 的源码后,解压开可以看到“README-builds.html”这个文件,里面有对 Bootstrap JDK 的描述:
看得出,需要安装 jdk7 来编译 openjdk8 的源码;
OK,关键问题都已确认,即将开始 Dockerfile 制作,不过制作之前还有个小问题需要先想好:本次我打算把制作镜像所需的 Dockerfile 和依赖文件都放到 github 上去,这样做的好处有两个:
读者们从 git 上 clone 下来之后直接执行 Docker build 就能在本地构建镜像;
daocloud.io 网站上支持通过执行 github 目录的方式在线构建镜像,后面我们会实践在 daocloud.io 上构建镜像并部署到腾讯云或者阿里云服务器上;
上传到 github 时,除了 Dockerfile,还要上传的文件有两个:jdk1.7 和 openjdk8 源码,都超过了 100M,如下图:
这就麻烦了,github 上传文件的时候,单个文件不能超过 100M,否则 push 的时候会被服务器拒绝,解决这个问题有两个办法:
构建镜像的时候不要把这两个文件复制到镜像中了,改为在 Dockerfile 中通过执行 wget 命令将这两个文件分别下载到镜像中,openjdk 的下载路径是 http://www.java.net/download/openjdk/jdk8/promoted/b132/openjdk-8-src-b132-03_mar_2014.zip,而 jdk1.7 的下载路径就难办了,oracle 上下载历史版本的时候,是要做登录操作的,这个在 Dockerfile 中难以实现,找到了一个下载地址 https://mirror.its.sfu.ca/mirror/CentOS-Third-Party/NSG/common/x86_64/jdk-7u80-linux-x64.rpm,但是下载速度很慢,最少一个小时以上了,所以 wget 这种方法看似简单,但下载文件耗时实在太长;
第二种方法比较简单易用,就是在 mac 或者 linux 上先用 split 命令将文件分割成多个,再上传到 github 上,在 Dockerfile 中有对应的命令将分割后的文件恢复成分割前的原文件,具体的分割命令如下:
这个命令是将 jdk-7u71-linux-x64.rpm 分割成不超过 50m 的多个文件,分割后的文件以 jdkrpm-作为文件名的前缀,如下图:
pensdk 的源码用如下命令分割:
Dockerfile 中,从分割文件恢复以上两个原文件的命令为:
以上就是两种处理大文件的方法,本文用的是第二种,即先分割上传到 git,在 Dockerfile 中将已分割文件恢复成原文件再使用。
好了,前期的准备工作已经做完了,现在可以编写 Dockerfile 文件了,整个文件中要做的事情列出如下:
安装依赖软件,例如 libXtst-devel,libXt-devel 等等,这些都是编译前的 configure 命令要检查的,检查不过无法进行编译;
把分割后的 openjdk 源码复制到镜像文件中,再合成,再解压;
安装 jdk7,把分割后的安装文件复制到镜像中合成,然后安装;
为了方便用户进入容器后快速开始编译,我们做了一个 shell 脚本 start_make.sh,把这个脚本也要复制到镜像中,内容如下:
清理无用的文件,例如 openjdk 源码的压缩文件,jdk7 的安装文件等;
按照以上步骤,最终写出的 Dockerfile 文件如下:
至此,镜像文件制作所需的材料都已经齐全了,如下图:
在让我们开始制作镜像吧,打开终端,进入 Dockerfile 所在目录,执行命令
因为要在线安装不少的软件,所以可能耗时会略长,和网络带宽有关,我在住处用家庭网络大概 10 分钟左右构建成功,执行目录 docker images 查看镜像,新的镜像文件已经生成了,如下图:
在启动一个容器试试吧:
容器已经启动,再执行以下命令进入容器:
进去后,直接到/usr/local/openjdk 目录下,执行./start_make.sh,开始编译了,整个过程的耗时和当前电脑的硬件配置有关,我用 i7 处理器的 mac pro15 大约要用 20 多分钟,编译结束后会有类似下图的输出:
这时候去/usr/local/openjdk 目录下看看,发现多了一个 build 目录,这里面就是编译好的结果,如下图:
uild 目录下只有一个 linux-x86_64-normal-server-release 目录,再进去就能看到 jdk 目录了,如下图:
入/usr/local/openjdk/build/linux-x86_64-normal-server-release/jdk/bin 目录,会发现里面有 java 文件,执行./java -version 输出如下:
的 jdk 信息已经打印出来了,OpenJDK Runtime Enviroment 信息已经说明了这是个最新构建的 jdk 环境。
至此我们的本次实战就结束了,面对如此干净的编译环境和现成的源码,读者您是否有一种改动一番源码的冲动,然后构建一个个性化的属于自己的 jdk,如果有兴趣,敬请期待下一次实战,我们一起分析,修改和调试 openjdk 源码,打造一些个性化的小东东。
欢迎关注 InfoQ:程序员欣宸
版权声明: 本文为 InfoQ 作者【程序员欣宸】的原创文章。
原文链接:【http://xie.infoq.cn/article/e3698049581264f1f485ffe04】。文章转载请联系作者。
评论