深入Java2 SDK原始碼(一)(轉(zhuǎn))
發(fā)表時間:2024-02-14 來源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]王森臺灣交通大學(xué)科技管理研究所moli.mt88g@nctu.edu.tw█前言 到目前為止,Sun Microsystems的網(wǎng)站上只釋出了Java2 SDK 1.3 Win32版本的原始碼,而Java2 SDK Solaris/Linux版本的原始碼最多只到1.2.2。因此本文內(nèi)容只適用于Ja...
王森
臺灣交通大學(xué)科技管理研究所
moli.mt88g@nctu.edu.tw
█前言
到目前為止,Sun Microsystems的網(wǎng)站上只釋出了Java2 SDK 1.3 Win32版本的原始碼,而Java2 SDK Solaris/Linux版本的原始碼最多只到1.2.2。因此本文內(nèi)容只適用于Java2 SDK 1.3的Win32版本原始碼。所有的操作皆在Windows 2000 Professional操作系統(tǒng)上經(jīng)過測試。如果您在不同的平臺上驗證本文內(nèi)容,或是使用將來釋出的Solaris版本、Linux版本的原始碼。我們無法保證會有相同的結(jié)果。
█簡介
據(jù)說信息社會的演進有個lifecycle,從早期每個人的辦公桌上只有一部終端機的時代慢慢進步到PC時代,然后我們發(fā)現(xiàn)逐漸地潮流又走回NC(Network Computer),廠商鼓吹thin client的時代。對于原始碼的看法亦是如此,從早期廠商在出售的機器內(nèi)附上程序原始碼供顧客自行修改,然后漸漸地程序代碼變成廠商獨有而不愿公開的資產(chǎn),最后又演變成大家鼓吹Open Source、Free Software的時代。姑且不論普羅大眾是否真的有興趣去trace附在您計算機之中的原始碼,但是我想這就是開放原始法最可貴的地方 – 大家都有機會一窺系統(tǒng)的內(nèi)部行為,自己計算機上資料的安全以及程序的運作方式再也不會掌控在特定廠商的手上,有了原始碼,我們在也不用懷疑是否某個廠商的操作系統(tǒng)或是應(yīng)用程序會偷偷地在背后將您的資料回傳到他們公司的服務(wù)器中。
隨著這股開放原始碼的潮流,Java2 SDK的原始碼其實已經(jīng)release出來很長一段時間了,但是采用的License為Sun Community Source Code License(SCSL),與一般我們討論到Open Source時所會提到的General Public License(GPL)有所不同。相信最近大家會發(fā)現(xiàn),在相關(guān)文章中也開始提及將Java SDK改用General Public License釋出的議題。當今年10月Sun將Star Office的原始碼以General Public License釋出之后,接下來大家所期待的就是Sun將Java SDK的原始碼以General Public License釋出,如果此事成真,那幺Java今后的發(fā)展將不是我們目前所能預(yù)測的,如果成功,那幺Java會像Linux一樣展翅高飛,如果沒有成功,那幺將可能像Mozilla計劃一般雷聲大雨點小。
先姑且不論哪個License比較open,哪個比較free,筆者撰寫此系列文章的目的只有一個,就是挖掘出存在于Java2 SDK內(nèi)部的運作機制。由于筆者從事Java的教育工作已有一段時間,教過的學(xué)生越多,越是深感自己對Java的認識仍然有限,舉凡我們常用的執(zhí)行檔(exe,例如javac.exe、java.exe等)、幾個重要的動態(tài)連結(jié)函式庫(dll,例如jvm.dll、java.dll等),以及其它使用Java程序語言所撰寫的套件(package,例如java.io、java.util等),這些都是我想認真去了解的課題,因而有本系列的誕生。
當然,trace別人的程序代碼這種事情乍看之下有點像是程序黑手在做的事情,但是筆者深深覺得,臺灣的軟件工業(yè)要站上國際舞臺仍然需要很長一段時間。從大觀點來看,系統(tǒng)分析、系統(tǒng)設(shè)計、系統(tǒng)測試、如何妥善地分配有限人力這些議題上,至少我們還沒有辦法舉出哪些國內(nèi)公司將這些工作做的十分出色,從Java2 SDK的原始碼結(jié)構(gòu)中,我們可以看到開發(fā)一套SDK(Software Development Kit)時采用的團隊組織架構(gòu)之縮影,原始碼的位置怎幺放? 那幺多程序設(shè)計師寫出來的程序如何整合在一起發(fā)揮縱效? 如何讓文件的產(chǎn)生自動化? 我想我們一定可以從Java2 SDK的原始碼得到一些答案。從小觀點來看,如何善用Design Pattern? 如何寫出有效率的程序代碼? 如何讓程序設(shè)計師寫出來的程序代碼具有一致性? 我們都知道Java內(nèi)部的套件大量地使用了Design Pattern,我們也知道Java因為虛擬機器的關(guān)系,所以程序代碼必須非常地有效率,相信這些問題也能夠從Java2 SDK的原始碼獲得答案。
大力推展Open Source的開發(fā)中國家也非常清楚,開放原始碼將是開發(fā)中國家趕上已開發(fā)國家軟件工業(yè)的終南快捷方式。期待個人的努力可以成為這個大革命中一顆不可或缺小螺絲釘。
在本系列的第一篇中,筆者將介紹Java2 SDK原始碼的概觀,先讓讀者具有取得Java2 SDK原始碼并能夠成功編譯這些原始碼的能力。廢話不多說,讓我們開始吧!
█如何取得Java2 SDK 原始碼
要取得Java2 SDK的原始碼,首先您必須要是Java Developer Connection(JDC)的一員,所以請您先到http://developer.java.sun.com/developer/網(wǎng)站上注冊,取得使用者ID和密碼。如下圖所示:
http://www.csdn.net/expert/wangsen/artic01.jpg
當您成功成為Java Developer Connection(JDC)的一員之后,請您到http://www.sun.com/software/communitysource/java2/,您將會看到下載Java2 SDK原始碼的選項,點選進去之后,輸入您在Java Developer Connection(JDC)的使用者ID和密碼,確認您接受License之后,就可以開始下載Java2 SDK的原始碼。如下圖所示:
http://www.csdn.net/expert/wangsen/artic02.jpg
█Java2 SDK 原始碼之架構(gòu)
當您解開Java2 SDK原始碼的壓縮檔之后,您會看到如下圖所示的目錄結(jié)構(gòu):
http://www.csdn.net/expert/wangsen/artic4.gif
build目錄
放置了所有的makefile檔,這些makefile為Visual Studio內(nèi)附的nmake.exe所能解讀的格式。通常makefile的檔名有五種,分別是Makefile、*.nmk、*.jmk(指定要編譯的 .java檔)、*.cmk(指定要編譯的 .c檔)、*.mk。在build\share底下您還可以找到一些 .java檔。
由于我們要編譯的是Windows操作系統(tǒng)下的Java SDK,所以Makefile的主檔為build\win32\Makefile,整個Java2 SDK的編譯流程都是根源于這個檔案,在build\win32\makefiles目錄之下您可以找到共享的Makefile,通常附檔名為 .nmk。
build\win32目錄下的makefile都是用來建造和Windows操作系統(tǒng)相關(guān)的程序。而在build\share目錄底下就多為 .mk、.jmk、.cmk檔,這些檔案通常用來建造和Windows操作系統(tǒng)無關(guān)的程序。
ext目錄
這個目錄底下放置了用來支持Java2 SDK函式庫的makefile與原始碼,這些原始碼皆使用Java程序語言所撰寫。
ext\i18n目錄下放置了與國際化(internationalization)相關(guān)的函式庫,這些編譯過的檔案最后都被放到i18n.jar里頭。
ext\jpda目錄下放置了與Java平臺除錯器架構(gòu)(Java Platform Debugger Architecture)相關(guān)的檔案。
src目錄
這個目錄放置了所有建構(gòu)Java SDK所需要用到的 .c文件(以C程序語言撰寫)以及 .java文件(以Java程序語言撰寫)。
src\win32目錄下都是用來建造和Windows操作系統(tǒng)相關(guān)的原始碼。而在src\share目錄底下就多為與Windows操作系統(tǒng)無關(guān)的原始碼。因此聰明的讀者們應(yīng)該可以猜到大部分Java標準套件的原始碼大多放在src\share目錄之下。這些標準套件的原始碼在最后都被加入到src.jar之中,而編譯過的 .class檔則被打散放入許多不同的jar檔內(nèi)。
LegalReadme.html
Sun Community Source Code License版權(quán)宣告
OriginalCode.txt
Java2 SDK原始碼中所有檔案的列表。
README.html
關(guān)于Java2 SDK原始碼的說明,該內(nèi)容大部分都已經(jīng)被筆者吸收而整合到這篇文章之中。
從Java2 SDK原始碼的架構(gòu)中,我們可以發(fā)現(xiàn)其檔案的放置方法很獨特,是采用makefile與原始碼分開放置的做法,不同于一般我們所見(例如Linux kernel原始碼)采makefile和原始碼放在一起的做法。這兩種做法各有利弊。以Linux Kernel原始碼的做法,每次編譯完成之后,您將看到原始碼檔案和編譯過程中產(chǎn)生的中間檔混雜在一起,感覺有點混亂。如果我們采用Java2 SDK原始碼的目錄結(jié)構(gòu),每次編譯出來的中間檔和原始碼就會分隔在不同的目錄下,看起就非常賞心悅目,但是,這樣放置的代價就是makefile里頭對于路徑的參照變得十分復(fù)雜,您將會在Java2 SDK原始碼的makefile中發(fā)現(xiàn)很多 ..\..\..\src 的敘述,看起來真是不舒服,如果我們要了解該執(zhí)行檔是由哪些檔案構(gòu)成的時候就很辛苦了。
█如何編譯Java2 SDK 原始碼
當我們深入了解Java2 SDK原始碼之后,很多工程師必定想自己嘗試修改原始碼,然后進行編譯,我想這是身為一個工程師最大的樂趣。當然,在我們還沒有修改之前,我們也必須試著編譯整個原始碼,順便測試一下原始碼是否完整,因此接下來要介紹編譯Java 2原始碼的準備步驟和方法。
要順利編譯Java2 SDK原始碼,您必須符合底下幾種條件:
操作系統(tǒng)
您必須在Windows NT 4.0或是Windows 2000上才能順利編譯Java 2原始碼。一旦編譯完成之后,所產(chǎn)生的執(zhí)行文件或是動態(tài)連結(jié)和式庫將能夠在所有的Win32作業(yè)平臺上執(zhí)行。
硬設(shè)備
在Java2 SDK原始碼內(nèi)附的文件之中,建議的硬設(shè)備為Pentium等級的處理器,配上至少128 MB的內(nèi)存。在筆者的計算機上,Pentium III 450配上PC 100 128 MB 的內(nèi)存,總共花了將近2.5個小時完成所有編譯動作。如果算上編譯時期遇到的一些錯誤以及恢復(fù)錯誤的時間,大概花了3個小時。
開發(fā)工具
我們必須準備幾項工具,他們分別是: - Microsoft Visual C++ version 6.0,并配上最新的Service pack(或者Visual Studio 97配上Service Pack 3)。
在Java2 SDK原始碼之中,存在有許多與Windows平臺相關(guān)的程序代碼,這些程序代碼都以C語言撰寫而成,為了順利編譯這些原生程序代碼,我們必須要借助Visual C++編譯器以便產(chǎn)生能在Windows平臺上執(zhí)行的執(zhí)行檔(.exe)以及動態(tài)連結(jié)和式庫(.dll)。
同時,Java2 SDK原始碼之中有許多Makefile,這些Makefile是用來控制所有程序的編譯動作。我們必須借助Visual C++內(nèi)附的nmake.exe這個工具以幫助我們解讀這些Makefile并順利編譯出整個Java2 SDK。 - MKS Toolkit version 5.2以上的版本。
MKS Toolkit是一套能夠在Windows上仿真UNIX執(zhí)行環(huán)境的工具,請到http://www.mks.com下載這套工具的30天試用版(正式版必須要付費);蛘呷绻杏嗛哅DSN Profession以上的版本,您可以在光盤中找到Microsoft Windows Services for UNIX 2.0 Add-On Pack(在UNIX20_INSERV\3RDPARTY\MKS目錄底下,執(zhí)行x86子目錄中的setup.exe即可安裝)。30天試用版的功能騎士和付費版本的功能一樣,只不過當您在編譯Java2 SDK原始碼的時候,只要用到了MKS Toolkit里的工具,就會出現(xiàn)一個廣告畫面罷了,應(yīng)該不會影響您的心情才是。 - Java2 SDK 1.3的可執(zhí)行版本。
相信讀者們看到這個地方,一定會覺得很疑惑。奇怪,編譯Java2 SDK的原始碼竟然也需要Java2 SDK的協(xié)助? 不禁讓人想起雞生蛋蛋生雞的問題,不是嗎? 其實Java2 SDK在整個編譯過程中,扮演的是bootstrap compiler(靴帶式編譯器)的角色。之所以需要Java2 SDK的原因是因為大家在編譯Java程序時所使用的javac.exe核心程序竟然也是用Java撰寫而成的,由于Java2 SDK的原始碼有許多與平臺無關(guān)、以Java程序語言所撰寫的程序,因此在編譯初期,我們必須借助過去舊版的Java2 SDK或是JDK幫助我們產(chǎn)生新版的Java2 SDK,再利用新產(chǎn)生的新版javac.exe編譯Java2 SDK原始碼內(nèi)的其它 .java檔。
當大家將所有必備的條件都準備妥當之后,接著我們要開始準備編譯前的相關(guān)工作。底下的內(nèi)容將有下列假設(shè):