您的位置:首页 > 运维架构 > Linux

自己动手在Linux下编译JDK

2014-10-29 13:53 302 查看
因为决定学习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 J***A_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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: