折腾了2天,终于在ubuntu上编译hotspot成功了,中间踩了好多坑,资料也不好找啊,还是得跟书上和博客上的各种配置保持一致比较好,稍微有点不一样的地方,也许就是个坑!
环境变量配置如下,各个参数的含义网上也都有,就不列举了。
export LANG=C
export ALT_BOOTDIR=/home/lumingfeng/Downloads/jdk1.6.0_45
export ALT_JDK_IMPORT_PATH=/home/lumingfeng/Downloads/jdk1.6.0_45
export ALLOW_DOWNLOADS=true
export HOST_BUILD_JOBS=4
export USE_PRECOMPILED_HEADER=true
export BUILD_LANGTOOLS=true
export BUILD_JAXP=true
export BUILD_JAXWS=true
export BUILD_CORBA=true
export BUILD_HOTSPOT=true
export BUILD_JDK=true
export BUILD_INSTALL=false
export ALT_OUTPUTDIR=/home/lumingfeng/openjdk/build
unset JAVA_HOME
unset CLASSPATH
export WARNINGS_ARE_ERRORS=false
export SKIP_DEBUG_BUILD=false
export SKIP_FASTDEBUG_BUILD=true
export DEBUG_NAME=debug
最终结果:
参考书籍:《深入理解Java虚拟机》
1:编译的是JDK8
手头上正好有一个openjdk8的源码,就想着用jdk8吧,不用麻烦再去下载一次openjdk7的源码。然后按照书上面的教程一个个变量都设置好之后,坑来了:
输入make sanity,提示no rule to make sanity
为啥博客和书上都没写这种情况呢。。。查资料好久也没发现问题是啥。最后看到书上一句话:“建议读者认真阅读源码中的README-builds.html”,抱着死马当活马医的心态,打开jdk8中的这个文件,看了一下make的用法,确实是没有make sanity这种用法。。。
好吧,那我就直接输入make了。结果运行到一半,又提示
No configurations found for /home/lumingfeng/openjdk/! Please run configure
这个又是什么鬼!看了一下我的配置,和这个有关系的应该就是ALT_OUTPUTDIR的值。再仔细看看readme,看到有一句
bash ./configure
不管三七二十一,直接输入再说吧。这回再make就好了。等了一会,提示操作系统不支持。噢,这个问题在博客上看到过,注释掉对操作系统的检查就好了。gedit打开hotspot/make/linux/Makefile,注释掉(#用作注释)
2:操作系统的检查
check_os_version:
#ifeq ($(DISABLE_HOTSPOT_OS_VERSION_CHECK)$(EMPTY_IF_NOT_SUPPORTED),)
# $(QUIETLY) >&2 echo "*** This OS is not supported:" `uname -a`; exit 1;
#endif
3:内存不足
在编译了十几分钟后,又提示内存不足。。。怪我只给虚拟机分配了1G内存。改成2G后,再一次进行make操作。这一次终于编译完成了。累的啊。
好,接下来,按书上,应该是下载netbeans然后配置了。下载了8.1的,然后启动后配置环境的时候,发现为什么我编译出来的文件目录又不一样,不是这缺个文件,就是那缺个目录,也没有jvmg。为什么他们都有呢。。想想,算了,将就着用吧。后面还有不一样的配置。。。我还没意识到是编译的jdk不一样导致的。。
今天起来继续编译,看到一篇博客上给了openjdk7的一个下载链接,抱着试试的想法就下载下来进行编译,不要原先的jdk8了。
首先看了一下readme.html,哎这个版本有make sanity的用法。。然后又把上面的环境变量改成编译jdk7的开始编译。又开始提示了JAVA_HOME没有设置,NO_BOOTDIR啊,唉,怎么这么多问题。我明明设置了ALT_BOOTDIR啊。一开始设置的ALT_BOOOTDIR的目录是jdk7的目录,具体这个jdk的作用就不说了。用make sanity也没有毛病,书上也说make sanity通过后,make就没啥问题了。为什么到我这还有一堆问题呢。
试着看了make sanity的输出结果,发现在最上面的Bootstrap setting里面,明确写了找不到ALT_BOOTDIR目录。难道是因为我把命令写在脚本里面运行的原因?那我只能一行行输入一次了。这回make sanity输出结果正常了。然后忐忑的输入make,等待结果。在最后,又踩坑了
4:hashtable的空指针
Error occurred during initialization of VM 然后下面是一个hashtable的空指针
哎,看到这个我很开心,因为这个问题书上写了,说要设置LANG=C,否则在最后的验证阶段会抛出一个hashtable的空指针异常。难道是我的LANG没设置正确?我试着输入了3次
export LANG=C
然后再执行make,还是一样的结果。
哎,为什么我编译一个这么多问题。最后,试着把ALT_BOOTDIR设置成jdk1.6的,结果又遇到其他问题了:
5:时间问题
Error: time is more than 10 years from present: 1136059200000
一搜,哎这个问题好像有答案,貌似是把我们要编译的jdk7里面的CurrencyData.properties里面的时间都改成10年内就好了,用find 命令找到这个文件的地址,然后将时间从2004年啊,2005年啊都改成2008年。
再运行一次make。这回终于成功了,等的我花都谢了,果然还是得跟教程上的配置都保持一致啊。。。
最终的配置版本:
ubuntu:14.04
编译的jdk:openjdk-7u40【注意最好是保持一致,避免踩各种坑】
自举jdk:jdk1.6【和上面一样的建议】