首先楼主是在CentOS 6.5的版本进行编译的 其它版本会有些差异 建议使用CentOS编译的进行参考
1.安装mercurial
先更新list
sudo yum update
安装mercurial
sudo yum install mercurial
验证安装成功 hg命令显示帮助信息
hg
2.下载OpenJDK源码
hg clone http://hg.openjdk.java.net/jdk7u/jdk7u-dev/
cd jdk7u-dev
chmod 755 get_source.sh
./get_source.sh
当执行./get_source.sh脚本 每个文件夹都提示exit code 0时才成功 此过程在楼主的电脑上大概十分钟才完成 因为要下载的东西比较多 建议多等一会儿 如有不成功 多执行几次./get_source.sh 如果不成功也可以去直接下载官方打包好的源码包(地址:http://jdk7.java.net/source.html) 解压到linux中即可 注意下路径还有版本 我这里编译的是jdk7 其它版本会有差异
3.安装gcc g++
sudo yum install gcc-c++ libstdc+±devel
4.安装ant 1.7以上
sudo yum install ant
5.安装alsa
sudo yum install alsa*
6.安装Cups
sudo yum install cups-devel.x86_64
7.解决FreeType 字体错误
sudo yum install freetype.x86_64 freetype-devel.x86_64
8.安装jdk6作为Bootstrap JDK
注意版本 楼主试了很多版本 下面这个版本是可以的 如果后续有错误 建议多试试几个版本
sudo yum install java-1.6.0-openjdk*
9.设置环境变量
书中说道 必须设置的只有两个:LANG和ALT_BOOTDIR,前者是设定语言选项,必须设置为:
export LANG=C
否则 在编译结束前的验证阶段会出现一个HashTable内的空指针异常 另外一个ALT_BOOTDIR参数是前面提到的Bootstrap JDK
export ALT_BOOTDIR=/usr/lib/jvm/java-1.6.0-openjdk.x86_64
按照自己的路径修改
另外 如果读者之前设置了JAVA_HOME和CLASSPATH两个环境变量 在编译之前必须取消 否则在Makefile脚本中检查到有这两个变量存在 会有警告提示
unset JAVA_HOME
unset CLASSPATH
全部设置结束之后,可以输入make sanity来检查我们前面所做的设置是否全部正确
make sanity
如果看到“Sanity check passed.”输出 说明检查通过了 接下来就可以输入make进行编译了 如果不设置输出目录 默认输出在./build目录里面 过程比较慢 耐心等待吧
编译完成之后 进入OpenJDK源码下的build/j2sdk-image目录(或者build-debug、buildfastdebug这两个目录) 这是整个JDK的完整编译结果 复制到JAVA_HOME目录,就可以作为一个完整的JDK使用 编译出来的虚拟机 在-version命令中带有用户的机器名
以下是书中的配置清单 供参考
#语言选项,这个必须设置,否则编译好后会出现一个HashTable的NPE错
export LANG=C
#Bootstrap JDK的安装路径。必须设置。
export ALT_BOOTDIR=/Library/Java/JavaVirtualMachines/jdk1.7.0_04.jdk/Contents/Home
#允许自动下载依赖
export ALLOW_DOWNLOADS=true
#并行编译的线程数,设置为和CPU内核数量一致即可
export HOTSPOT_BUILD_JOBS=6
export ALT_PARALLEL_COMPILE_JOBS=6
#比较本次build出来的映像与先前版本的差异。这个对我们来说没有意义,必须设置为false,否则sanity检查会报缺少先前版本JDK的映像。如果有设置dev或者DEV_ONLY=true的话这个不显式设置也行。
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 SKIP_DEBUG_BUILD=false
#export SKIP_FASTDEBUG_BUILD=true
#export DEBUG_NAME=debug
#把它设置为false可以避开javaws和浏览器Java插件之类的部分的build。
BUILD_DEPLOY=false
#把它设置为false就不会build出安装包。因为安装包里有些奇怪的依赖,但即便不build出它也已经能得到完整的JDK映像,所以还是别build它好了。
BUILD_INSTALL=false
#编译结果所存放的路径
export ALT_OUTPUTDIR=/Users/IcyFenix/Develop/JVM/jdkBuild/openjdk_7u4/build
#这两个环境变量必须去掉,不然会有很诡异的事情发生(我没有具体查过这些“”诡异的事情”,Makefile脚本检查到有这2个变量就会提示警告“)
unset JAVA_HOME
unset CLASSPATH
make 2>&1 | tee $ALT_OUTPUTDIR/build.log