系統(tǒng)準備
本次編譯目標的是 JDK8 fastdebug版本
編譯 JDK 耗費的時間會比較多,如果想編譯的快一點,最好還是給他足夠的內(nèi)存和CPU,不推薦使用Windows編譯,配置環(huán)境相當麻煩,推薦使用Linux 和 Mac OS ,我使用的是VMware安裝Ubuntu 18.0403 LTS(64位)版,配置如下:

我僅編譯就耗時20分鐘左右,內(nèi)存最低最好也要大于4GB,編譯的 JDK 版本越高,對內(nèi)存和硬盤的占用越大!!
如果你是新的系統(tǒng),不要忘記將 apt的源改為國內(nèi)的,要不然下面安裝依賴將會非常緩慢!改源比較簡單,網(wǎng)上也很多教程,請自行搜索。
依賴安裝
打開終端,拷貝下面的命令一步一步的進行安裝,這些都是必須依賴,務必保證順利安裝!
- 安裝 GCC
sudo apt-get install build-essential
- 安裝FreeType
sudo apt-get install libfreetype6-dev
- 安裝CUPS
sudo apt-get install libcups2-dev
- 安裝X11
sudo apt-get install libx11-dev libxext-dev libxrender-dev libxrandr-dev libxtst-dev libxt-dev
- 安裝ALSA
sudo apt-get install libasound2-dev
- 安裝libffi
sudo apt-get install libffi-dev
- 安裝Autoconf
sudo apt-get install autoconf
- 安裝Mercurial
sudo apt-get install mercurial
- 安裝ccache
sudo apt-get install ccache
JDK 很多組成的部分是用 Java 語言來實現(xiàn)的,因此我們需要安裝一個編譯時可以用的 JDK 環(huán)境,稱之為 BootStrap JDK 。要求 JDK 的 大 版本號是 需要編譯版本的前一個,也就是說,我們要編譯 JDK8,需要 一個JDK7作為BootStrap JDK。
提供一個華為的 JDK7下載源
安裝 JDK 不再贅述,自行 關鍵字 “ Ubuntu 安裝 JDK7 ” 搜索
安裝完成效果如下:

下載源碼
在下載位置(路徑中不要包含中文)打開終端,使用 mercurial 克隆源碼項目,輸入下面命令
hg clone http://hg.openjdk.java.net/jdk8u/jdk8u60/

下載完成之后進入到目錄內(nèi)
cd jdk8u60
運行目錄內(nèi)的獲取源碼的shell文件,等待下載完成
bash ./get_source.sh

可以看到下方出現(xiàn)WARNING,說明有些文件沒有下載成功,重復執(zhí)行下載源碼的腳本,直到?jīng)]有警告
出現(xiàn)這種說明下載完成

編譯
還是在這個目錄中,配置一下編譯參數(shù),我編譯的是一個 fastdebug版本的僅包含 Server 模式的虛擬機
bash configure --enable-debug --with-jvm-variants=server
出現(xiàn)下面的信息時,說明配置參數(shù)成功!

如果你需要編譯其他版本或模式,輸入一下命令查看 configure 可用的命令參數(shù),自行組合
bash configure --help
無論你是編譯什么版本的,下面就是真正開始編譯了,這也是出錯最多的地方
編譯命令
make images
開始編譯

編譯成功

到 build/linux-x86_64-normal-server-fastdebug/jdk/bin 下執(zhí)行 java -version命令
./java -version

編譯看似就一行命令,然后等十幾分鐘就可以了。其實不然,我嘗試編譯了近20次,源碼重新下載了5次,遇到十幾種錯誤,折騰了10個多小時,最終編譯成功。所以如果編譯報錯不要灰心,網(wǎng)上教程還是不少的,自己組合一下,然后讀一下報錯的信息,針對性的改一下,最終還是都能編譯成功的!
所以我將我遇到的錯誤也整合了一下,其實看似挺多錯誤,有很多其實是并不影響最終編譯成功的,我就挑比較多的比較重要的錯誤說一下!
編譯報錯處理
先總結一下為什么會報錯,首先 JDK8 已經(jīng)是很多年前的東西了,而我們編譯使用的系統(tǒng)和軟件不是最新的也是JDK8后出來好幾年的了,所以 90%的編譯錯誤都是由于環(huán)境不匹配問題引起,如果你是編譯比較新的 JDK 可能就不會遇到這種問題。
下面所有的出現(xiàn) 重新編譯 的關鍵字的,必須執(zhí)行下面命令,然后再次執(zhí)行 編譯章節(jié)的配置參數(shù)命令和編譯命令
make clean
make dist-clean
下面修改的所有文件都是在源碼目錄內(nèi)
1. check_os_version
錯誤信息如下:

這種錯誤時由于你的內(nèi)核版本引起的
首先查看自己的內(nèi)核版本
uname -r

我這里內(nèi)核版本為5
打開 hostspot/make/linux 下的MakeFile,找到對應的支持系統(tǒng)版本的行,發(fā)現(xiàn)并不支持 5

將我們的內(nèi)核版本添加上然后保存

重新編譯
2. 未指定BootStarp Class Path
報錯信息如下:

打開 hostspot/make/linux/makefiles/rules.make 文件

可以看到 javac 默認設置的版本是 6 ,我們的BootStrap JDK 版本為 7,所以修改為 7,保存文件

重新編譯
3. gcc 和 g++ 版本過高問題
異常信息

查看自己的gcc版本和g++版本
gcc -v
g++ -v
版本最好控制在 5.0以下吧,具體我沒測試,我是修改為 4.8 成功!
安裝 gcc 和 g++ 4.8
sudo apt-get install gcc-4.8 g++-4.8
查看已安裝的 gcc版本
ls /usr/bin/gcc*
配置新安裝 gcc 的4.8的啟動優(yōu)先級為 100
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.8 100
配置舊 gcc 的啟動優(yōu)先級為 100(我的版本是7 ,根據(jù)你系統(tǒng)版本修改)
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-7 100
切換gcc版本為 4.8,按提示操作
sudo update-alternatives --config gcc
配置新安裝 g++ 的4.8的啟動優(yōu)先級為 100
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.8 100
配置舊 g++ 的啟動優(yōu)先級為 100(我的版本是7 ,根據(jù)你系統(tǒng)版本修改)
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-7 100
切換 g++ 版本為 4.8,按提示操作
sudo update-alternatives --config g++
使用上面 查看版本命令查看是否正確切換
成功切換后,重新編譯
這種錯誤也有人說修改下面文件 ,將紅框內(nèi)注釋掉就可以解決,我使用時沒有效果,不如切換低版本 gcc 省心

