- 下载openjdk源码
首先从http://download.java.net/openjdk/jdk7/下载jdk源码,我下载的为openjdk-7-fcs-src-b147-27_jun_2011.zip,大小为83.18M
- 准备编译工具
Cygwin
下载cygwin2.831(32.bit),安装的时候要安装编译jdk的必须工具,如下图:
Visual studio2010
安装vs2010,安装后需要把两个文件夹配到环境变量里:C:\Program Files\Microsoft SDKs\Windows\v7.0A,其中这个路径里有空格(这个路径是安装vs2010系统默认的路径不可更改),需要在cygwin控制台里用cygpath –s –m C:\Program Files\Microsoft SDKs\Windows\v7.0A进行转换,第二个路径是D:\Program Files\Microsoft Visual Studio 10.0\VC(这个路径是安装vs2010你选择安装的路径),同样也需要转换。
Bootstrap jdk
因为jdk源码里有好多的java源文件,编译这些程序必然需要一个编译好的jdk,官方叫bootstrap jdk,而编译OpenJDK 7的话,Bootstrap JDK必须使用JDK6 Update 14或之后的版本我一开始选择的是jdk6u45,在编译的过程中报错,后来选择了jdk6u23则成功,安装它
Freetype
下载一个版本大于2.3的Freetype,下载地址http://www.freetype.org/,最新版是freetype-2.3.5-1,可是这个版本的文件有变更,在bin目录里的freetype.dll已经是freetype6.dll,另外还依赖一个叫zlib1.dll的文件,是单独下载的,我从百度上搜索的。下载完拷贝到bin目录
Microsoft DirectX 9.0 SDK
我下载的版本为dxsdk_apr2006.exe,安装它,最好不要安装到有中文名和空格的文件夹下面。
MSVCR100.DLL
把这个文件放到一个目录里,同样不要有中文名和空格,在环境变量里配置。
Ant
下载一个Apache ANT,JDK中Java代码部分都是使用ANT脚本进行编译的,ANT版本要求在1.6.5以上,我采用的apache-ant-1.9.3,这部分是Java的基础知识,对本书的读者来说应该没有难度,笔者就不再详述。
- 编译
配置环境变量:
编译之前要设置环境变量,我按照书中所述,写了一个dos批处理文件,内容如下:
由于这个版本的jdk不需要plugin,所以注释掉设置plugin的环境变量。
检查环境变量
在开始——运行里输入cmd打开控制台,进入环境变量批处理文件所在的目录,运行文件,然后输入bash,启动cygwin,进入jdk源码所在的目录,输入make sanity检查环境变量设置是否正确,如果看到“sanity check passed”,则设置成功,可以进入下一步。输入make开始编译。
- 错误消息
直接修改jdk/make/common/shared/Compiler-msvc.gmk,把51行的CC_MAJORVER直接赋值为16,再运行make sanity出现下面错误:
- 然后在网上查找解决方案,说是cygwin的make版本造成的,找不到make命令。需要在cygwin控制台里安装make-3.82.tar.gz,先使用tar –xvf make-3.82.tar.gz解压,然后进入解压后的目录make-3.82里,执行./configure && make安装,然后把make.exe与cygintl-3.dll拷贝到cygwin/bin里
Freetype配置:
修改/jdk/make/sun/font/Makefile:125行为:
FREETYPE_LIB = $(LIB_LOCATION)/$(LIB_PREFIX)freetype6.$(LIBRARY_SUFFIX)
并且添加 OTHER_LDLIBS += $(FREETYPE_LIB_PATH)/freetype.lib
上图的错误需要修改get_msc_ver.sh,修改如下:
把61行注释掉添加
if [ "${ALT_MSC_VER_RAW}" != "" ] ; then
MSC_VER_RAW=${ALT_MSC_VER_RAW}
else
MSC_VER_RAW=`cl 2>&1 | "$HEAD" -n 1 | "$SED" 's/.*Version[/ ]*/([0-9][0-9.]*/).*//1/'`
Fi
上图错误,解决方法是:修改C:\Program Files\Microsoft SDKs\Windows\v7.0A\Include\里的objidl.h文件,在30,31行之间插入#include "Rpcsal.h"即可解决,如果遇到此文件不能被修改,可以把它剪切出来修改,然后在放回目录。
在某些windows7机子上编译时会出现上图错误,(比如我公司的笔记本就不会出现,而家里的台式机就出现这个错误,同样是win7x86系统),是由于cygwin没有操作openjdk的全部权限,我在cygwin控制台里使用chmod –R 777 * 把./openjdk目录下所有文件设置全部权限就ok
-----------------------------------------------------------------------------------------------------------------------------
1.如果单独编译jdk部分,会出现java -source 7 错误的源版本和 -target 7 错误的目标版本(未解决)
2.如果把langtools,hotspot,jdk一起编译就没有上面的错误,可是会出现图build jdk error6.png里的错误,解决方法:把openjdk\jdk\src\share\classes\sun\font里的java源程序拷贝到openjdk\jdk\src\windows\classes\sun\font里。估计是Makefile里错误导致读取的目录出错,应该也可以修改Makefile文件解决。
build jdk error6.png
3.出现找不到windows-i586\bin\下的freetype6.dll和zlib1.dll,我的解决方法是,在运行完make后,在生成的windows-i586里手动创建bin目录,并且把生成的btlibs目录里的文件拷贝到bin中(注:必须拷贝所有的文件,不然编译完成后,不能运行awt和swing程序,同时也可以只拷贝freetype6.dll和zlib1.dll来顺利通过编译,编译完成后手动拷贝其他文件到j2sdk-image\bin目录或者是j2sdk-image\jre\bin都行),估计是make的时候,某个Makefile里没有拷贝文件到bin中,应该也可以修改Makefile文件解决。(注:编译完成后如果要运行swing等GUI程序必须把jre\bin\下的freetype6.dll和zlib1.dll两个文件拷贝到j2sdk-image\bin里)
- 后记
在myeclipse8.6里测试后发现编译完的jdk打断点调试仍然看不到变量的值,是由于编译jdk没有使用javac –g参数,在环境变量里设置编译可debug的参数,如下:
本人这次没有编译jdk的完整的内容,去除了CORBA部分,如果有朋友编译了完整的,望不吝赐教