浅色年华的gravatar头像
浅色年华 2018-04-24 21:24:01
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完成

linux CentOS 7.4 64位编译openjdk7和hotspot虚拟机指南

三、开始编译

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

出现如下结果代表检查通过

linux CentOS 7.4 64位编译openjdk7和hotspot虚拟机指南

3.编译(我是1核2G的机器,大概需要30多分钟,耐心等待ing...)

make all

linux CentOS 7.4 64位编译openjdk7和hotspot虚拟机指南

四、运行测试

在输出目录/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 查看虚拟机的版本信息

linux CentOS 7.4 64位编译openjdk7和hotspot虚拟机指南

linux CentOS 7.4 64位编译openjdk7和hotspot虚拟机指南

到此,jdk和hotspot已经编译成功,如果有报错可以留言,大家一起讨论。接下来就是用ide来调试源码,按照书中的操作方法,暂时还没有试验成功,等成功后再与大家分享frown


打赏

已有1人打赏

最代码官方的gravatar头像
最近浏览
teslamask  LV1 2020年7月11日
jiemaoxue  LV1 2019年3月4日
lu人甲 2019年2月19日
暂无贡献等级
786153747  LV2 2018年6月27日
Space  LV29 2018年6月21日
3066244380  LV2 2018年6月15日
热瓦糖果色啊  LV4 2018年5月22日
ginfao  LV3 2018年5月21日
liu001  LV13 2018年5月16日
烟锁池塘柳  LV6 2018年5月14日
顶部 客服 微信二维码 底部
>扫描二维码关注最代码为好友扫描二维码关注最代码为好友