<p>无聊的时候决定自己动手编译个JDK,曾经想在X86上编译一个<a href="http://en.wikipedia.org/wiki/Dalvik_(software)" target="_blank">Dalvik</a>出来玩玩,但基于那玩意是高手才玩的起的,所以自己那个想法就不了了知了<br />
看了一圈后发现<a href="http://openjdk.java.net/" target="_blank">OpenJDK</a>还是比较容易编译的,所以就来炒份现饭<br />
现代JDK这么容易自己编译还是归功于开源和社区</p>
<p>开场白就说这么多,下面是过程记录<br />
下载源码,解压,阅读README和README-builds.html,然后就可以开工了</p>
<p>我是在Linux 2.6.35-28-generic #50-Ubuntu i686 GNU/Linux上编译的,我编译的是<a href="http://www.java.net/download/openjdk/jdk7/promoted/b141/openjdk-7-ea-src-b141-05_may_2011.zip" target="_blank">openjdk-7-ea-src-b141-05_may_2011</a>这个版本</p>
<p>主要需要以下条件<br />
Basic Linux Check List<br />
1. Install the Bootstrap JDK, set ALT_BOOTDIR.<br />
2. Optional Import JDK, set ALT_JDK_IMPORT_PATH.(可以不要,如果你是完全编译的话)<br />
3. Install or upgrade the FreeType development package.(这个基本有了)<br />
4. Install Ant 1.7.1 or newer, make sure it is in your PATH.</p>
<p>然后在环境变量下做些设置<br />
ALT_BOOTDIR=$SUN_JDK1.6.0_25_HOME(我是用的SUN的JDK6来作为Bootstrap JDK的)<br />
LANG=C(需要设置成这样,否则编译会报错,Linux一般是zh_CN.utf8改下就可以)<br />
ALT_CUPS_HEADERS_PATH=$CUPS_HOME/include(何为<a href="http://www.cups.org/" target="_blank">CUPS</a>,<a href="http://www.cups.org/" target="_blank">见此</a>)</p>
<p>另外环境变量中不要出现JAVA_HOME,CLASSPATH,有的话就把它们注释掉</p>
<p>记得使修改过的环境变量生效</p>
<p>然后就cd到$openjdk_src下开始执行make sanity检测<br />
成功的话就执行make all ALLOW_DOWNLOADS=true WARNINGS_ARE_ERRORS=开始较为耗时的编译之旅</p>
<p>这两个参数的意思还是比较明白<br />
ALLOW_DOWNLOADS=true就是编译的时候发现缺少某些预知的源码或依赖时,它会自动去下载,前提是必须联网<br />
WARNINGS_ARE_ERRORS=就是禁止编译器把一些警告当错误,如果不加这个就可能会因为类似于这样的cc1plus: warnings being treated as errors提示而终止编译,这不是我们所希望的</p>
<p>但是不要高兴的太早,多多少少可能会遇到点问题,不过找找Google应该都能解决</p>
<p>下面贴出我在编译的时候遇到的问题<br />
1、<br />
<ins datetime="2011-05-12T13:47:20+00:00">/home/guohai/dev/src/java/openjdk-7-ea-src-b141-05_may_2011/hotspot/src/os/linux/vm/os_linux.cpp<br />
cc1plus: warnings being treated as errors<br />
/home/guohai/dev/src/java/openjdk-7-ea-src-b141-05_may_2011/hotspot/src/os/linux/vm/os_linux.cpp: In static member function ‘static bool os::Linux::hugetlbfs_sanity_check(bool, size_t)’:<br />
/home/guohai/dev/src/java/openjdk-7-ea-src-b141-05_may_2011/hotspot/src/os/linux/vm/os_linux.cpp:2853: error: use of assignment suppression and length modifier together in gnu_scanf format<br />
make[6]: *** [os_linux.o] Error 1<br />
make[6]: Leaving directory `/home/guohai/dev/src/java/openjdk-7-ea-src-b141-05_may_2011/build/linux-i586/hotspot/outputdir/linux_i486_compiler2/product’</ins></p>
<p>WARNINGS_ARE_ERRORS=</p>
<p>2、<br />
<ins datetime="2011-05-12T13:47:20+00:00">../../../src/solaris/native/sun/awt/awt.h:38: fatal error: X11/Intrinsic.h: No such file or directory<br />
compilation terminated.<br />
make[5]: *** [/home/guohai/dev/src/java/openjdk-7-ea-src-b141-05_may_2011/build/linux-i586/tmp/sun/sun.awt/awt/obj/BufImgSurfaceData.o] Error 1<br />
make[5]: *** Waiting for unfinished jobs….<br />
make[5]: Leaving directory `/home/guohai/dev/src/java/openjdk-7-ea-src-b141-05_may_2011/jdk/make/sun/awt’<br />
make[4]: *** [library_parallel_compile] Error 2<br />
make[4]: Leaving directory `/home/guohai/dev/src/java/openjdk-7-ea-src-b141-05_may_2011/jdk/make/sun/awt’<br />
make[3]: *** [all] Error 1<br />
make[3]: Leaving directory `/home/guohai/dev/src/java/openjdk-7-ea-src-b141-05_may_2011/jdk/make/sun’<br />
make[2]: *** [all] Error 1<br />
make[2]: Leaving directory `/home/guohai/dev/src/java/openjdk-7-ea-src-b141-05_may_2011/jdk/make’<br />
make[1]: *** [jdk-build] Error 2<br />
make[1]: Leaving directory `/home/guohai/dev/src/java/openjdk-7-ea-src-b141-05_may_2011′<br />
make: *** [build_product_image] Error 2</ins></p>
<p>sudo apt-get install libxt-dev</p>
<p>3、<br />
<ins datetime="2011-05-12T13:47:20+00:00">../../../src/solaris/native/sun/xawt/XToolkit.c:48: fatal error: X11/extensions/XTest.h: No such file or directory<br />
compilation terminated.<br />
make[5]: *** [/home/guohai/dev/src/java/openjdk-7-ea-src-b141-05_may_2011/build/linux-i586/tmp/sun/sun.awt.X11/xawt/obj/XToolkit.o] Error 1<br />
make[5]: *** Waiting for unfinished jobs….<br />
make[5]: Leaving directory `/home/guohai/dev/src/java/openjdk-7-ea-src-b141-05_may_2011/jdk/make/sun/xawt’<br />
make[4]: *** [library_parallel_compile] Error 2</ins></p>
<p>sudo apt-get install libxtst-dev</p>
<p>从2011-05-12 20:39开始编译,遇到问题,前前后后经历了近一个小时<br />
另外如果编译出错了,并且你解决了错误,貌似你只需要继续执行make all ALLOW_DOWNLOADS=true WARNINGS_ARE_ERRORS=<br />
就可以了,它会接着编译,而不需要从头开始编译<br />
当你看到下面这种提示时<br />
— Build times ———-<br />
Target all_product_build<br />
Start 2011-05-12 21:28:48<br />
End 2011-05-12 21:37:48<br />
00:00:04 corba<br />
00:00:12 hotspot<br />
00:00:03 jaxp<br />
00:00:05 jaxws<br />
00:08:32 jdk<br />
00:00:04 langtools<br />
00:09:00 TOTAL<br />
————————-<br />
应该就可以完工了,cd到$openjdk_src/build/platform/下,看看j2sdk-image和j2re-image中的内容是不是很熟悉?<br />
cd$openjdk_src/build/platform/bin/下执行如下命令就应该可以看到结果,当然版本,硬件架构可能不一样<br />
总之你就自己编译出了一个带自己名字的JDK了</p>
<p>$openjdk_src/build/linux-i586/bin$ ./java -version<br />
openjdk version “1.7.0-internal”<br />
OpenJDK Runtime Environment (build 1.7.0-internal-guohai_2011_05_12_20_39-b00)<br />
OpenJDK Server VM (build 21.0-b11, mixed mode)</p>
<p>$openjdk_src/build/linux-i586/bin$ ./javac -version<br />
javac 1.7.0-internal</p>
<p>有图<br />
<a href="http://www.flickr.com/photos/46848122@N08/5712770049/" title="compile-my-openjdk by DeliberateKids, on Flickr" target="_blank"><img src="https://farm3.static.flickr.com/2279/5712770049_af4be72b00.jpg" width="500" height="61" alt="compile-my-openjdk"></a></p>
<p>编译成功之后再把那些需要改回来的东西改回来</p>
<p><code><br />
sudo apt-get install libfreetype6-dev<br />
sudo apt-get install libasound2-dev<br />
sudo apt-get install libcups2-dev<br />
</code></p>
无聊的时候决定自己动手编译个JDK,曾经想在X86上编译一个Dalvik出来玩玩,但基于那玩意是高手才玩的起的,所以自己那个想法就不了了知了
看了一圈后发现OpenJDK还是比较容易编译的,所以就来炒份现饭
现代JDK这么容易自己编译还是归功于开源和社区
开场白就说这么多,下面是过程记录
下载源码,解压,阅读README和README-builds.html,然后就可以开工了
我是在Linux 2.6.35-28-generic #50-Ubuntu i686 GNU/Linux上编译的,我编译的是openjdk-7-ea-src-b141-05_may_2011这个版本
主要需要以下条件
Basic Linux Check List
1. Install the Bootstrap JDK, set ALT_BOOTDIR.
2. Optional Import JDK, set ALT_JDK_IMPORT_PATH.(可以不要,如果你是完全编译的话)
3. Install or upgrade the FreeType development package.(这个基本有了)
4. Install Ant 1.7.1 or newer, make sure it is in your PATH.
然后在环境变量下做些设置
ALT_BOOTDIR=$SUN_JDK1.6.0_25_HOME(我是用的SUN的JDK6来作为Bootstrap JDK的)
LANG=C(需要设置成这样,否则编译会报错,Linux一般是zh_CN.utf8改下就可以)
ALT_CUPS_HEADERS_PATH=$CUPS_HOME/include(何为CUPS,见此)
另外环境变量中不要出现JAVA_HOME,CLASSPATH,有的话就把它们注释掉
记得使修改过的环境变量生效
然后就cd到$openjdk_src下开始执行make sanity检测
成功的话就执行make all ALLOW_DOWNLOADS=true WARNINGS_ARE_ERRORS=开始较为耗时的编译之旅
这两个参数的意思还是比较明白
ALLOW_DOWNLOADS=true就是编译的时候发现缺少某些预知的源码或依赖时,它会自动去下载,前提是必须联网
WARNINGS_ARE_ERRORS=就是禁止编译器把一些警告当错误,如果不加这个就可能会因为类似于这样的cc1plus: warnings being treated as errors提示而终止编译,这不是我们所希望的
但是不要高兴的太早,多多少少可能会遇到点问题,不过找找Google应该都能解决
下面贴出我在编译的时候遇到的问题
1、
/home/guohai/dev/src/java/openjdk-7-ea-src-b141-05_may_2011/hotspot/src/os/linux/vm/os_linux.cpp
cc1plus: warnings being treated as errors
/home/guohai/dev/src/java/openjdk-7-ea-src-b141-05_may_2011/hotspot/src/os/linux/vm/os_linux.cpp: In static member function ‘static bool os::Linux::hugetlbfs_sanity_check(bool, size_t)’:
/home/guohai/dev/src/java/openjdk-7-ea-src-b141-05_may_2011/hotspot/src/os/linux/vm/os_linux.cpp:2853: error: use of assignment suppression and length modifier together in gnu_scanf format
make[6]: *** [os_linux.o] Error 1
make[6]: Leaving directory `/home/guohai/dev/src/java/openjdk-7-ea-src-b141-05_may_2011/build/linux-i586/hotspot/outputdir/linux_i486_compiler2/product’
WARNINGS_ARE_ERRORS=
2、
../../../src/solaris/native/sun/awt/awt.h:38: fatal error: X11/Intrinsic.h: No such file or directory
compilation terminated.
make[5]: *** [/home/guohai/dev/src/java/openjdk-7-ea-src-b141-05_may_2011/build/linux-i586/tmp/sun/sun.awt/awt/obj/BufImgSurfaceData.o] Error 1
make[5]: *** Waiting for unfinished jobs….
make[5]: Leaving directory `/home/guohai/dev/src/java/openjdk-7-ea-src-b141-05_may_2011/jdk/make/sun/awt’
make[4]: *** [library_parallel_compile] Error 2
make[4]: Leaving directory `/home/guohai/dev/src/java/openjdk-7-ea-src-b141-05_may_2011/jdk/make/sun/awt’
make[3]: *** [all] Error 1
make[3]: Leaving directory `/home/guohai/dev/src/java/openjdk-7-ea-src-b141-05_may_2011/jdk/make/sun’
make[2]: *** [all] Error 1
make[2]: Leaving directory `/home/guohai/dev/src/java/openjdk-7-ea-src-b141-05_may_2011/jdk/make’
make[1]: *** [jdk-build] Error 2
make[1]: Leaving directory `/home/guohai/dev/src/java/openjdk-7-ea-src-b141-05_may_2011′
make: *** [build_product_image] Error 2
sudo apt-get install libxt-dev
3、
../../../src/solaris/native/sun/xawt/XToolkit.c:48: fatal error: X11/extensions/XTest.h: No such file or directory
compilation terminated.
make[5]: *** [/home/guohai/dev/src/java/openjdk-7-ea-src-b141-05_may_2011/build/linux-i586/tmp/sun/sun.awt.X11/xawt/obj/XToolkit.o] Error 1
make[5]: *** Waiting for unfinished jobs….
make[5]: Leaving directory `/home/guohai/dev/src/java/openjdk-7-ea-src-b141-05_may_2011/jdk/make/sun/xawt’
make[4]: *** [library_parallel_compile] Error 2
sudo apt-get install libxtst-dev
从2011-05-12 20:39开始编译,遇到问题,前前后后经历了近一个小时
另外如果编译出错了,并且你解决了错误,貌似你只需要继续执行make all ALLOW_DOWNLOADS=true WARNINGS_ARE_ERRORS=
就可以了,它会接着编译,而不需要从头开始编译
当你看到下面这种提示时
— Build times ———-
Target all_product_build
Start 2011-05-12 21:28:48
End 2011-05-12 21:37:48
00:00:04 corba
00:00:12 hotspot
00:00:03 jaxp
00:00:05 jaxws
00:08:32 jdk
00:00:04 langtools
00:09:00 TOTAL
————————-
应该就可以完工了,cd到$openjdk_src/build/platform/下,看看j2sdk-image和j2re-image中的内容是不是很熟悉?
cd$openjdk_src/build/platform/bin/下执行如下命令就应该可以看到结果,当然版本,硬件架构可能不一样
总之你就自己编译出了一个带自己名字的JDK了
$openjdk_src/build/linux-i586/bin$ ./java -version
openjdk version “1.7.0-internal”
OpenJDK Runtime Environment (build 1.7.0-internal-guohai_2011_05_12_20_39-b00)
OpenJDK Server VM (build 21.0-b11, mixed mode)
$openjdk_src/build/linux-i586/bin$ ./javac -version
javac 1.7.0-internal
有图

编译成功之后再把那些需要改回来的东西改回来
sudo apt-get install libfreetype6-dev
sudo apt-get install libasound2-dev
sudo apt-get install libcups2-dev
博主在编译时有没有遇到下面这种情况
Class Resolve.InapplicableSymbolsError.Candidate overrides equals, but neither it nor any superclass overrides hashCode method stackOverlfow