一、環境
Linux 系統:CentOS_6.5_x86_64
JDK 安裝包:jdk-7u80-linux-x64.rpm
OpenJDK 源碼包:OpenJDK7
下載路徑:http://download.java.net/openjdk/jdk7/promoted/b147/openjdk-7-fcs-src-b147-27_jun_2011.zip
ANT 安裝包:apache-ant-1.8.3-bin.zip
下載路徑:http://archive.apache.org/dist/ant/binaries/apache-ant-1.8.3-bin.zip
網絡環境:聯網,因為有些包需要 yum 下載
二、操作步驟
1)安裝必要的軟件
安裝 jdk-7u80-linux-x64.rpm(命令:rpm -ivh jdk-7u80-linux-x64.rpm)
安裝 ant,步驟如下:
①解壓(命令:unzip apache-ant-1.8.3-bin.zip)
②把解壓出來的文件夾移動到預期的安裝目錄
③配置環境變量,打開 /etc/profile 文件,添加 ant 環境變量的配置,如下:
![]()
④更新配置文件(命令:source /etc/profile)
⑤查看是否安裝正常(命令:ant -version)
2)上傳OpenJDK源碼包,可上傳到任意目錄(例如:/tmp/jdkBuild),並解壓(命令:unzip openjdk-7-fcs-src-b147-27_jun_2011.zip)
3)配置環境變量
#語言選項,這個必須設置,否則編譯好后會出現一個HashTable的NPE錯 export LANG=C #Bootstrap JDK的安裝路徑。必須設置 export ALT_BOOTDIR=/usr/java/jdk1.7.0_80 export ALT_JDK_IMPORT_PATH=/usr/java/jdk1.7.0_80 #ant路徑設置 export ANT_HOME=/opt/apache-ant-1.8.3 #允許自動下載依賴 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 #要編譯的版本 #export SKIP_DEBUG_BUILD=false #export SKIP_FASTDEBUG_BUILD=true #export DEBUG_NAME=debug #把它設置為 false 可以避開 javaws 和瀏覽器 Java 插件之類的部分的 build BUILD_DEPLOY=false #把它設置為 false 就不會 build 出安裝包。因為安裝包里有些奇怪的依賴 #但即便不 build 出它也已經能得到完整的 JDK 映像,所以還是別 build 它好了 BUILD_INSTALL=false #編譯結果所存放的路徑 export ALT_OUTPUTDIR=/tmp/jdkBuild/build #這兩個環境變量必須去掉,不然會有很詭異的事情發生(我沒有具體查過這些"詭異的事情",Makefile腳本檢查到有這 2 個變量就會提示警告) unset JAVA_HOME unset CLASSPATH
4)進入OpenJDK源碼目錄,檢查配置是否全部正確(命令:make sanity),檢查成功,效果如下:
5)開始編譯(命令:make 2>&1 | tee $ALT_OUTPUTDIR/build.log)
三、問題解決
1) make sanity 提示 check your value of ALT_CUPS_HEADERS_PATH
原因:缺少cups-devel
解決方式:安裝 cups-devel (命令:yum install cups-devel.x86_64)
2) yum 安裝提示 Couldn't resolve host![]()
原因:域名解析服務器未配置
解決方式:
方式一:(重啟系統或網絡服務后,修改會丟失)打開文件 /etc/resolv.conf ,添加域名服務器的地址配置
方式二:(永久修改)打開 linux 的網絡配置文件 /etc/sysconfig/network-scripts/ifcfg-eth0,添加如下配置,重啟系統或重啟網絡服務(命令:service network restart)
3)yum 安裝提示 The requested URL returned error: 404 Not Found![]()
原因:系統下載文件的時候識別到的 releasever 錯誤
解決方式:打開文件 /etc/yum.repos.d/CentOS-Base.repo ,修改 baseurl 值
4) make sanity 提示 FreeType version 2.3.0 or higher is required
原因:freetype 字體錯誤
解決方式:安裝 freetype(命令:yum install freetype.x86_64 freetype-devel.x86_64)
5) make sanity 提示 The version of ant being used is older![]()
原因:未安裝 ant 或 ant 版本太低
解決方式:安裝 ant,見上方步驟
6) make sanity 提示 You seem to not have installed ALSA 0.9.1 or higher
原因:缺少alsa的包
解決方式:安裝alsa的包(命令:yum install alsa*)
7)make 編譯提示 Redirection detected from https to http. Protocol switch unsafe, not allowed![]()
原因:在這個build-drop-jaf_src.xml的96行中獲取包下載的地址失效或有問題,就會導致改問題發生,這時你需要把那些包自己下載,主要是jdk7-jaf-2010_08_19.zip這個包下載不了
解決方式:
①下載依賴的jaxp、jaf、jaxws
jaxp145_01.zip: http://download.java.net/jaxp/1.4.5/jaxp145_01.zip
jdk7-jaxws2_2_4-b03-2011_05_27.zip: http://download.java.net/glassfish/components/jax-ws/openjdk/jdk7/jdk7-jaxws2_2_4-b03-2011_05_27.zip
jdk7-jaf-2010_08_19.zip:https://netix.dl.sourceforge.net/project/jdk7src/input-archives/jdk7-jaf-2010_08_19.zip
②進入openjdk源碼目錄,創建drop文件夾(命令:mkdir drop),移動三個包到drop目錄下
③配置環境變量(命令:export ALT_DROPS_DIR=/tmp/jdkBuild/openjdk/drop)
④再次執行make編譯命令
8)make 編譯提示 g++: Command not found
原因:g++沒有安裝或沒有更新
解決方式:安裝或更新g++(命令:yum -y update gcc 或 yum -y install gcc+ gcc-c++)
9)make 編譯提示 symbol JVM_SetNativeThreadName, version SUNWprivate_1.1 not defined in file libjvm.so with link time reference
原因:不明
解決方式:換成jdk6來編譯openjdk7,修改為jdk6后,需同時修改環境變量,如下:
export ALT_BOOTDIR=/usr/java/jdk1.6.0_45
export ALT_JDK_IMPORT_PATH=/usr/java/jdk1.6.0_45
10)make 編譯提示 time is more than 10 years from present
原因:時間不對
解決方式:修改 openjdk 源碼目錄下 CurrencyData.properties 文件內的時間
文件路徑:openjdk/jdk/src/share/classes/java/util/CurrencyData.properties,時間修改為10年以內即可(我不確定是哪個時間的影響,那就都修改吧),修改位置如下:



11)make 編譯提示 /usr/bin/ld: cannot find -lX11
原因:缺少 X11 相關的包
解決方式:安裝libX11(命令:yum install *X11*)
12)make 編譯提示 error: X11/Intrinsic.h: No such file or directory
原因:缺少 Xt-devel 的包
解決方式:安裝 Xt-devel(命令:yum install libXt-devel)
13)make 編譯提示 error: X11/extensions/shape.h: No such file or directory
原因:缺少 libXtst 的包
解決方式:安裝 libXtst(命令:yum install libXtst-devel)
14)make 編譯提示 error: X11/extensions/Xrender.h: No such file or directory
原因:缺少 Xrender-devel 的包
解決方式:安裝 Xrender-devel(命令:yum install libXrender-devel)
四、腳本匯總
初始化配置腳本:initBuild(命令:source initBuild)
export LANG=C export ALT_BOOTDIR=/usr/java/jdk1.6.0_45 export ALT_JDK_IMPORT_PATH=/usr/java/jdk1.6.0_45 export ANT_HOME=/opt/apache-ant-1.8.3 export ALLOW_DOWNLOADS=true export HOTSPOT_BUILD_JOBS=4 export ALT_PARALLEL_COMPILE_JOBS=4 export SKIP_COMPARE_IMAGES=true export USE_PRECOMPILED_HEADER=true export BUILD_LANGTOOLS=true export BUILD_HOTSPOT=true export BUILD_JDK=true BUILD_DEPLOY=false BUILD_INSTALL=false export ALT_OUTPUTDIR=/tmp/jdkBuild/build export ALT_DROPS_DIR=/tmp/jdkBuild/openjdk/drop unset JAVA_HOME unset CLASSPATH
初始化安裝腳本:initInstall.sh(命令:./initInstall.sh)
yum install cups-devel.x86_64 yum install freetype.x86_64 freetype-devel.x86_64 yum install alsa* yum -y install gcc+ gcc-c++ yum install *X11* yum install libXt-devel yum install libXtst-devel yum install libXrender-devel
五、參考資料
源碼官網下載鏈接:
https://blog.csdn.net/chenyyhh92/article/details/78298510
編譯JDK問題參考:
http://chenjingbo.iteye.com/blog/1117021
https://blog.csdn.net/pangencheng/article/details/80072880

