手动编译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™ 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=KaTeX parse error: Expected 'EOF', got '#' at position 26: …DIR/corba/dist #̲export JAXP_DIS…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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值