手动编译jdk

相信很多人都看过《深入理解Java虚拟机》这本书(周志明著 ),很多人也都想参照着书中所述“自己编译jdk”的步骤来体验一下过程,但是实际操作过程中可能会遇到这样或者那样的问题,造成最终放弃掉。比如原因可能有:
  • hg命令不存在(-bash: hg: command not found)
  • openjdk.java.net网址打不开(测试机不能上网或者被墙)
  • 书中指导步骤跨度大(正所谓会者不难,有些步骤略过了,对著作者来说可能觉得不值一提吧)
  • apt-get命令不存在(书中虽说可以很多操作环境中进行构建openjdk,但是最终作者只是选择了Ubbuntu10.10进行实验的,并提供了相关的命令)
  • 测试机上一定要有一个jdk(因为即将构建的openjdk有一部分代码是使用java编写的,另外测试机上的jdk与即将构建的openjdk版本差距不能太大)
  • 测试机上一定要有ant(用于执行java编译代码中的ant脚本)
  • 安装失败却错误提示不明显(是不是之前重试过多次,可以删除掉生成目录ALT_OUTPUTDIR,再试一次)


好了,废话不多说了,老司机带你实战演练一下(如果你参照本例子未能搭建成功,可以在帖子下面留言,把详细的错误贴出来,看到后我一定回复助你成功)
一,环境说明:
这一点很重要,如果你选择的操作系统和计划编译的jdk版本与我的不同,失败的概率非常非常大,如果你是第一次搭建建议尽量与我的选择保持一致。
操作系统:CentOS release 6.4 (Final)
计划编译的jdk:openjdk7
现成的jdk:java version "1.6.0_25"(Java HotSpot(TM) 64-Bit Server VM (build 20.0-b11, mixed mode))


二,编译前准备工作如下
yum install -y mercurial
yum install -y ant ant-nodeps
yum install -y libX11* libX*
yum install -y libXi-devel libXtst-devel libXt-devel freetype* 
yum install -y alsa-lib-devel cups-devel
yum install -y gcc gcc-c++


三,下载计划编译的openjdk7(jdk源码网站:http://hg.openjdk.java.net/jdk7u/,你值得收藏)
hg clone http://hg.openjdk.java.net/jdk7u/jdk7u-dev
cd jdk7u-dev
chmod 755 get_source.sh 
./get_source.sh 


四,编译
4.1准备好编译环境


相关参数解释如下:
export LANG=C
#Bootstrap JDK的安装路径,必须设置
export ALT_BOOTDIR=/export/servers/jdk1.6.0_25/
#允许自动下载依赖
export ALLOW_DOWNLOADS=true


#并行编译的线数,设置和cpu的数量一致即可
export HOTSPOT_BUILD_JOBS=6
export ALT_PATALLER_COMPILE_JOBS=6


#比较本次build出来的映像与先前版本的差异,这对我们来说没有意义,
export SKIP_COMPARE_IMAGES=true
#使用预编译头文件,不加这个编译会更慢一些
export USE_PRECOMPILED_HEADER=true


#指定要编译的内容
export BUILD_LANGTOOLS=true
export BUILD_HOTSPOT=true
export BUILD_JDK=true
export BUILD_JAXP=false
export BUILD_JAXWS=false
export BUILD_CORBA=false


#要编译的版本
#export SKIP_DEBUG_BUILD=false
#export SKIP_FASTDEBUG_BUILD=true
export DEBUG_NAME=debug


#可以避开javaws和浏览器Java插件之类的部分build
BUILD_DEPLOY=false
#设置成false就不会build出包装包,因为包装包里有些奇怪的依赖
#但是即使不build出它也已经能得到完整的JDK映像,所以还是别build它好了
BUILD_INSTALL=false


#编译结果存放的路径
export ALT_OUTPUTDIR=/root/temp/jdk7u 


WARNINGS_ARE_ERRORS=


#卸载环境变量,避免诡异的事情发生
unset JAVA_HOME
unset CLASSPATH
unset JAVA_OPTS


#make 2>&1 | tee $ALT_OUTPUTDIR/build.log

好了,我们将上面一系列的环境变量,创建环境文件VAR来统一管理吧
vi VAR
export LANG=C
export ALT_BOOTDIR=/export/servers/jdk1.6.0_25/
export ALLOW_DOWNLOADS=true


export HOTSPOT_BUILD_JOBS=6
export ALT_PATALLER_COMPILE_JOBS=6


export SKIP_COMPARE_IMAGES=true
export USE_PRECOMPILED_HEADER=true
export BUILD_LANGTOOLS=true
export BUILD_HOTSPOT=true
export BUILD_JDK=true


export BUILD_JAXP=true
export BUILD_JAXWS=true
export BUILD_CORBA=true


#export SKIP_DEBUG_BUILD=false
#export SKIP_FASTDEBUG_BUILD=true


BUILD_DEPLOY=false
BUILD_INSTALL=false


export ALT_OUTPUTDIR=/root/temp/jdk7u 


#export CORBA_DIST=$ALT_OUTPUTDIR/corba/dist
#export JAXP_DIST=$ALT_OUTPUTDIR/jaxp/dist
#export JAXWS_DIST=$ALT_OUTPUTDIR/jaxws/dist


unset JAVA_HOME
unset CLASSPATH
unset JAVA_OPTS


使之生效
. VAR 


4.2检测设置是否全部正确
make sanity
当看到如下输出时则表示成功
Build Machine Information:
   build machine = workstation.centos.vbird


Build Directory Structure:
   CWD = /root/temp/jdk7u-dev
   TOPDIR = .
   LANGTOOLS_TOPDIR = ./langtools
   JAXP_TOPDIR = ./jaxp
   JAXWS_TOPDIR = ./jaxws
   CORBA_TOPDIR = ./corba
   HOTSPOT_TOPDIR = ./hotspot
   JDK_TOPDIR = ./jdk
   ……






Sanity check passed.


4.3真正开始编译
make (命令等同于make all)


成功的标志
#-- Build times ----------
Target all_product_build
Start 2017-08-04 17:21:58
End   2017-08-04 18:00:47
00:04:45 corba
00:08:37 hotspot
00:00:50 jaxp
00:00:53 jaxws
00:22:37 jdk
00:01:07 langtools
00:38:49 TOTAL
-------------------------
make[1]: Leaving directory `/root/temp/jdk7u-dev'


4.4测试自己编译出来的jdk吧
正确编译后,可以执行如下命令验证
/root/temp/jdk7u/j2sdk-image/bin/java -version
openjdk version "1.7.0-internal"
OpenJDK Runtime Environment (build 1.7.0-internal-root_2017_08_04_17_21-b00)
OpenJDK 64-Bit Server VM (build 24.80-b07, mixed mode)


OK,到些就大功告成了。


五,可能出现的错误
/usr/bin/ld: cannot find -lX11
collect2: ld returned 1 exit status
解决办法
yum install -y libX11*


/bin/sh: line 0: cd: /NOT-SET/re/jdk/1.7.0/promoted/latest/binaries/linux-amd64: No such file or directory
make[4]: *** [/root/temp/jdk7u/tmp/java/components_imported] Error 1
解决办法
VAR文件确认执行过了,正确的姿势
. VAR

猜你喜欢

转载自blog.csdn.net/com_ma/article/details/80768750