深入理解Java虚拟机 CentOS编译OpenJDK源码总结

首先楼主是在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

你可能感兴趣的:(Java虚拟机)