linux 編譯openjdk失敗記
阿新 • • 發佈:2018-11-09
- 最近開始學習jvm虛擬機器的知識,第一章就是自己編譯一個openjdk,結果編譯時遇到一個問題,嘗試了好久都沒能解決,心累的不想再試了。所以打算先繼續往下學習,等以後如果有毅力再來試一試,另寫下這篇部落格謹記錄自己編譯openjdk失敗了的過程和遇到的錯誤。
一、安裝linux系統
- 首先我是在windows平臺上操作的,所以得先安裝虛擬機器軟體VMware,安裝教程百度。linux映象我來選擇的是ubuntu-14.04.5,安裝教程百度。由於編譯openjdk需要用到root的許可權,建議先獲取root許可權(教程:https://blog.csdn.net/u014296316/article/details/82120341
二、下載編譯原始碼openjdk
- 這裡我們選擇的是openjdk7
- 下載地址:https://download.java.net/openjdk/jdk7/promoted/b147/openjdk-7-fcs-src-b147-27_jun_2011.zip
- 放置到linux上並解壓
三、配置編譯環境
- 編譯openjdk你需c++的編譯環境和jdk的編譯環境,至於為什麼需要安裝以下軟體我完全一臉懵逼,對c++的環境也完全不理解,也以至於遇到的那個問題查出是什麼問題也也解決不了。廢話不多說,安裝如下:
- 首先開啟終端(Crtl+Alt+T),以root賬戶進行操作
1.安裝gcc、g++、make等
sudo apt-get install build-essential
2.安裝XRender
sudo apt-get install libxrender-dev
sudo apt-get install xorg-dev
3.安裝alsa
sudo apt-get install libasound2-dev (daozhe)
4.Cups
sudo apt-get install libcups2-dev
5.安裝零碎的工具包
sudo apt-get install gawk zip libxtst-dev libxi-dev libxt-dev
6.關於安裝ant與jdk
- 由於第一次不懂,ant與jdk我是自己下載安裝包進行安裝的,安裝方式很簡單,把安裝包下載下來,解壓到安裝目錄即可
- 我使用的ant的下載地址:http://mirrors.shu.edu.cn/apache//ant/binaries/apache-ant-1.9.13-bin.tar.gz
- 關於jdk,一開始我是使用jdk1.7的版本,後來編譯時不通過,發現只能使用jdk1.6的版本我選擇的是6u45,下載時還有oracle賬戶,百度一下即有提供者,地址:http://www.oracle.com/technetwork/java/javasebusiness/downloads/java-archive-downloads-javase6-419409.html#jdk-6u21-oth-JPR
- 配置環境變數,在/etc/profile檔案末尾新增如下配置(配置環境變數方式)
//自己的安裝路徑
export JAVA_HOME=/opt/jdk1.6.0_45
// 在檔案最後新增ant環境
export ANT_HOME=/opt/ant
// 並把jdk,ant環境新增到path中
export PATH=$JAVA_HOME/bin:$ANT_HOME/bin:$PATH
- 也可以如上自動安裝ant和jdk
sudo apt-get install openjdk-6-jdk
sudo apt-get install ant
四、編寫測試指令碼
- 這是我那不成氣候,看不明白,東拼西湊的shell指令碼,如果看出什麼錯誤希望不吝賜教
- 指令碼檔案以.sh格式結尾,然後在終端,選擇到該檔案所在的目錄,以./xxx.sh方式執行該指令碼
#!/bin/bash
#export LANG=C ALT_BOOTDIR=/opt/jdk1.6.0_45
#export -n JAVA_HOME
#export ALT_JDK_IMPORT_PATH=/opt/openjdk
#export ALT_OUTPUTDIR=/home/ubnutu64/Downloads/test
#make sanity BUILD_JAXWS=false BUILD_JAXP=false
cd /opt/openjdk
# export ALT_BOOTDIR
export LANG=C ALT_BOOTDIR=/opt/jdk1.6.0_45
# set build profile,first 'chmod +x jdk_generic_profile.sh'
jdk/make/jdk_generic_profile.sh
# disable JAVA_HOME
export -n JAVA_HOME
# export ALT_JDK_IMPORT_PATH
export ALT_JDK_IMPORT_PATH=/opt/openjdk
export ALT_DROPS_DIR=/opt/openjdk/drop
# start build
export ALLOW_DOWNLOADS=true
#把它設定為FALSE可以避免javaws和瀏覽器Java外掛之類的部分build
BUILD_DEPLOY=false
#把它設定為false就不會build出安裝包。因為安裝包裡有一些奇怪的依賴
#但即便不build出它也已經得到完整的JDK映象,所以還是不用build它
BUILD_INSTALL=false
#存放編譯結果
export ALT_OUTPUTDIR=/opt/openjdk/build
make DEBUG_NAME=all_fastdebug
#make DEBUG_NAME=all_fastdebug BUILD_JAXWS=false BUILD_JAXP=false
五、編譯遇到的問題及解決方式
1./usr/local/openjdk7-debug/jaxws/build/xml_generated/build-drop-jaf_src.xml:96: Redirection detected from https to http. Protocol switch unsafe, not allowed.
- 原因:是jdk7-jaf-2010_08_19.zip這個包下載不了導致的
- 解決方案
將以下三個檔案下載後置於OpenJDK解壓後根目錄下的drop目錄下,
並在環境變數中加入配置:export ALT_DROPS_DIR=/usr/local/src/openjdk7/drop # 注意目錄Path
jdk7-jaf-2010_08_19.zip,下載地址:https://netix.dl.sourceforge.net/project/jdk7src/input-archives/jdk7-jaf-2010_08_19.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
jaxp145_01.zip,下載地址:http://download.java.net/jaxp/1.4.5/jaxp145_01.zip
2.java.lang.RuntimeException: time is more than 10 years from present
- 原因:openjdk的部分設定時間超時
- 解決方案:
修改(openjdk下的目錄)jdk/src/share/classes/java/util/CurrencyData.properties,將裡面日期改為距當前日期內的十年以內的日期。
有108、439、529、555等行
3./opt/openjdk/hotspot/src/share/vm/runtime/interfaceSupport.hpp:430:0: error: “__LEAF” redefined [-Werror]
- 問題:在linux的標頭檔案cdefs.h裡,有個__LEAF的巨集,這個和hotspot/src/share/vm/runtime/interfaceSupport.hpp這個標頭檔案中的巨集定義有衝突
- 解決方案:
在interfaceSupport.hpp檔案例增加一個#undef __LEAF 的定義
4./openjdk/hotspot/src/share/vm/oops/constantPoolOop.cpp:272:39: error: converting ‘false’ to pointer type ‘methodOop’ [-Werror=conversion-null]
- 問題:返回值型別問題
- 解決方案:
有兩個解決方法,一個是加上強轉型別,另一個是返回NULL
1 return (methodOop)false;
2 return NULL;
5.openjdk/hotspot/src/share/vm/opto/loopnode.cpp:896:50: error: converting ‘false’ to pointer type ‘Node*’ [-Werror=conversion-null]
* 原因:同第四點一樣
* 解決方案:
loopnode.cpp檔案內找到該句
if (cpool->cache() == NULL) return false; // nothing to load yet
並改為
if (cpool->cache() == NULL) return NULL;
6.未解決錯誤
- 最後就卡在這裡,查不到解決方案
/opt/openjdk/build/tmp/sun/javax.sound/jsoundalsa/obj64/PLATFORM_API_LinuxOS_ALSA_Ports.o: In function `setRealVolume':
PLATFORM_API_LinuxOS_ALSA_Ports.c:(.text+0xe2b): undefined reference to `snd_mixer_selem_get_playback_volume_range'
PLATFORM_API_LinuxOS_ALSA_Ports.c:(.text+0xe66): undefined reference to `snd_mixer_selem_set_playback_volume'
PLATFORM_API_LinuxOS_ALSA_Ports.c:(.text+0xe79): undefined reference to `snd_mixer_selem_get_capture_volume_range'
PLATFORM_API_LinuxOS_ALSA_Ports.c:(.text+0xeb0): undefined reference to `snd_mixer_selem_set_capture_volume'
/opt/openjdk/build/tmp/sun/javax.sound/jsoundalsa/obj64/PLATFORM_API_LinuxOS_ALSA_Ports.o: In function `PORT_SetIntValue':
PLATFORM_API_LinuxOS_ALSA_Ports.c:(.text+0xc3b): undefined reference to `snd_mixer_selem_set_capture_switch_all'
PLATFORM_API_LinuxOS_ALSA_Ports.c:(.text+0xc4a): undefined reference to `snd_mixer_selem_set_playback_switch_all'
collect2: error: ld returned 1 exit status
make[5]: *** [/opt/openjdk/build/lib/amd64/libjsoundalsa.so] Error 1
make[5]: Leaving directory `/opt/openjdk/jdk/make/javax/sound/jsoundalsa'
make[4]: *** [build] Error 1
make[4]: Leaving directory `/opt/openjdk/jdk/make/javax/sound'
make[3]: *** [all] Error 1
make[3]: Leaving directory `/opt/openjdk/jdk/make/javax'
- 補充:大概就記得有這些錯誤了,大部分都能百度得到解決,除了最後一個錯誤,如果有大神知道希望不吝賜教,本人萬分感激