在学习《深入理解Java虚拟机-JVM高级特性与最佳实践》一本书的时候,发现按照书上作者的步骤编译jdk时,总会出现各种问题,主要原因如下
1.作者采用的Ubuntu 10.10 版本的linux,和大多数读者使用的centos版本linux 命令不一样,例如 apt-get 命令
2.作者省略了一些步骤,尽管这些步骤对了解这方面的人来说不值得一提,但对小白来说还是比较重要的,例如我就经常搞不清作者在哪个目录,执行了什么操作
3.作者给出下载openJDK的链接无法打开(时间久远网站不可用或者被墙了)
4.编译时报的错误不是很明显,经常百度半天没有找到解决方案或解决方案不奏效
经过一天的尝试,终于编译好了自己的jdk(报各错误搞得我很焦灼啊),现记录下来,防止自己忘记,也给大家做一个参考。
一、环境
操作系统:linux CentOS 7.4 64位(刚重装完的,防止少记录编译前的工作,哈哈)
使用jdk:jdk7
计划编译的jdk:OpenJDK7
二、准备工作
1.安装编译用到的工具
yum install -y mercurial yum install -y ant ant-nodeps yum install -y libX11* libX* yum install -y libXi-devel libXtst-devel libXt-devel freetype* yum install -y alsa-lib-devel cups-devel yum install -y gcc gcc-c++ yum install -y glibc-static libstdc++-static
2.准备jdk
检查是否安装了jdk,如果安装了先卸载掉,然后下载oracle jdk7 安装到/opt/java/jdk1.7.0_80(方法很简单,使用的jdk和要编译的jdk版本不要相差太多,否则会有奇怪的错误,jdk部分源码是java编写的,在编译jdk时会用到。注意:解压完成不要设置classpass,javahome 环境变量)
下载openjdk7 解压到/mayiwen/ (这个目录自己随便指定,看个人喜好),因为无法开发作者给出的网站,这里我找到一个不错的网站,可以使用如下代码下载jdk源码
mkdir /mayiwen cd /mayiwen hg clone http://hg.openjdk.java.net/jdk7u/jdk7u-dev cd jdk7u-dev chmod 755 get_source.sh ./get_source.sh
等待5分钟左右,出现如下图片则下载openjdk完成
三、开始编译
1.设置环境变量,其中LANG 和ALT_BOOTDIR 两个环境变量必须设置,其他可以不必设置
#设置环境语言,不设置会报一个hashtable NPE错误 export LANG=C #Bootstrap JDK的安装路径,必须设置 export ALT_BOOTDIR=/opt/java/jdk1.7.0_80 #允许自动下载依赖 export ALLOW_DOWNLOADS=true #并行编译的线数,设置和cpu的数量一致即可 export HOTSPOT_BUILD_JOBS=1 export ALT_PATALLER_COMPILE_JOBS=1 #比较本次build出来的映像与先前版本的差异,这对我们来说没有意义, export SKIP_COMPARE_IMAGES=true #使用预编译头文件,不加这个编译会更慢一些 export USE_PRECOMPILED_HEADER=true #指定要编译的内容 export BUILD_LANGTOOLS=true export BUILD_HOTSPOT=true export BUILD_JDK=true export BUILD_JAXP=true export BUILD_JAXWS=true export BUILD_CORBA=true #要编译的版本 #export SKIP_DEBUG_BUILD=false #export SKIP_FASTDEBUG_BUILD=true #export DEBUG_NAME=debug #可以避开javaws和浏览器Java插件之类的部分build BUILD_DEPLOY=false #设置成false就不会build出包装包,因为包装包里有些奇怪的依赖 #但是即使不build出它也已经能得到完整的JDK映像,所以还是别build它好了 BUILD_INSTALL=false #编译结果存放的路径 export ALT_OUTPUTDIR=/mayiwen/jdk7u #卸载环境变量,避免诡异的事情发生 unset JAVA_HOME unset CLASSPATH unset JAVA_OPTS #make 2>&1 | tee $ALT_OUTPUTDIR/build.log
可以不用一个一个执行,我是建了一个shell脚本,然后执行,环境变量就设置成功啦,代码如下
cd /mayiwen vim ready #将上面一大段代码复制到这里,保存 chmod 755 ready . ready
2.执行编译检查
cd /mayiwen/jdk7u-dev/ make sanity
出现如下结果代表检查通过
3.编译(我是1核2G的机器,大概需要30多分钟,耐心等待ing...)
make all
四、运行测试
在输出目录/mayiwen/jdk7u/j2sdk-image下就是编译好的jdk啦,可以把它放在JAVA_HOME指定的目录下作为完整的jdk使用。
在输出目录/mayiwen/jdk7u/hotspot/outputdir/linux_amd64_compiler2/下是编译好的hotspot源码,此时还需要在/mayiwen/jdk7u/hotspot/outputdir/linux_amd64_compiler2/jvmg下的env.sh文件中添加如下代码,才可以运行
LD_LIBRARY_PATH=.:${JAVA_HOME}/jre/lib/amd64/native_threads:${JAVA_HOME}/jre/lib/amd64: export LD_LIBRARY_PATH
测试一下,
. ./env.sh ./test_gamma
如果输出了一大堆如下代码 说明搭建成功了,此结果是(八皇后问题的解),也可以输入./gamma -version 查看虚拟机的版本信息
到此,jdk和hotspot已经编译成功,如果有报错可以留言,大家一起讨论。接下来就是用ide来调试源码,按照书中的操作方法,暂时还没有试验成功,等成功后再与大家分享