深入 Java2 SDK源码(一)
Java2 SDK源码概观
作者 : 王森 (国立交通大学科技管理研究所)
到目前为止,Sun Microsystems的网站上只释出了Java2 SDK 1.3 Win32
版本的源码,而Java2 SDK Solaris/Linux版本的源码最多只到1.2.2
。因此本文内容只适用於Java2 SDK 1.3的Win32版本源码。所有的操作
皆在 Windows 2000 Professional作业系统上经过测试。如果您在不同的
平台上验证本文内容,或是使用将来释出的Solaris版本、Linux版本的原
始码。我们无法保证会有相同的结果。
█简介
据说资讯社会的演进有个lifecycle,从早期每个人的办公桌上只有一
部终端机的时代慢慢进步到PC时代,然後我们发现逐渐地潮流又走回NC(N
etwork Computer),厂商鼓吹thin client的时代。对於源码的看法亦
是如此,从早期厂商在出售的机器内附上程式源码供顾客自行修改,然
後渐渐地程式码变成厂商独有而不愿公开的资产,最後又演变成大家鼓吹
Open Source、Free Software的时代。姑且不论普罗大众是否真的有兴趣
去 trace附在您电脑之中的源码,但是我想这就是开放原始法最可贵的
地方 – 大家都有机会一窥系统的内部行为,自己电脑上资料的安全以及
程式的运作方式再也不会掌控在特定厂商的手上,有了源码,我们在也
不用怀疑是否某个厂商的作业系统或是应用程式会偷偷地在背後将您的资
料回传到他们公司的伺服器中。
随著这股开放源码的潮流,Java2 SDK的源码其实已经release出来
很长一段时间了,但是采用的License为Sun Community Source Code Lic
ense(SCSL),与一般我们讨论到Open Source时所会提到的General Publi
c License(GPL)有所不同。相信最近大家会发现,在相关文章中也开始提
及将 Java SDK改用General Public License释出的议题。当今年10月Sun
将 Star Office的源码以General Public License释出之後,接下来大
家所期待的就是 Sun将Java SDK的源码以General Public License释出
,如果此事成真,那么Java今後的发展将不是我们目前所能预测的,如果
成功,那么Java会像Linux一样展翅高飞,如果没有成功,那么将可能像M
ozilla计划一般雷声大雨点小。
先姑且不论哪个License比较open,哪个比较free,笔者撰写此系列文
章的目的只有一个,就是挖掘出存在於 Java2 SDK内部的运作机制。由於
笔者从事Java的教育工作已有一段时间,教过的学生越多,越是深感自己
对Java的认识仍然有限,举凡我们常用的执行档(exe,例如javac.exe、j
ava.exe等)、几个重要的动态连结函式库(dll,例如jvm.dll、java.dll
等),以及其他使用Java程式语言所撰写的套件(package,例如java.io、
java.util等),这些都是我想认真去了解的课题,因而有本系列的诞生。
当然,trace别人的程式码这种事情乍看之下有点像是程式黑手在做的
事情,但是笔者深深觉得,台湾的软件工业要站上国际舞台仍然需要很长
一段时间。从大观点来看,系统分析、系统设计、系统测试、如何妥善地
分配有限人力这些议题上,至少我们还没有办法举出哪些国内公司将这些
工作做的十分出色,从 Java2 SDK的源码结构中,我们可以看到开发一
套 SDK(Software Development Kit)时采用的团队组织架构之缩影,原始
码的位置怎么放? 那么多程式设计师写出来的程式如何整合在一起发挥纵
效 ? 如何让文件的产生自动化? 我想我们一定可以从Java2 SDK的源码
得到一些答案。从小观点来看,如何善用Design Pattern? 如何写出有效
率的程式码? 如何让程式设计师写出来的程式码具有一致性? 我们都知道
Java内部的套件大量地使用了Design Pattern,我们也知道Java因为虚拟
机器的关系,所以程式码必须非常地有效率,相信这些问题也能够从Java
2 SDK的源码获得答案。
大力推展Open Source的开发中国家也非常清楚,开放源码将是开发
中国家赶上已开发国家软件工业的终南捷径。期待个人的努力可以成为这
个大革命中一颗不可或缺小螺丝钉。
在本系列的第一篇中,笔者将介绍Java2 SDK源码的概观,先让读者
具有取得 Java2 SDK源码并能够成功编译这些源码的能力。废话不多
说,让我们开始吧 !
█如何取得Java2 SDK 源码
要取得Java2 SDK的源码,首先您必须要是Java Developer Connecti
on(JDC)的一员,所以请您先到http://developer.java.sun.com/develop
er/网站上注册,取得使用者ID和密码。当您成功成为Java Developer Co
nnection(JDC)的一员之後,请您到http://www.sun.com/software/commu
nitysource/java2/,您将会看到下载Java2 SDK源码的选项,点选进去
之後,输入您在Java Developer Connection(JDC)的使用者ID和密码,确
认您接受 License之後,就可以开始下载Java2 SDK的源码。
█Java2 SDK 源码之架构
当您解开Java2 SDK源码的压缩档之後,您会看到如下图所示的目录
结构 :
◇build目录
放置了所有的makefile档,这些makefile为Visual Studio内附的nmake
.exe所能解读的格式。通常makefile的档名有五种,分别是Makefile、*.
nmk、*.jmk(指定要编译的 .java档)、*.cmk(指定要编译的 .c档)、*.mk
。在 build\share底下您还可以找到一些 .java档。
由於我们要编译的是Windows作业系统下的Java SDK,所以Makefile的
主档为 build\win32\Makefile,整个Java2 SDK的编译流程都是根源於这
个档案,在 build\win32\makefiles目录之下您可以找到共用的Makefile
,通常附档名为 .nmk。
build\win32目录下的makefile都是用来建造和Windows作业系统相关的
程式。而在 build\share目录底下就多为 .mk、.jmk、.cmk档,这些档案
通常用来建造和 Windows作业系统无关的程式。
◇ext目录
这个目录底下放置了用来支援Java2 SDK函式库的makefile与源码,
这些源码皆使用 Java程式语言所撰写。
ext\i18n目录下放置了与国际化(internationalization)相关的函式库
,这些编译过的档案最後都被放到 i18n.jar里头。
ext\jpda目录下放置了与Java平台除错器架构(Java Platform Debugge
r Architecture)相关的档案。
◇src目录
这个目录放置了所有建构Java SDK所需要用到的 .c档(以C程式语言撰
写 )以及 .java档(以Java程式语言撰写)。
src\win32目录下都是用来建造和Windows作业系统相关的源码。而在
src\share目录底下就多为与Windows作业系统无关的源码。因此聪明的
读者们应该可以猜到大部分 Java标准套件的源码大多放在src\share目
录之下。这些标准套件的源码在最後都被加入到 src.jar之中,而编译
过的 .class档则被打散放入许多不同的jar档内。
◇LegalReadme.html
Sun Community Source Code License版权宣告
◇OriginalCode.txt
Java2 SDK源码中所有档案的列表。
◇README.html
关於Java2 SDK源码的说明,该内容大部分都已经被笔者吸收而整合
到这篇文章之中。
从Java2 SDK源码的架构中,我们可以发现其档案的放置方法很独特
,是采用makefile与源码分开放置的做法,不同於一般我们所见(例如L
inux kernel源码)采makefile和源码放在一起的做法。这两种做法各
有利弊。以Linux Kernel源码的做法,每次编译完成之後,您将看到原
始码档案和编译过程中产生的中间档混杂在一起,感觉有点混乱。如果我
们采用 Java2 SDK源码的目录结构,每次编译出来的中间档和源码就
会分隔在不同的目录下,看起就非常赏心悦目,但是,这样放置的代价就
是 makefile里头对於路径的参照变得十分复杂,您将会在Java2 SDK原始
码的makefile中发现很多 ..\..\..\src 的叙述,看起来真是不舒服,如
果我们要了解该执行档是由哪些档案构成的时候就很辛苦了。
█如何编译Java2 SDK 源码
当我们深入了解Java2 SDK源码之後,很多工程师必定想自己尝试修
改源码,然後进行编译,我想这是身为一个工程师最大的乐趣。当然,
在我们还没有修改之前,我们也必须试著编译整个源码,顺便测试一下
源码是否完整,因此接下来要介绍编译Java 2源码的准备步骤和方法
。
要顺利编译Java2 SDK源码,您必须符合底下几种条件:
(1) 作业系统
您必须在Windows NT 4.0或是Windows 2000上才能顺利编译Java 2原始
码。一旦编译完成之後,所产生的执行档或是动态连结和式库将能够在所
有的 Win32作业平台上执行。
(2) 硬体设备
在Java2 SDK源码内附的文件之中,建议的硬体设备为Pentium等级的
处理器,配上至少 128 MB的记忆体。在笔者的电脑上,Pentium III 450
配上 PC 100 128 MB 的记忆体,总共花了将近2.5个小时完成所有编译动
作。如果算上编译时期遇到的一些错误以及恢复错误的时间,大概花了 3
个小时。
(3) 开发工具
我们必须准备几项工具,他们分别是:
- Microsoft Visual C++ version 6.0,并配上最新的Service pack(
或者 Visual Studio 97配上Service Pack 3)。
在Java2 SDK源码之中,存在有许多与Windows平台相关的程式码,这
些程式码都以 C语言撰写而成,为了顺利编译这些原生程式码,我们必须
要借助Visual C++编译器以便产生能在Windows平台上执行的执行档(.exe
)以及动态连结和式库(.dll)。
同时,Java2 SDK源码之中有许多Makefile,这些Makefile是用来控
制所有程式的编译动作。我们必须借助 Visual C++内附的nmake.exe这个
工具以帮助我们解读这些 Makefile并顺利编译出整个Java2 SDK。
- MKS Toolkit version 5.2以上的版本。
MKS Toolkit是一套能够在Windows上模拟UNIX执行环境的工具,请到ht
tp://www.mks.com下载这套工具的30天试用版(正式版必须要付费)。或者
如果您有订阅MDSN Profession以上的版本,您可以在光碟中找到Microso
ft Windows Services for UNIX 2.0 Add-On Pack(在UNIX20_INSERV\3RD
PARTY\MKS目录底下,执行x86子目录中的setup.exe即可安装)。30天试用
版的功能骑士和付费版本的功能一样,只不过当您在编译 Java2 SDK原始
码的时候,只要用到了 MKS Toolkit里的工具,就会出现一个广告画面罢
了,应该不会影响您的心情才是。
- Java2 SDK 1.3的可执行版本。
相信读者们看到这个地方,一定会觉得很疑惑。奇怪,编译Java2 SDK
的源码竟然也需要 Java2 SDK的协助? 不禁让人想起鸡生蛋蛋生鸡的问
题,不是吗? 其实Java2 SDK在整个编译过程中,扮演的是bootstrap com
piler(靴带式编译器)的角色。之所以需要Java2 SDK的原因是因为大家在
编译 Java程式时所使用的javac.exe核心程式竟然也是用Java撰写而成的
,由於 Java2 SDK的源码有许多与平台无关、以Java程式语言所撰写的
程式,因此在编译初期,我们必须借助过去旧版的Java2 SDK或是JDK帮助
我们产生新版的Java2 SDK,再利用新产生的新版javac.exe编译Java2 SD
K源码内的其他 .java档。
(下期续)