本次编译的系统环境是Ubuntu Linux 64-bit,编译用户root。需要以下软件包的依赖,如果是新的环境直接复制粘贴到终端即可,如果系统有了也不会重复安装的,建议安装之前把软件仓库update一次。
apt-get install mercurial build-essential gawk m4 openjdk-6-jdk ant libasound2-dev libcups2-dev libxrender-dev xutils-dev binutils libmotif3 libmotif-dev zip libfreetype6-dev xorg-dev x11proto-print-dev
1、下载OpenJDK的源代码
hg clone http://hg.openjdk.java.net/jdk7u/jdk7u-dev cd jdk7u-dev/ chmod 755 get_source.sh ./get_source.sh
2、设置环境变量
#语言选项 export LANG=C #bootstrap jdk路径 export ALT_BOOTDIR=/usr/lib/jvm/java-6-openjdk-amd64 #允许自动下载依赖 export ALLOW_DOWNLOADS=true #并行编译的线程数,按CPU核数配置就可以了,我这机器是i7 8核 export HOTSPOT_BUILD_JOBS=8 export ALT_PARALLEL_COMPILE_JOBS=8 #与之前编译的版本做比较,没意义,跳过即可 export SKIP_COMPARE_IMAGES=true #使用预编译的头文件,不加慢些 export USE_PRECOMPILED_HEADER=true #要编译的内容,这里只编译了JDK和LANGTOOLS。 export BUILD_LANGTOOLS=true export BUILD_JDK=true #不需要打包 export BUILD_DEPLOY=false export BUILD_INSTALL=false #设置编译输出的目录 export ALT_OUTPUTDIR=/root/jdk7u-bin #取消系统java环境变量 unset JAVA_HOME unset CLASSPATH
这里要求系统先装一个JDK环境,编译OpenJDK7至少要求OpenJDK6以上,因为编译期间有很多java语言写的过程,这个叫做“Bootstrap JDK”,我这是用apt-get安装的,所以默认路径如此。更多配置信息可以参考源代码目录下的README-builds.html。
3、编译
用env确认下变量没错的话就可以进行编译了,如果有错误,依据错误提示修正后用make clean清理一次,再执行编译。
make 2>&1 | tee $ALT_OUTPUTDIR/build.log
这样可以记录下编译的日志,不需要也可以直接make all,我这里编译大概需要15分钟就可以了,看到以下信息表示成功。
#-- Build times ---------- Target all_product_build Start 2013-12-24 13:04:19 End 2013-12-24 13:21:02 00:01:41 corba 00:04:18 hotspot 00:00:16 jaxp 00:00:19 jaxws 00:09:34 jdk 00:00:32 langtools 00:16:43 TOTAL
4、运行检测
进入之前配置的输出目录下的bin,执行java -version可以看到build里面加入了用户机器名
root@dorole.com:~/jdk7u-bin/bin# ./java -version openjdk version "1.7.0-internal" OpenJDK Runtime Environment (build 1.7.0-internal-stevenyang_2013_12_24_13_04-b00) OpenJDK 64-Bit Server VM (build 24.60-b04, mixed mode)
Java的编译和解释就算ok了,接下来还要测试下jvm是否正常。进入jdk7u-bin/hotspot/outputdir目录,可以发现有子目录linux_amd64_compiler2/,前面的linux是根据宿主系统来决定的,我们这里是linux,amd64不用多说,compiler2表示Server VM,compiler1表示Client VM。进入后又有子目录分别对应了不同的优化级别,优化级别越高,性能越牛叉,生成的代码越难以调式,具体哪个目录下有内容得看make的参数,我这里是在product/下面。
虚拟机的启动器名字叫gamma,先编辑目录下的env.sh,可以看到默认的JAVA_HOME并不是我们自己编译的,修改下即可。可以执行目录下的test_gamma脚本来进行测试,这个脚本主要是调用javac去编译jdk7u-dev/hotspot/make/test/Queens.java,并执行解八皇后问题。
直接执行gamma可能会失败,因为找不到新编译出来的libjvm.so文件,没关系加入到系统就好了。在/etc/ld.so.conf.d中建立java.conf,内容为libjvm.so所在目录。再执行ldconfig即可。
root@dorole.com:/etc/ld.so.conf.d# cat java.conf /root/jdk7u-bin/hotspot/outputdir/linux_amd64_compiler2/product root@dorole.com:/etc/ld.so.conf.d# ldconfig root@dorole.com:/etc/ld.so.conf.d# ldconfig -p | grep jvm libjvm.so (libc6,x86-64) => /root/jdk7u-bin/hotspot/outputdir/linux_amd64_compiler2/product/libjvm.so
看到有最后一行的输出就可以了,再回到gamma目录,执行就可以了。
root@dorole.com:~/jdk7u-bin/hotspot/outputdir/linux_amd64_compiler2/product# ./gamma -version Using java runtime at: /root/jdk7u-bin openjdk version "1.7.0-internal" OpenJDK Runtime Environment (build 1.7.0-internal-stevenyang_2013_12_24_13_04-b00) OpenJDK 64-Bit Server VM (build 24.60-b04, mixed mode)
到此,整个编译OpenJDK就算完成了。
本文链接地址:https://dorole.com/1216/