1. 我的環(huán)境
- CentOS 7
- JDK 1.7
一定要確保是Hotspot JDK盯质,不要是其他的JDK,比如JRocket,這個jdk是用于編譯我們的openJDK的表伦,即Bootstrap JDK,所以這個jdk的版本不能和要編譯的openJDK的版本差距過大慷丽。
2. 安裝依賴的軟件
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++
一定要確保上述軟件都已安裝成功蹦哼。
3. 下載計劃安裝的openjdk
依次運行以下命令:
hg clone http://hg.openjdk.java.net/jdk8u/jdk8u-dev
cd jdk8u-dev
chmod 755 get_source.sh
./get_source.sh
一開始是想編譯jdk7u,但編譯過程中出現(xiàn)了libjvm.so的問題盈魁,據(jù)說這就是OpenJDK 和 Bootstrap JDK 版本沖突引起的 BUG翔怎,可以將 JDK 版本改為 JDK6 最新版,或者將 OpenJDK 改為 OpenJDK8 來解決該問題杨耙,我選擇了后者赤套。
4. 準(zhǔn)備編譯腳本
在jdk8u-dev中新建一個build.sh文件,內(nèi)容如下:
#! /bin/bash
#設(shè)置語言
export LANG=C
#Bootstrap JDK的安裝路徑珊膜,必須設(shè)置
export ALT_BOOTDIR=/opt/jdk1.7.0_80
#允許自動下載依賴
export ALLOW_DOWNLOADING=true
#并行編譯的線數(shù)容握,設(shè)置和cpu的數(shù)量一致即可
export HOTSPOT_BUILD_JOBS=2
export ALT_PARALLEL_COMPILE_JOBS=2
#比較本次build出來的映像與先前版本的差異,這對我們來說沒有意義
export SKIP_COMPARE_IMAGES=true
#使用預(yù)編譯頭文件车柠,不加這個編譯會更慢一些
export USE_PRECOMPILED_HEADER=true
#指定要編譯的內(nèi)容
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
#設(shè)置成false就不會build出包裝包剔氏,因為包裝包里有些奇怪的依賴
#但是即使不build出它也已經(jīng)能得到完整的JDK映像,所以還是別build它好了
BUILD_INSTALL=false
#編譯結(jié)果存放的路徑
export ALT_OUTPUTDIR=/opt/openjdk_8u172
#卸載環(huán)境變量竹祷,避免詭異的事情發(fā)生
unset JAVA_HOME
unset JRE_HOME
unset CLASSPATH
unset JAVA_OPTS
make 2>&1 | tee $ALT_OUTPUTDIR/build.log
確保把所有可能影響編譯的JAVA_HOME谈跛、JRE_HOME、CLASSPATH塑陵、JAVA_OPTS環(huán)境變量都去掉感憾。
5. 開始編譯
編譯1.8跟之前版本的有些區(qū)別,需要先執(zhí)行configure:
bash ./configure
再執(zhí)行我們的shell腳本:
./build.sh
執(zhí)行開頭出現(xiàn)下列警告:
WARNING: You have the following ALT_ variables set:
ALT_PARALLEL_COMPILE_JOBS=2 ALT_BOOTDIR=/opt/jdk1.7.0_80 ALT_OUTPUTDIR=/opt/openjdk_8u
ALT_ variables are deprecated and will be ignored. Please clean your environment.
Building OpenJDK for target 'default' in configuration 'linux-x86_64-normal-server-release'
說明定義的這些ALT_開頭的環(huán)境變量在編譯1.8版本時都不需要了令花,有默認(rèn)的配置阻桅,編譯還是可以繼續(xù)下去凉倚,編譯完成:
但這樣得到的是release版,而我們需要的是可以調(diào)試的版本嫂沉,其實我們可以省略第4個步驟(如果已經(jīng)編譯完成稽寒,先刪除./build目錄),直接運行下面的命令:
bash ./configure --with-target-bits=64 --with-boot-jdk=/opt/jdk1.7.0_80/ --with-debug-level=slowdebug --enable-debug-symbols ZIP_DEBUGINFO_FILES=0
make all ZIP_DEBUGINFO_FILES=0
--with-debug-level=slowdebug:指定可以生成最多的調(diào)試信息趟章;
--enable-debug-symbols ZIP_DEBUGINFO_FILES=0:生成調(diào)試的符號信息杏糙,并且不壓縮;
再次編譯成功:
找到j(luò)2sdk_image蚓土,測試我們的編譯結(jié)果:
如果大家不想編譯jdk8或遇到其他一些坑搔啊,可以參考這篇文章:OpenJDK編譯防入坑指南,如果確定就是要編譯jdk8北戏,就直接看這篇:CentOS上編譯OpenJDK8源碼 以及 在eclipse上調(diào)試HotSpot虛擬機源碼