一、准备编译环境
1、安装alsa声卡驱动包
yum install alsa-lib-devel
2、安装cups-devel
yum install cups-devel
3、安装X相关的库
yum install libX*
4、安装gcc编辑器
yum install gccgcc-c++
5、安装freetype
由于系统是Centos的,所以从http://rpm.pbone.net/index.php3/stat/4/idpl/26641422/dir/centos_7/com/freetype-2.4.11-9.el7.x86_64.rpm.html下载rpm包
rpm –ivh freetype-2.4.11-9.el7.src.rpm
6、安装libstdc
yum install libstdc++-static7、安装Ant,用于执行Java编译代码中的Ant脚本安装包下载地址:http://ant.apache.org/bindownload.cgi
tar –zxvf apache-ant-1.10.1-bin.tar.gz
8、安装1.7版本的JDK
从官网下载安装包,使用filezila上传到虚拟机
解压缩安装包:gunzip jdk-7u79-linux-x64.gztar –xvf jdk-7u79-linux-x64.gz
修改环境变量
vim /etc/profile
在文件末尾添加下面的命令
#set environment
JAVA_HOME=/usr/java/jdk1.7.0_79
CLASSPATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar
PATH=$JAVA_HOME/bin:$PATH
export JAVA_HOME CLASSPATH PATH保存退出,执行source /etc/profile使环境变量立即生效
执行java –version验证安装是否成功
9、下载OpenJDK源码
https://www.mercurial-scm.org/release/centos7/RPMS/x86_64/
这里选择的是:openjdk-7u75-src-b13-18_dec_2014.zip
解压缩:unzip openjdk-7u75-src-b13-18_dec_2014.zip
二、进行编译
OpenJDK在编译时读取的环境变量有很多,但大多都有默认值,必须设置的只有两个:LANG和ALT_BOOTDIR,前者是设定语言选项,必须设置为:
export LANG=C
否者在编译前的验证阶段会出现一个HashTable空指针异常。另外一个ALT_BOOTDIR是Bootstrap JDK,因为OpenJDk的各个组成部分(Hostspot、JDK API、JAXWS、JAXP……),有的是用C++编写的,更多的代码是用
JAVA语言自身实现的。因此编译这些Java代码需要用到一个可用的JDK,官方称这个JDK为“Bootstrap JDK”。
export ALT_BOOTDIR=/usr/java/jdk1.7.0_79
另外,之前设置的JAVA_HOME和CLASSPATH两个环境变量在编译之前必须取消,否则Makefile脚本中检查到有这两个环境变量存在,会有警告提示。
unset JAVA_HOME
unset CLASSPATH
#允许自动下载依赖
export ALLOW_DOWNLOADS=true#设置Ant的安装路径
export ANT_HOME=/root/apache-ant-1.10.1
#设置并行编译的线程数,设置成和CPU内核数量一样
export HOTSPOT_BUILD_JOB=4
export ALT_PARALLEL_COMPILE_JOBS=4
比较本次build出来的映像和之前版本的差异,必须设置为false,否则sanity检查会报缺少先前版本JDK的映像的错误提示。如果已经设置dev或者DEV_ONLY=true,这个不显式设置也行。
export SKIP_COMPARE_IMAGES=true
#使用预编译头文件,不加这个编译会更慢一些
export USE_PRECOMPILED_HEADER=true# 64位jdk
export ARCH_DATA_MODEL=64
#要编译的内容
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
export BUILD_DEPLOY=false
#把它设置成false就不会build出安装包,因为安装包里有些奇怪的依赖,但即便不build出它也已经能得到完整的JDK映像,所以还是别build它好了。
export BUILD_INSTALL=false
#编译结果所存放的路径
export ALT_OUTPUTDIR=/root/openjdk/build编译检查
进入之前解压缩的OpenJDK的根目录执行:make sanity
检查通过后,执行make开始编译。我这里报了一个错
这是因为我这里使用的Ant版本是1.10.1,应该对应1.8版本jdk,而现在使用的jdk是1.7的,所以需要重新下载1.9版本及以下的Ant。
下载Ant,上传解压缩后,执行export ANT_HOME= /root/apache-ant-1.9.9
然后重新执行make,报了下面的错误
解决方法是将CurrencyData.properties文件中所有的时间改为10年以内。
cd openjdk/jdk/src/share/classes/java/util/
vim CurrencyData.properties编译完成后,输出如下的日志清单
配置debug版jdk
编译完成后进入OpenJDK源码下的build/j2sdk-image目录(或者build-debug、build-fastdebug这两个目录),这是整个JDK的完整编译结果,复制到JAVA_HOME目录,就可以作为一个完整的JDK使用,编译出来的虚拟机,在-version命令中带有用户的机器名。修改JAVA_HOME变量为j2sdk-image的目录
在大多数时候,如果我们并不关心JDK中HotSpot虚拟机以外的内容,只想单独编译HotSpot虚拟机的话(例如调试虚拟机时,每次改动程序都执行整个OpenJDK的Makefile,速度肯定受不了),那么使用源码中/root/openjdk/hotspot/make目录下的Makefile进行替换即可,其他参数与前面是一致的,这时候虚拟机的输出结果存放在/root/openjdk/build/hotspot/outputdir/linux_amd64_compiler2目录中,进入后可以看见以下几个目录。
这些目录对应了不同的优化级别,优化级别越高,性能自然越好,但是输出代码与源码差距就越大,难于调试,具体哪个目录有内容,取决于make命令后面的参数。
在编译结束后,运行虚拟机之前,还要手工编辑/root/openjdk/build/hotspot/outputdir/linux_amd64_compiler2/jvmg目录下的env.sh(find -name env.sh查找文件)文件,这个文件由编译脚本自动生成,用于设置虚拟机的环境变量,里面已经发布了“JAVA_HOME、CLASSPATH、HOTSPOT_BUILD_USER”3个环境变量,还需要增加一个“LD_LIBRARY_PATH”,内容如下:
LD_LIBRARY_PATH=.:${JAVA_HOME}/jre/lib/amd64/native_threads:${JAVA_HOME}/jre/lib/amd64
export LD_LIBRARY_PATH
source env.sh
然后执行以下命令启动虚拟机(这时启动器为gamma),输出版本号。
. ./env.sh
./gamma -version