天天看點

編譯OpenJDK7(ubuntu14.4)編譯OpenJDK7(ubuntu14.4)

編譯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.

繼續閱讀