在Centos7下自己編譯openjdk源碼,openjdk
具體步驟:
獲取openjdk源碼
安裝openjdk6–BoostrapJK
安裝編譯時的依賴
配置環境變量
編譯
1. 獲取openjdk源碼
可以到這裡去下載,OpenJDK Source Releases
我下載的是openjdk-7u40版本,openjdk7,update40,build43
2. 下載jdk6–BoostrapJDK
我使用jdk6來輔助編譯。可以到oracle官網下載,jdk-6u45-linux-x64.bin
3.安裝編譯時的依賴
可以使用以下命令一次安裝完成
[code]yum -y install build-essential gawk m4
openjkd-6-jkd libasound2-dev libcups2-dev
libxrender-dev xorg-dev xutils-dev
xllproto-print-dev binutils libmotif3
libmotif-dev ant
3.配置環境變量,編譯
OpenJKD在編譯時讀取的環境變量很多,但是大多數都有默認值,必須設置的只有兩個:LANG和ALT_BOOTDIR。分別為C跟bootJDK的路徑
所有的環境變量可以使用下面的腳本設置:
[code]
export LANG=C
#Bootstrap JDK 安裝位置
export ALT_BOOTDIR=/opt/openJDK/jdk1.6.0_45
#允許自動下載
export ALLOW_DOWNLOADS=true
#並行編譯的線程數,和CPU內核數量一致即可
export HOTSPOT_BUILD_JOBS=2
export ALT_PARALLEL_COMPILE_JOBS=2
#比較本次build出來的映像與先前版本的差異,對於我們沒喲意義,
#必須設置為false
export SKIP_COMPARE_IMAGES=true
#使用預編譯頭文件,不加這個編譯會更慢一些
export USE_PRECOMPILED_HEADER=true
#要編譯的內容
export BUILD_LANGTOOLS=true
export BUILD_HOTSPOT=true
export BUILD_JDK=true
#把它設置為false,可以避開javaws和浏覽器java插件的build
BUILD_DEPLOY=false
#把它設置為false就不會build出安裝包。因為安裝包裡有些奇怪的依賴
BUILD_INSTALL=false
#編譯結果所存放的路徑
export ALT_OUTPUTDIR=/opt/openJDK/openjdk/build
#這兩個變量必須去掉
unset CLASSPATH
unset JAVA_HOME
unset LD_LIBRARY_PATH
全部設置結束之後,可以輸入 make sanity 檢測是否正確,如果一切順利,會輸出:Sanity check passed.就可以編譯了。
輸入make(不加參數默認為make all),我的虛擬機配置比較低,整個編譯的過程用了一個多鐘。
結果如下: 我在虛擬機中編譯的,而且配置不高,所以有點慢.
那麼問題來了,如何看結果ne? 編譯完成之後,進入OpenJDK源碼下的build/j2sdk-image目錄,(或者build-debug、build-fastdebug這兩個目錄),這是整個JDK完整編譯結果,內容為debug版jdk,將其復制到%JAVA_HOME%下,替換Oracle JDK。就可以作為一個完整的JDK使用,編譯出來的虛擬機,在-version命令中帶有用戶的機器名。
[code][root@localhost ~]# java -version
openjdk version "1.7.0-internal-debug"
OpenJDK Runtime Environment (build 1.7.0-internal-debug-root_2016_04_25_20_00-b00)
OpenJDK 64-Bit Server VM (build 24.0-b56-jvmg, mixed mode)
大多數情況我們只關心Hotspot虛擬機,只想單獨編譯它的話,那麼使用hotspot/make目錄下的MakeFile進行替換即可,其他參數與前面一致,這時候虛擬機的輸出結果存放在
build/hotspot/outputdir/linux_amd64_compiler2
中,裡面對應了不同的優化級別的目錄。
進入 目錄jvmg,在運行虛擬機前,還要手工編輯目錄下的env.sh文件,這個文件由編譯腳本自動產生,用於設置虛擬機的環境變量,裡面已經發布了”JAVA_HOME,CLASSPATH,HOTSPOT_BUILD_USER” 3個環境變量,還需要增加一個“LD_LIBRSRY_CLASSPATH”:
{% codeblock lang:java %}
LD_LIBRARY_PATH=.:JAVAHOME/jre/lib/amd64/nativethreads:{JAVA_HOME}/jre/lib/amd64/native_threads:{JAVA_HOME}/jre/lib/amd64:/opt/openJDK/openjdk/build/hotspot/outputdir/linux_amd64_compiler2/product
export LD_LIBRARY_PATH
{% endcodeblock %}
然後執行
[code]. ./env.sh
./gama -version #有可能是test_gamma,這是自帶的一段八皇後代碼
結果如下 自己編譯的虛擬機成功運行起來,哈哈哈~
編譯過程中有可能報錯:
Error: time is more than 10 years from present: 1104530400000 when building java/openjdk* lists.freebsd.org
通過修改CurrencyData.properties文件, 把10年之前的時間修改為10年之內即可
Index: /usr/openjdk/jdk/src/share/classes/java/util/CurrencyData.properties
把2006改掉就可以重新編譯了
參考文檔:
http://www.guinguo.top/2016/05/03/JVM%E5%AD%A6%E4%B9%A0%E4%B9%8BOpenJDK%E6%BA%90%E7%A0%81%E7%BC%96%E8%AF%91/