转自:http://www.zuidaima.com/blog/3862384921103360.htm
linux CentOS 7.4 64位编译openjdk7和hotspot虚拟机指南
在学习《深入理解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已经编译成功。