您的位置:首页 > 编程语言 > Java开发

老司机手把手教你自己编译jdk

2017-08-04 18:07 183 查看
相信很多人都看过《深入理解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

(如果你参照本例子未能搭建成功,可以在帖子下面留言,把详细的错误贴出来,看到后我一定回复助你成功)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  jdk 编译