一直想看看jvm的庐山真面目。就自己编译了一遍openjdk,期间遇到很多错误,参考了很多篇博文,一把辛酸泪。我几乎把jdk6以上的jdk都下了一遍。用jdk6编jdk7,jdk7编jdk8..........无奈都失败了。主要是刚开始,对Makefile编译不熟,遇到bug就乱了阵脚。经过几次失败后,又学了一些相关编译方面的知识后,终于看懂了编译的报错信息,并且做相应修改,能解决相关的编译bug。最终成功了。
下面就一步一步的记录下我的编译jdk的辛酸路程吧!
操作系统: centos (linux操作系统下)
bootstrapJDK: orcle公司的 jdk7
targetJDK: openjdk7
工具:xshell和xftp
备注:我是在window下安装的虚拟机,并在虚拟机上装的centos7.0系统,bootstrapJDK和targetJDK,VMware虚拟机以及centos镜像文件我放在了我的网盘里,里面还有我编译好的jdk
链接:https://pan.baidu.com/s/1Ogv-JEQjb8Qq2asAwUZedQ
提取码:b6t9
yum install zip unzip ant alsa-lib-devel cups-devel libX* gcc gcc-c++ freetype-devel libstdc++-static make
3.1可以通过 vi /etc/profile 在里面添加
unset JAVA_HOME
unset CLASS_PATH
3.2也可以 rm -rf /usr/lmj/jvm/openjdk8
3.3总之:输入java 一定到出现no command java 才行 ,因为在后面我们会通过build.sh来指定bootstrapJDK
通过vim 编辑 build.sh
export LANG=C
export ALT_BOOTDIR=/usr/lmj/jdk1.7.0
export ALT_JDK_IMPORT_PATH=/usr/lmj/jdk1.7.0
export ALLOW_DOWNLOADS=true
export HOTSPOT_BUILD_JOBS=4
export ALT_PARALLEL_COMPILE_JOBS=4
export SKIP_COMPARE_IMAGES=true
export USE_PRECOMPILED_HEADER=true
export BUILD_LANGTOOLS=true
#export BUILD_JAXP=false
export BUILD_JAXWS=false
#export BUILD_CORBA=false
export BUILD_HOTSPOT=true
export BUILD_JDK=true
export DISABLE_HOTSPOT_OS_VERSION_CHECK=ok
export SKIP_DEBUG_BUILD=false
export SKIP_FASTDEBUG_BUILD=true
export DEBUG_NAME=debug
BUILD_DEPLOY=false
BUILD_INSTALL=false
export ALT_OUTPUTDIR=/usr/lmj/openjdk7/openjdk/build
unset JAVA_HOME
unset CLASSPATH
make sanity
make sanity && make 2>&1 | tee $ALT_OUTPUTDIR/build.log
export ALT_BOOTDIR=/usr/lmj/jdk1.7.0 -----------------你自己的bootstrapJDK路径
export ALT_JDK_IMPORT_PATH=/usr/lmj/jdk1.7.0 -----------------你自己的bootstrapJDK路径
创建文件:
export ALT_OUTPUTDIR=/usr/lmj/openjdk7/openjdk/build -----------------指定编译好的jdk的存放路径
make sanity && make 2>&1 | tee $ALT_OUTPUTDIR/build.log ------------指定编译jdk时的日志的存放路径
进入到openjdk目录:运行开始编译:
1.
cannot open /usr/lmj/openjdk7/openjdk/!
可能是build.sh里面的java环境变量配置的不对,检查build.sh的配置
还可能是没有禁用java环境变量。
2.
cc1plus: all warnings being treated as errors
这个错误应该都会遇到的吧,应为openjdk的编译在配置的加上了-Werror ,该参数含义是遇到警告就停止编译,但实际编译会遇到很多警告,那怎么行呢,所以必须干掉他。先看Makefile里面有没有改参数,有则注释掉,然后干掉gcc.make里面的参数:如果不注释,/usr/lmj/openjdk7/openjdk/hotspot/src/share/vm/runtime/interfaceSupport.hpp文件里面里就会报重复定义类,已经定义过类的错误(refinition of 'class RuntimeHistogramElement')。当然你可以不干掉参数。自己手动修复每一个warning
(不建议这样干,后面会有无数的warning等着你,会疯掉的)
这是hotspot针对不同平台的编译配置,如果是在window下,就干掉window里面的就可以了(我的是linux的)
3.
unzip: cannot find or open /usr/lmj/openjdk7/openjdk/build-debug/corba/dist/lib/src.zip
安装zip和unzip就可以了 -------------------------------yum install zip unzip
4.
gcc: error: unrecognized command line option '-mimpure-text'
gcc版本问题,这个命令在版本的gcc中已经去除,既然不能降低gcc版本,那 我们就干掉-mimpure-text 该参数
5.
time is more than 10 years from present: 1136059200000
现在的时间超过了预定时间的10年期限。将CurrencyData.properties中的时间都换成最新的当前时间即可
大约等个10~20分钟就编译完成了
后续就可以开始代码调试jdk了