1. 编译环境
测试环境:Ubuntu 16.04 LST
已安装JDK:oracle 1.7.0_80-b15
编译目标:openjdk 7u
2. 安装依赖
sudo apt-get update
sudo apt-get install openjdk-7-jdk ccache make gcc g++ ca-certificates ca-certificates-java gawk libxext-dev libxrender-dev libxtst-dev libasound2-dev libcups2-dev libfreetype6-dev libcups2-dev
注意需要安装ant 的1.9.x版本,1.10.x版本以上需要依赖JDK8,这里编译JDK7 必须安装1.9.x
ant 官网:https://ant.apache.org/
ant-1.9.13的下载地址:
http://mirror.cc.columbia.edu/pub/software/apache//ant/binaries/apache-ant-1.9.13-bin.zip
3. 下载源码
# 安装jdk的版本控制系统hg
sudo apt install mercurial
# 克隆项目
hg clone http://hg.openjdk.java.net/jdk7u/jdk7u
# 进入项目
cd jdk7u
# 下载源码
sh get_source.sh
4. 检测环境是否搭建完毕
运行命令:
export LANG=C
unset JAVA_HOME
unset CLASSPATH
检测当前环境是否成功:
make sanity
如果有sanity check passed代表成功!
5. 开始编译
在openjdk 源代码目录创建make.sh文件,文件内容如下oracle jdk要根据不同机器进行更改,还有cpu内核数量,编译结果存放路径
需要修改自己的其中的ALT_BOOTDIR
#!/usr/bin/env bash
#语言选项,这个必须设置,否则编译好后会出现一个HashTable的NPE错
export LANG=C
#Bootstrap JDK的安装路径(就是已经安装的JDK的位置)。必须设置 。
export ALT_BOOTDIR=/usr/jdk7
#允许自动下载依赖
export ALLOW_DOWNLOADS=true
#并行编译的线程数,设置为和CPU内核数量一致即可
export HOTSPOT_BUILD_JOBS=4
export ALT_PARALLEL_COMPILE_JOBS=4
#比较本次build出来的映像与先前版本的差异。这个对我们来说没有意义,必须设置为false,否则sanity检查会报缺少先前版本JDK的映像。如果有设置dev或者DEV_ONLY=true的话这个不显式设置也行。
export SKIP_COMPARE_IMAGES=true
#使用预编译头文件,不加这个编译会更慢一些
export USE_PRECOMPILED_HEADER=true
#要编译的内容
export BUILD_LANGTOOLS=true
#export BUILD_JAXP=false
#export BUILD_JAXWS=false
#export BUILD_CORBA=false
export BUILD_HOTSPOT=true
export BUILD_JDK=true
#要编译的版本
#export SKIP_DEBUG_BUILD=false
#export SKIP_FASTDEBUG_BUILD=true
#export DEBUG_NAME=debug
#把它设置为false可以避开javaws和浏览器Java插件之类的部分的build。
BUILD_DEPLOY=false
#把它设置为false就不会build出安装包。因为安装包里有些奇怪的依赖,但即便不build出它也已经能得到完整的JDK映像,所以还是别build它好了。
BUILD_INSTALL=false
#编译结果所存放的路径
export ALT_OUTPUTDIR=/home/ice/jvm/build
#这两个环境变量必须去掉,不然会有很诡异的事情发生(我没有具体查过这些“”诡异的事情”,Makefile脚本检查到有这2个变量就会提示警告“)
unset JAVA_HOME
unset CLASSPATH
make 2>&1 | tee $ALT_OUTPUTDIR/build.log
sh make.sh
在笔者的电脑上用了17分钟:
网友评论