一起編譯JDK吧! :)

系統(tǒng)準備

本次編譯目標的是 JDK8 fastdebug版本

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

image-20200730140626369

我僅編譯就耗時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 ” 搜索

安裝完成效果如下:

image-20200730144219246

下載源碼

在下載位置(路徑中不要包含中文)打開終端,使用 mercurial 克隆源碼項目,輸入下面命令

hg clone http://hg.openjdk.java.net/jdk8u/jdk8u60/
image-20200730154741956

下載完成之后進入到目錄內(nèi)

cd jdk8u60

運行目錄內(nèi)的獲取源碼的shell文件,等待下載完成

bash ./get_source.sh 
image-20200730155821298

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

出現(xiàn)這種說明下載完成

image-20200730170658112

編譯

還是在這個目錄中,配置一下編譯參數(shù),我編譯的是一個 fastdebug版本的僅包含 Server 模式的虛擬機

bash configure --enable-debug --with-jvm-variants=server

出現(xiàn)下面的信息時,說明配置參數(shù)成功!

image-20200730170802332

如果你需要編譯其他版本或模式,輸入一下命令查看 configure 可用的命令參數(shù),自行組合

bash configure --help

無論你是編譯什么版本的,下面就是真正開始編譯了,這也是出錯最多的地方

編譯命令

make images

開始編譯

image-20200730170852165

編譯成功

image

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

./java -version
image

編譯看似就一行命令,然后等十幾分鐘就可以了。其實不然,我嘗試編譯了近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

錯誤信息如下:

image-20200730171813686

這種錯誤時由于你的內(nèi)核版本引起的

首先查看自己的內(nèi)核版本

uname -r
image-20200730171851349

我這里內(nèi)核版本為5

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

image-20200730172118235

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

image-20200730172214169

重新編譯

2. 未指定BootStarp Class Path

報錯信息如下:

image-20200730175135172

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

image-20200730175439593

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

image-20200730175912960

重新編譯

3. gcc 和 g++ 版本過高問題

異常信息

image-20200730180804255

查看自己的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 省心

image-20200730181021929
image-20200730181056348
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容