編譯OpenJDK7(ubuntu14.4)
正在學習《深入了解java虛拟機第2版》,在第一章的執行個體中,自己動手對openjdk7進行編譯。以下是實驗過程。本實驗是在ubuntu14.04下進行的,編譯的openjdk為openjdk 7,依賴的jdk為openjdk 6,使用用自己編譯的jdk,莫名有種成就感。
注意:在編譯openjdk7時,Bootstrap JDk必須使用 Jdk6 update 14 或之後的版本
openjdk7源碼擷取
直接從官網下載下傳源碼包即可 openJDK7
擷取源碼包之後,需要對源碼包進行解壓
unzip openjdk-7u75-src-b13-18_dec_2014.zip
安裝依賴
在使用下面的指令可一次安裝完成
apt install build-essential gawk m4 libmotif3 libasound2-dev libcups2-dev libxrender-dev xorg-dev xutils-dev x11proto-print-dev binutils libmotif-dev ant
安裝BootStrap jdk6
apt install openjdk-6-jdk
遇見問題1:
如果系統使用的是ubuntu16.04; 安裝 libmotif3 時 如果出現錯誤
E: Package 'libmotif4' has no installation candidate
隻是因為在最新的Ubuntu 16.04中不存在libmotif4,是以會發生此錯誤。
我們隻需從libmotif4中下載下傳deb檔案,從檔案下載下傳到的目錄運作以下指令:
sudo dpkg -i libmotif4_2.3.4-8ubuntu1_amd64.deb
進行編譯
此時我們需要的編譯環境和依賴項目都準備完成,最後隻需對系統的環境變量進行簡單設定以便編譯的順利通過。
設定LANG 和ALT_BOOTDIR,必須設定
#語言選項,這個必須設定,否則編譯好後會出現一個HashTable的NPE錯
export LANG=C
#Bootstrap JDK的安裝路徑。必須設定
export ALT_BOOTDIR=/usr/lib/jvm/java-1.6.0-openjdk-amd64
#允許自動下載下傳依賴
export ALLOW_DOWNLOADS=true
#并行編譯的線程數,設定為和CPU核心數量一緻即可
export HOTSPOT_BUILD_JOBS=6
export ALT_PARALLEL_COMPILE_JOBS=6
#比較本次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
#把它設定為false可以避開javaws和浏覽器Java插件之類的部分的build
BUILD_DEPLOY=false
#把它設定為false就不會build出安裝包。因為安裝包裡有些奇怪的依賴,
#但即便不build出它也已經能得到完整的JDK映像,是以還是别build它好了
BUILD_INSTALL=false
如果之前設定了
JAVA_HOME
和
CLASSPATH
兩個環境變量 ,在編譯之前必須取消,否則會發生”詭異的事情“
unset CLASSPATH
unset JAVA_HOME
在設定完成之後,可以輸入
make sanity
來檢查我們前面的設定是否全部正确,該步驟必須在我們之前解壓後的openjdk檔案夾中下進行
[email protected]:~# cd openjdk
[email protected]:~/openjdk# make sanity
makefile的Sanity檢查過程輸出了編譯所需的所有環境變量,如果看見
‘ Sanity check passed. ’
則代表檢查通過。
Build Platform Settings:
USER = root
PLATFORM = linux
ARCH = amd64
LIBARCH = amd64
ARCH_FAMILY = amd64
ARCH_DATA_MODEL = 64
ARCHPROP = amd64
ALSA_VERSION = 1.1.0
OS_VERSION = 4.15.0-107-generic [requires at least 2.6]
OS_VARIANT_NAME = Ubuntu
OS_VARIANT_VERSION = 16.04
MB_OF_MEMORY = 2978
-----------------------------省略部分------------------------------
Previous JDK Settings:
PREVIOUS_RELEASE_PATH = USING-PREVIOUS_RELEASE_IMAGE
ALT_PREVIOUS_RELEASE_PATH =
PREVIOUS_JDK_VERSION = 1.6.0
ALT_PREVIOUS_JDK_VERSION =
PREVIOUS_JDK_FILE =
ALT_PREVIOUS_JDK_FILE =
PREVIOUS_JRE_FILE =
ALT_PREVIOUS_JRE_FILE =
PREVIOUS_RELEASE_IMAGE = /usr/lib/jvm/java-1.8.0-openjdk-amd64
ALT_PREVIOUS_RELEASE_IMAGE =
Sanity check passed.
接下來可以輸入
make
執行整個OpenJDK 編譯(make不帶參數 , 預設為make all)
編譯的時間有點長,耐心等待。。。
遇見問題2
使用‘make’編譯時會,出現 check_os_version 錯誤,這是為了阻止源碼在老版本上被編譯
解決方法:
方法一: 添加對應的核心版本
SUPPORTED_OS_VERSION = 2.4% 2.5% 2.6% 3% 4%
方法二: 在
make
時添加參數
DISABLE_HOTSPOT_OS_VERSION_CHECK=ok
我使用的是方法二
make DISABLE_HOTSPOT_OS_VERSION_CHECK=ok
遇見問題3:time is more than 10 years from present
Error: time is more than 10 years from present: 1136059200000
java.lang.RuntimeException: time is more than 10 years from present: 1136059200000
at build.tools.generatecurrencydata.GenerateCurrencyData.makeSpecialCaseEntry(GenerateCurrencyData.java:285)
at build.tools.generatecurrencydata.GenerateCurrencyData.buildMainAndSpecialCaseTables(GenerateCurrencyData.java:225)
at build.tools.generatecurrencydata.GenerateCurrencyData.main(GenerateCurrencyData.java:154)
解決方法:
修改
jdk/src/share/classes/java/util/CurrencyData.properties
檔案
vim jdk/src/share/classes//java/util/CurrencyData.properties
#修改108
AZ=AZM;2019-12-31-20-00-00;AZN
#修改381行
MZ=MZM;2019-06-30-22-00-00;MZN
#修改443行
RO=ROL;2019-06-30-21-00-00;RON
#修改535行
TR=TRL;2019-12-31-22-00-00;TRY
#修改561行
VE=VEB;2019-01-01-04-00-00;VEF
vim顯示怎麼行号?
按ESC鍵 然後輸入
:set nu
,回車 即可
改過之後
按ESC鍵 然後輸入
:wq
,儲存并退出 即可
下面是編譯成功的結果
#-- Build times ----------
Target all_product_build
Start 2020-07-06 20:05:03
End 2020-07-06 20:12:18
00:00:08 corba
00:00:05 hotspot
00:00:02 jaxp
00:00:02 jaxws
00:06:56 jdk
00:00:02 langtools
00:07:15 TOTAL
-------------------------
end.