老司机手把手教你自己编译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
(如果你参照本例子未能搭建成功,可以在帖子下面留言,把详细的错误贴出来,看到后我一定回复助你成功)
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
(如果你参照本例子未能搭建成功,可以在帖子下面留言,把详细的错误贴出来,看到后我一定回复助你成功)
相关文章推荐
- 《深入java虚拟机--JVM高级特性与最佳实践》学习笔记(一) 编译自己的JDK
- 激动啊,终于诞生了,编译了属于俺自己的 JDK
- 【分享】Linux(Ubuntu)下如何自己编译JDK
- 自己编译JDK[转]
- linux 6.2自己编译JDK
- 自己动手编译JDK
- JVM系列(一):自己编译jdk遇到的一些坑
- maven编译指定使用自己配置的jdk而不是eclipse自带的解决方法
- 深入理解Java虚拟机 自己编译JDK
- 激动啊,终于诞生了,编译了属于俺自己的 JDK
- VC6.0上成功编译ACE和使用ACE连接自己程序时候的手把手配置方案
- 【深入理解Java虚拟机】之自己编译JDK
- 1.6 实战:自己编译JDK
- 实战自己编译JDK
- 自己动手在Linux下编译JDK
- 【深入理解Java虚拟机】之自己编译JDK(已经完成,其中有自己遇到的各种问题及解决办法)
- [深入理解Java虚拟机]第一章实战 自己编译JDK
- 自己编译JDK
- 自己编译的Android sdk不能被识别的问题
- FastRCNN 训练自己数据集 (1编译配置)