因为决定学习Java虚拟机,所以打算从自己编译JDK开始入手。本文是学习Java虚拟机的第一篇文章,后续会有更多相关文章。
获取源码
本文选择的源码版本为1.7。可以使用如下命令来获取源码:
1)安装Mercurial的最新版本
Mercurial是与Git相似的一个分布式版本控制系统,但使用方法上与Subversion相似。如果你使用过Subversion,很容易迁移到Mercurial。安装命令如下:
$ sudo apt-get install python $ sudo apt-get install python-all-dev $ sudo apt-get install python-setuptools $ sudo easy_install -U mercurial
检测是否成功安装:
$ hg --version Mercurial Distributed SCM (version 3.1.2) (see http://mercurial.selenic.com for more information) Copyright (C) 2005-2014 Matt Mackall and others This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
2)下载源码
$ cd ~ $ hg clone http://hg.openjdk.java.net/jdk7u/jdk7u60 openjdk-7-src $ cd openjdk-7-src $ sh ./get_source.sh
这样就可以源码会下载到openjdk-7-src目录下。
注意千万不要这样获取源码:
$ mkdir ~/jdk $ cd ~/jdk/ $ wget http://www.java.net/download/openjdk/jdk7/promoted/b147/openjdk-7-fcs-src-b147-27_jun_2011.zip $ unzip openjdk-7-fcs-src-b147-27_jun_2011.zip
这个地址获取的源码不是最新的,会有以下bug:
make[5]: Entering directory `/home/ruifengshan/jdk/openjdk/build/linux-amd64-debug/hotspot/outputdir‘ make -f /home/ruifengshan/jdk/openjdk/hotspot/make/linux/Makefile checks make[6]: Entering directory `/home/ruifengshan/jdk/openjdk/build/linux-amd64-debug/hotspot/outputdir‘ >&2 echo "*** This OS is not supported:" `uname -a`; exit 1; *** This OS is not supported: Linux ruifengshan-ubuntu 3.13.0-37-generic #64-Ubuntu SMP Mon Sep 22 21:28:38 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux make[6]: *** [check_os_version] Error 1 ......
系统
本文采用的Linux系统,发行版为Ubuntu 14.04 64位。
构建编译环境
1)安装编译需要的gcc等软件,可以使用如下命令一次性安装
$ sudo apt-get libasound-dev libcups2-dev build-essential $ sudo apt-get install libxt-dev $ sudo apt-get install libxtst-dev
2)安装ant
$ mkdir /export/ant $ cd /export/ant $ wget http://www.gtlib.gatech.edu/pub/apache//ant/binaries/apache-ant-1.9.4-bin.tar.gz $ sudo tar -zxf apache-ant-1.9.4-bin.tar.gz $ sudo vim /etc/profile
输入如下内容:
export ANT_HOME=/export/ant/apache-ant-1.9.4 export PATH=$PATH:$ANT_HOME/bin
完成后使用如下命令使设置生效:
$ source /etc/profile
3)安装Java环境
编译还需要用到JDK的运行时包,这是为了编译JDK中用Java代码编写的那部分所需要的。关于如何安装Java这里就不再赘述了。本文安装Java的目录为:/export/java6/jdk1.6.0_45。
4)环境变量设置
在命令行输入如下内容:
export ALT_BOOTDIR=/export/java6/jdk1.6.0_45 export LANG=C export ALLOW_DOWNLOADS=true unset CLASSPATH unset JAVA_HOME
5)安装freeType
执行如下命令安装freeType
$ mkdir ~/freetype $ cd ~/freetype $ wget http://ftp.yzu.edu.tw/nongnu//freetype/freetype-2.5.3.tar.gz $ tar -zxf freetype-2.5.3.tar.gz $ cd freetype-2.5.3 $ ./configure $ make $ sudo make install
安装成功后,还需要输入如下命令:
$ sudo ln -s /usr/local/include/freetype2/freetype /usr/local/include/freetype
否则,会出现如下错误:
ERROR: FreeType version 2.3.0 or higher is required. ...
6)执行make sanity检查
在OpenJDK目录下运行make sanity检查。如果在最后输出以下内容,则证明设置都正确。
$ cd ~/openjdk-7-src $ make sanity ...... Sanity check passed.
开始编译
执行如下命令:
$ cd ~/openjdk-7-src $ make ALLOW_DOWNLOADS=true
如果出现以下内容,则表名编译成功:
######################################################################## ##### Leaving jdk for target(s) sanity all docs images ##### ######################################################################## ##### Build time 00:07:50 jdk for target(s) sanity all docs images ##### ######################################################################## #-- Build times ---------- Target all_product_build Start 2014-10-29 13:35:25 End 2014-10-29 13:43:48 00:00:16 corba 00:00:07 hotspot 00:00:02 jaxp 00:00:05 jaxws 00:07:50 jdk 00:00:03 langtools 00:08:23 TOTAL ------------------------- make[1]: Leaving directory `/home/ruifengshan/jdk/openjdk-7-src‘
测试
使用如下命令测试以下编译的结果:
$ cd ~/jdk/openjdk-7-src $ build/linux-amd64/bin/java -version openjdk version "1.7.0-internal" OpenJDK Runtime Environment (build 1.7.0-internal-ruifengshan_2014_10_29_12_50-b00) OpenJDK 64-Bit Server VM (build 24.60-b09, mixed mode)
注意其中的(build 1.7.0-internal-ruifengshan_2014_10_29_12_50-b00),里面会包含你自己的名字。
转载请注明出处:http://blog.csdn.net/iAm333