版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、明: 1. 本文來自于深入理解Java虛擬機(jī):JVM高級特性與最佳實踐第一章,轉(zhuǎn)載請注明出處。2. 作者推薦大家對本文“看過就算”,真正要編譯JDK的話,請不要選擇在Windows平臺編譯,難度嗯,應(yīng)該說是“麻煩程度”比Linux平臺編譯高幾個數(shù)量級。在Linux平臺的JDK編譯攻略,請參考撒迦這篇文章。相信我,哪怕你沒有Linux環(huán)境,臨時裝一個ubuntu,加上安裝操作系統(tǒng)的時間都比直接在Windows下編譯來得快。3. 如果要在Windows平臺編譯的話,看看是否需要把整個JDK(HotSpot、Library、Utils(如VisualVM等)、JAXWS、etc)都編譯出來
2、,相信大部分人只想要一個虛擬機(jī),那可以關(guān)閉掉其他部分的編譯,省事不少。但本文是按照“全部編譯”來寫的攻略。- 上面是嘮叨,下面是攻略,我是分割線 -1.5 實戰(zhàn):自己編譯JDK 想要一探JDK內(nèi)部的實現(xiàn)機(jī)制,最便捷的路徑之一就是自己編譯一套JDK,通過閱讀和跟蹤調(diào)試JDK源碼去了解Java技術(shù)體系的原理,雖然門檻會高一點,當(dāng)肯定會比閱讀各種文章、書籍來得更加貼近本質(zhì)些。另外JDK中的很多底層方法都是Native的,需要跟蹤這些方法的運作或?qū)DK進(jìn)行Hack的時候,都需要自己編譯一套JDK。 現(xiàn)在網(wǎng)絡(luò)上有不少開源的JDK實現(xiàn)可以供我們選擇,如Apache Harmony、O
3、penJDK等??紤]到Sun系列的JDK是現(xiàn)在使用得最廣泛的JDK版本,筆者選擇了OpenJDK進(jìn)行這次編譯實戰(zhàn)。 1.5.1 獲取JDK源碼 首先確定要使用的JDK版本,OpenJDK 6和OpenJDK 7都是開源的,源碼都可以在它們的主頁( 6的源碼其實是從OpenJDK 7的某個基線中引出的,然后剝離掉JDK 1.7相關(guān)的代碼,從而得到一份可以通過TCK 6的JDK 1.6實現(xiàn),因此直接編譯OpenJDK 7會更加“原汁原味”一些,其實這兩個版本的編譯過程差異并不大。 獲取源碼有兩種方式。一是通過Mercurial代碼版本管理工具從Repository中直
4、接取得源碼(Repository地址: Note都來得實在,不過壞處自然是太麻煩了一些,尤其是Mercurial遠(yuǎn)不如SVN、ClearCase或CVS之類的版本控制工具那樣普及。另外一種就是直接下載官方打包好的源碼包了,可以從Source Releases頁面(地址: 7 Early Access Source Build b121版,2010年12月9日發(fā)布的,大概81.7MB,解壓出來約308MB。 1.5.2 系統(tǒng)需求 如果可能,筆者建議盡量在Linux或Solaris上構(gòu)建OpenJDK,這要比在Windows平臺上輕松許多,而且網(wǎng)上能找到的資料絕大部分都是在Li
5、nux上編譯的。如果一定要在Windows平臺上編譯,建議讀者認(rèn)真閱讀一下源碼中的README-builds.html文檔(無論在OpenJDK網(wǎng)站上還是在下載的源碼包里面都有這份文檔),因為編譯過程中需要注意的細(xì)節(jié)非常多。雖然不至于像文檔上所描述的“Building the source code for the JDK requires a high level of technical expertise. Sun provides the source code primarily for technical experts who want to conduct research(編
6、譯JDK需要很高的專業(yè)技術(shù),Sun提供JDK源碼是為了技術(shù)專家進(jìn)行研究之用)”那么夸張,但是如果讀者是第一次編譯,那在上面耗費一整天乃至更多的時間都很正常。 筆者在本次實戰(zhàn)中演示的是在32位Windows 7平臺下編譯x86版的OpenJDK(也就是32位的JDK),如果需要編譯x64版,那毫無疑問也需要一個64位的操作系統(tǒng)。另外編譯涉及的所有文件都必須存放在NTFS格式的文件系統(tǒng)中,因為FAT32格式無法支持大小寫敏感的文件名。在官方文檔上寫到:編譯至少需要512MB的內(nèi)存和600MB的磁盤空間。如果讀者耐心很好的話,512MB的內(nèi)存基本上也可以湊合使用,不過600MB的磁盤空間僅
7、僅是指存放OpenJDK源碼和相關(guān)依賴項的空間,要完成編譯,600MB肯定是無論如何都不夠的,這次實戰(zhàn)中所下載的工具、依賴項、源碼,全部安裝、解壓完成最少(最少是指只下載C+編譯器,不下載VS的IDE)需要超過1GB的空間。 對系統(tǒng)的最后一點要求就是所有的文件,包括源碼和依賴項目,都不要放在包含中文或空格的目錄里面,這樣做不是一定不可以,只是這樣會為后續(xù)建立CYGWIN環(huán)境帶來很多額外的工作,這是由于Linux和Windows的磁盤路徑差別所導(dǎo)致的,我們也沒有必要自己給自己找麻煩。 1.5.3 構(gòu)建編譯環(huán)境 準(zhǔn)備編譯環(huán)境的第一步是去安裝一個CYGWIN
8、。這是一個在Windows平臺下模擬Linux運行環(huán)境的軟件,提供了一系列的Linux命令支持。需要CYGWIN的原因是在編譯中要使用GNU Make來執(zhí)行Makefile文件(C/C+程序員肯定很熟悉,如果只使用Java,那把這個東西當(dāng)做C+版本的ANT看待就可以了)。安裝CYGWIN時不能直接默認(rèn)安裝,因為表1-2中所示的工具都不會進(jìn)行默認(rèn)安裝,但又是編譯過程中需要的,因此要在圖1-6的安裝界面中進(jìn)行手工選擇。 表1-2 需要手工選擇安裝的CYGWIN工具 文件名分類包描述ar.exeDevelbinutilsThe GNU assembler, linker and
9、binary utilitiesmake.exeDevelmakeThe GNU version of the 'make' utility built for CYGWIN.m4.exeInterpretersm4GNU implementation of the traditional Unix macro processorcpio.exeUtilscpioA program to manage archives of filesgawk.exeUtilsawkPattern-directed scanning and processing languagefile.ex
10、eUtilsfileDetermines file type using 'magic' numberszip.exeArchivezipPackage and compress (archive) filesunzip.exeArchiveunzipExtract compressed files in a ZIP archivefree.exeSystemprocpsDisplay amount of free and used memory in the systemCYGWIN安裝時的定制包選擇界面如圖1-6所示: 圖1-6 CYGWIN安裝界面建
11、立編譯環(huán)境的第二步是安裝編譯器。JDK中最核心的代碼(Java虛擬機(jī)及JDK中Native方法的實現(xiàn)等)是使用C+語言及少量的C語言編寫的,官方文檔中說他們的內(nèi)部開發(fā)環(huán)境是在Microsoft Visual Studio C+ 2003(VS2003)中進(jìn)行編譯,同時也在Microsoft Visual Studio C+ 2010(VS2010)中測試過,所以最好只選擇這兩個編譯器之一進(jìn)行編譯。如果選擇VS2010,那么在編譯器之中已經(jīng)包含了Windows SDK v 7.0a,否則可能還要自己去下載這個SDK,并且更新PlatformSDK目錄。由于筆者沒有購買Visual Studio
12、2010的IDE,所以僅僅下載了VS2010 Express中提取出來的C+編譯器,這部分是免費的,但單獨安裝好編譯器比較麻煩。建議讀者選擇使用整套Visual Studio C+ 2010或Visual Studio C+ 2010 Express版進(jìn)行編譯。 需要特別注意的一點:CYGWIN和VS2010安裝之后都會在操作系統(tǒng)的PATH環(huán)境變量中寫入自己的bin目錄路徑,必須檢查并保證VS2010的bin目錄一定要在CYGWIN的bin目錄之前,因為這兩個軟件的bin目錄之中各自都有個連接器“l(fā)ink.exe”,但是只有VS2010中的連接器可以完成OpenJDK的編譯。
13、0;準(zhǔn)備JDK編譯環(huán)境的第三步就是下載一個已經(jīng)編譯好了的JDK。這聽起來也許有點滑稽要用雞蛋孵小雞還真得必須先養(yǎng)一只母雞呀?但仔細(xì)想想其實這個步驟很合理:因為JDK包含的各個部分(Hotspot、JDK API、JAXWS、JAXP)有的是使用C+編寫的,而更多的代碼則是使用Java自身實現(xiàn)的,因此編譯這些Java代碼需要用到一個可用的JDK,官方稱這個JDK為“Bootstrap JDK”。而編譯OpenJDK 7的話,Bootstrap JDK必須使用JDK6 Update 14或之后的版本,筆者選用的是JDK6 Update 21。 最后一個步驟是下載一個Apache ANT,
14、JDK中Java代碼部分都是使用ANT腳本進(jìn)行編譯的,ANT版本要求在1.6.5以上,這部分是Java的基礎(chǔ)知識,對本書的讀者來說應(yīng)該沒有難度,筆者就不再詳述。 1.5.4 準(zhǔn)備依賴項 前面說過,OpenJDK中開放的源碼并沒有達(dá)到100%,還有極少量的無法開源的產(chǎn)權(quán)代碼存在。OpenJDK承諾日后將逐步使用開源實現(xiàn)來替換掉這部分產(chǎn)權(quán)代碼,但至少在今天,編譯JDK還需要這部分閉源包,官方稱之為“JDK Plug”(注1) ,它們從前面的Source Releases頁面就可以下載到。在Windows平臺的JDK Plug是以Jar包的形式提供的,通過下面這條命令可以安裝它:
15、 Console代碼 1. java jar jdk-7-ea-plug-b121-windows-i586-09_dec_2010.jar 運行后將會顯示如圖1-7的協(xié)議,點擊ACCEPT接受協(xié)議,然后把Plug安裝到指定目錄即可。安裝完畢后建立一個環(huán)境變量“ALT_BINARY_PLUGS_PATH”,變量值為此JDK Plug的安裝路徑,后面編譯程序時需要用到它。 圖1-7 JDK Plug安裝協(xié)議除了要用到JDK Plug外,編譯時還需要引用JDK的運行時包,這個是編譯JDK中用Java代碼
16、編寫的那部分所需要的,如果僅僅是想編譯一個HotSpot虛擬機(jī)的話則可以不用。官方文檔把這部分稱之為“Optional Import JDK”,可以直接使用前面Bootstrap JDK的運行時包,我們需要建立一個名為“ALT_JDK_IMPORT_PATH”的環(huán)境變量指向JDK的安裝目錄。 第三步是安裝一個大于2.3版的FreeType ,這是一個免費的字體渲染庫,JDK的Swing部分和JConsole這類工具要使用到它。安裝好后建立兩個環(huán)境變量“ALT_FREETYPE_LIB_PATH”和“ALT_FREETYPE_HEADERS_PATH”,分別指向FreeTyp
17、e安裝目錄下的bin目錄和include目錄。另外還有一點官方文檔沒有提到但必須要做的事情是把FreeType的bin目錄加入到PATH環(huán)境變量中。 第四步是下載Microsoft DirectX 9.0 SDK(Summer 2004),安裝后大約有298MB,在微軟官方網(wǎng)站上搜索一下就可以找到下載地址,它是免費的。安裝后建立環(huán)境變量“ALT_DXSDK_PATH”指向DirectX 9.0 SDK的安裝目錄。 第五步是去尋找一個名為“MSVCR100.DLL”的動態(tài)鏈接庫,如果讀者在前面安裝了全套的Visual Studio 2010,那這個文件在本機(jī)就能找到,否則上網(wǎng)
18、搜索一下也能找到單獨的下載地址,大概有744KB。建立環(huán)境變量“ALT_MSVCRNN_DLL_PATH”指向這個文件所在的目錄。如果讀者選擇的是VS2003,這個文件名應(yīng)當(dāng)為“MSVCR73.DLL”,應(yīng)該在很多軟件中都包含有這個文件,如果找不到的話,前面下載的“Bootstrap JDK”的bin目錄中應(yīng)該也有一個,直接拿來用吧。 1.5.5 進(jìn)行編譯 現(xiàn)在需要下載的編譯環(huán)境和依賴項目都準(zhǔn)備齊全了,最后我們還需要對系統(tǒng)做一些設(shè)置以便編譯能夠順利通過。 首先執(zhí)行VS2010中的VCVARS32.BAT,這個批處理文件的目的主要是設(shè)置INCLUDE、LIB、和PA
19、TH這幾個環(huán)境變量,如果和筆者一樣只是下載了編譯器的話則需要手工設(shè)置它們,各個環(huán)境變量的設(shè)置值可以參考下面給出的代碼清單1-1中的內(nèi)容。批處理運行完之后建立“ALT_COMPILER_PATH”環(huán)境變量讓Makefile知道在哪里可以找到編譯器。 再建立“ALT_BOOTDIR”和“ALT_JDK_IMPORT_PATH”兩個環(huán)境變量指向前面提到的JDK 1.6的安裝目錄。建立“ANT_HOME”指向Apache ANT的安裝目錄。建立的環(huán)境變量很多,為了避免遺漏,筆者寫了一個批處理文件以供讀者參考,如代碼清單1-1所示。 代碼清單1-1 環(huán)境變量設(shè)置 Bat代碼
20、 1. SET ALT_BOOTDIR=D:/_DevSpace/JDK 1.6.0_21 2. SET ALT_BINARY_PLUGS_PATH=D:/jdkBuild/jdk7plug/openjdk-binary-plugs 3. SET ALT_JDK_IMPORT_PATH=D:/_DevSpace/JDK 1.6.0_21 4. SET ANT_HOME=D:/jdkBuild/apache-ant-1.7.0
21、5. SET ALT_MSVCRNN_DLL_PATH=D:/jdkBuild/msvcr100 6. SET ALT_DXSDK_PATH=D:/jdkBuild/msdxsdk 7. SET ALT_COMPILER_PATH=D:/jdkBuild/vcpp2010.x86/bin 8. SET ALT_FREETYPE_HEADERS_PATH=D:/jdkBuild/freetype-2.3.5-1-bin/include 9. SET ALT_F
22、REETYPE_LIB_PATH=D:/jdkBuild/freetype-2.3.5-1-bin/bin 10. 11. SET INCLUDE=D:/jdkBuild/vcpp2010.x86/include;D:/jdkBuild/vcpp2010.x86/sdk/Include;%INCLUDE% 12. SET LIB=D:/jdkBuild/vcpp2010.x86/lib;D:/jdkBuild/vcpp2010.x86/sdk/Lib;%LIB% 13. SET
23、0;LIBPATH=D:/jdkBuild/vcpp2010.x86/lib;%LIB% 14. SET PATH=D:/jdkBuild/vcpp2010.x86/bin;D:/jdkBuild/vcpp2010.x86/dll/x86;D:/Software/OpenSource/cygwin/bin;%ALT_FREETYPE_LIB_PATH%;%PATH% 最后還需要再進(jìn)行兩項調(diào)整,官方文檔沒有說明這兩項,但是必須要做完才能保證編譯過程的順利通過:一是取消環(huán)境變量JAVA_HOME,這點很簡單;另外一項是盡量在英文的操作系統(tǒng)上編譯
24、,估計大部分讀者會感到比較為難吧。如果不能在英文的系統(tǒng)上編譯就把系統(tǒng)的文字格式調(diào)整為“英語(美國)”,在控制面板-區(qū)域和語言選項的第一個頁簽中可以設(shè)置。如果這個設(shè)置還不能更改就建立一個“BUILD_CORBA”的環(huán)境變量,將值設(shè)置為false,取消編譯CORBA部分。否則Java IDL(idlj.exe)為*.idl文件生成CORBA適配器代碼的時候會產(chǎn)生中文注釋,而這些中文注釋會因為字符集的問題而導(dǎo)致編譯失敗。 完成了上述繁瑣的準(zhǔn)備工作之后,我們終于可以開始編譯了。進(jìn)入控制臺(Cmd.exe)后運行剛才準(zhǔn)備好的設(shè)置環(huán)境變量的批處理文件,然后輸入bash進(jìn)入Bourne Again
25、 Shell環(huán)境(習(xí)慣sh或ksh的讀者請自便)。如果JDK的安裝源碼中存在“jdk_generic_profile.sh”這個Shell腳本,先執(zhí)行它,筆者下載的OpenJDK 7 B121版沒有這個文件了,所以直接輸入make sanity來檢查我們前面所做的設(shè)置是否全部正確。如果一切順利幾秒鐘之后會有類似代碼清單1-2所示的輸出。 代碼清單1-2 make sanity檢查 Console代碼 1. D:jdkBuildopenjdk7>bash 2. bash-3.2$ make sanity
26、160; 3. cygwin warning: 4. MS-DOS style path detected: C:/Windows/system32/wscript.exe 5. Preferred POSIX equivalent is: /cygdrive/c/Windows/system32/wscript.exe 6. CYGWIN envi
27、ronment variable option "nodosfilewarning" turns off this warning. 7. Consult the user's guide for more details about POSIX paths: 8. 9. ( cd
28、160; ./jdk/make && 10. 11. 因篇幅關(guān)系,中間省略了大量的輸出內(nèi)容 12. 13. OpenJDK-specific settings: 14. FREETYPE_HEADERS_PATH = D:/jdkBuild/freetype-2.3.5-1-bin/include 15. ALT
29、_FREETYPE_HEADERS_PATH = D:/jdkBuild/freetype-2.3.5-1-bin/include 16. FREETYPE_LIB_PATH = D:/jdkBuild/freetype-2.3.5-1-bin/bin 17. ALT_FREETYPE_LIB_PATH = D:/jdkBuild/freetype-2.3.5-1-bin/bin 18.
30、; 19. OPENJDK Import Binary Plug Settings: 20. IMPORT_BINARY_PLUGS = true 21. BINARY_PLUGS_JARFILE = D:/jdkBuild/jdk7plug/openjdk-binary-plugs/jre/lib/rt-closed.jar 22. ALT_B
31、INARY_PLUGS_JARFILE = 23. BINARY_PLUGS_PATH = D:/jdkBuild/jdk7plug/openjdk-binary-plugs 24. ALT_BINARY_PLUGS_PATH = D:/jdkBuild/jdk7plug/openjdk-binary-plugs 25. BUILD_BINARY_PLUGS_PATH =
32、160;J:/re/jdk/1.7.0/promoted/latest/openjdk/binaryplugs 26. ALT_BUILD_BINARY_PLUGS_PATH = 27. PLUG_LIBRARY_NAMES = 28. 29. Previous JDK Settings: 30. PREVIOUS_RELEASE_PATH = USING-PREVIOUS_RELEASE_IMAGE 31. ALT_PREVIOUS_RELEAS
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024各類設(shè)備采購協(xié)議總覽
- 2024年新公司聘用勞動協(xié)議樣式
- 2024年場地調(diào)查委托協(xié)議模板
- 2024屆安徽江南十校高三數(shù)學(xué)試題畢業(yè)班4月質(zhì)量檢查試題
- 2024年勞務(wù)合作及就業(yè)保障協(xié)議
- 化信息技術(shù)硬件采購協(xié)議范本
- 2024年智能設(shè)備部署與維護(hù)協(xié)議
- 2024年蔬菜產(chǎn)業(yè)鏈戰(zhàn)略合作協(xié)議
- DB11∕T 1603-2018 睡蓮栽培技術(shù)規(guī)程
- 2024專業(yè)新風(fēng)系統(tǒng)安裝服務(wù)協(xié)議模板
- 1.1開放互動的世界
- 領(lǐng)導(dǎo)考察談話怎么評價領(lǐng)導(dǎo)
- 葉片氣動特性快速計算槳距角的改進(jìn)算法
- 幼兒園優(yōu)質(zhì)公開課:小班科學(xué)《奇妙的聲音》課件
- 2023非心臟外科手術(shù)圍手術(shù)期心血管疾病管理中國專家共識(完整版)
- 山東省淄博市張店區(qū)2022-2023學(xué)年七年級上學(xué)期期中英語試卷
- 04.第四講 堅持以人民為中心
- jgd280同步控制器使用說明
- 傳染病首診醫(yī)生負(fù)責(zé)制度傳染病首診負(fù)責(zé)制
- 胸腰椎壓縮骨折中醫(yī)治療難點及解決思路和措施
- 電梯維修保養(yǎng)總體施工方案
評論
0/150
提交評論