自己编译JDK(centos7)
学习了周志明老师的《深入理解Java虚拟机》,跟着课本来自己编译一下JDK。
如下,下载官网源码包:openjdk7源码官网地址
本文环境:centos7初始化安装、默认openjdk1.8(centos7自带的jdk,openjdk很多代码是java实现的,故需要此jdk,官方称之为Bootstrap jdk,这里试验了一下,下面报错了,最后还是下载换回了jdk1.7的)。
需要安装的工具,如下:
#openjdk编译工具
yum install build-essential gawk m4 openjdk-6-jdk libasound2-dev libcups2-dev libxrender-dev xorg-dev xutils-dev xllproto-print-dev binutils libmotif3 libmotif-dev ant
#gcc编译工具
yum install gcc-c++ libstdc++-devel
#加入这个工具,否则编译过程报错
yum install libstdc++-static
新建一个文件openjdk.env,设置如下图环境变量:
#语言选项,这个必须设置,否则编译结束前的验证阶段会出现一个HashTable的NPE异常
export LANG=C
#Bootstrap JDK地址,这里建议先下载jdk1.7作为bootstrap jdk,否则接下来的编译会报错,/root/jdk1.7.0_80
export ALT_BOOTDIR=/usr/lib/jvm/java-1.8.0
#允许自动下载依赖
export ALLOW_DOWNLOADS=true
#并行编译的线程数,设置为与CPU内核数量一致即可
export HOTSPOT_BUILD_JOBS=4
export ALT_PARALLEL_COMPILE_JOBS=4
#比较本次build出来的映像与先去版本的差异,这对我们没有意义
export SKIP_COMPARE_IMAGES=true
#使用预编译头文件,不加这个编译会慢一些
export USE_PRECOMPILED_HEADER=true
#要编译的内容
export BUILD_LANGTOOLS=true
export BUILD_HOTSPOT=true
export BUILD_JDK=true
#设置为false可以避开javaws和浏览器java插件之类的部分的build
BUILD_DEPLOY=false
#把它设置为false就不会build出安装包
BUILD_INSTALL=false
#编译结果存放的路径
export ALT_OUTPUTDIR=/root/buildopenjdk
#这两个环境变量必须去掉,不然会发生很诡异的事情
unset JAVA_HOME
unset CLASSPATH
环境变量
编写环境变量完成,执行source启用设置变量。同时make sanity检查
#启用变量
source ./openjdk.env
#检查环境变量是否设置完成,需要cd到openjdk源码目录
make sanity
报错,软件未安装完全。
报错
输入如下命令安装
#安装软件解决报错
yum install alsa-lib-devel cups-devel.x86_64 freetype-devel
检查通过
行,接下来直接make
make
换了一种报错方式,Class Resolve.InapplicableSymbolsError.Candidate overrides equals,google了报错原因,是因为本环境的bootstrap jdk用的是1.8版本的,换一个jdk即可,编辑刚才的openjdk.env,把bootstrap jdk换为1.7版本的,不必卸载原来的openjdk1.8
bootstrap jdk版本过高报错
下载jdk1.7并解压,把openjdk.env的ALT_BOOTDIR换成解压后的jdk目录,如下,并重新source ./openjdk.env启用环境变量。
修改Bootstrap jdk
编译了18分钟左右,报了如下错ERROR: Cannot chcon libjvm.so,原因是gcc没安装全,使用yum install libstdc++-static安装,然后make clean、make sanity、make即可,我已经把这条命令写道上面的gcc编译工具那里,你应该就不会报这个错了。
gcc没安装全
继续编译报了一个错Error: time is more than 10 years from present: 1136059200000,超过10年
超过10年报错
解决方案是:修改openjdk//jdk/src/share/classes/java/util/CurrencyData.properties,将其中表示年份的地方都改为距离今年不超过10年的年份:
修改108行 AZ=AZM;2015-12-31-20-00-00;AZN
修改381行 MZ=MZM;2015-06-30-22-00-00;MZN
修改443行 RO=ROL;2015-06-30-21-00-00;RON
修改535行 TR=TRL;2015-12-31-22-00-00;TRY
修改561行 VE=VEB;2015-01-01-04-00-00;VEF
继续编译,报错如下../../../src/solaris/native/sun/awt/awt.h:38:27: fatal error: X11/Intrinsic.h: No such file or directory
include <X11/Intrinsic.h>
头文件解决方案是,查看头文件在哪个库,安装即可,如下命令
#查找头文件在那个库
yum provides '*/Intrinsic.h'
#安装该库
yum install libXt-devel-1.1.5-3.el7.x86_64 libXext-devel-1.3.3-3.el7.x86_64 libXrender-devel-0.9.10-1.el7.x86_64 libXtst-devel-1.2.3-1.el7.x86_64
继续编译,又报了fatal error: X11/extensions/shape.h: No such file or directory
include <X11/extensions/shape.h>这个头文件的错,按上面方法解决即可,命令添加在上面了。你应该不会报这个错误。
继续编译,成功了。
编译成功
参考链接
《深入理解Java虚拟机(第2版)》
编译过程,问题解决中,有一篇掘金社区作者zanwensicheng的文章和自己遇到的问题很像,可以参考一下