编者注:在这一期的 开源之路 中,作者和 Cafe Au Lait 的创始人 Elliotte Rusty Harold 接管了目前的 Java SE 7 开发系列文章。因为 OpenJDK 项目 的目标和流程已经在 第一期 介绍过,所以 Elliotte 将在此教程中直接介绍 JDK 7 的实际构建。
在此之前, 如果 OpenJDK 项目有更新,我们会将其发布在每期“开源之路”的开始部分。最新的 发行版 是 b23,发行日期是 10 月 30 日。此发行版解决了一小部分缺陷和功能要求,这些内容可详见其 发行说明,其中许多都与管理问题相关,比如顶层 README 文件、空格清理和遗留 "j2se" 引用的移除。上一个版本 b22 解决的问题比较多,集成了 65 个缺陷修复和 14 个功能,其中包括 将 CORBA、JAXP 和 JAXWS 分割到各自的工作区中,将 Swing ThreadPool 创建 替换为 java.util.concurrent 功能,支持各种时间区更改,以及 OpenJDK RenderingEngine 插件的创建,这意味着“为 Open JDK 提供了替代 Ductus 库的起点。”
但如何达到所有这些新目标呢?这正是 Elliotte 将在在本文中阐述的内容,他将介绍如何从源码构建 JDK。
由于 Sun 的 Java 开发工具包是自由软件(只需在替换的过程中对一些小组件建模),因此我们不妨对经进行一些修改。无论您的激情在于优化、实验、语言设计、调试还是文档,都有大量的工作需要您来做,都有大量的机会提供给各种技能水平的开发人员。在本系列的后续文章中,我将详述 Java 7 或更高版本中可能出现的各种 API 开发。但是,要玩转这些 API,您将需要浴血奋战,所以立即甩掉您的急救箱,撕掉止血带,准备流一些血吧!我们要开始构建 JDK 了。
系统需求
首先,构建 JDK 需要一个受支持的操作系统。这包括 Linux、Solaris、Windows XP 和 Windows Vista。不支持 Mac OS X。Apple 负责将 JDK 迁移至 Mac 中,然而,这往往滞后于潮流。但是,Mac 用户可以使用 Parallels、VMWare Fusion 或 Boot Camp 来运行 Windows 或 Linux,并在其中构建 JDK。的确,我撰写此文时用的就是这种方法,当时我电脑中的以太网卡在项目完成前两天意外死亡了。然而,在 Apple 发布最新的 JDK 之前,我们仍然无法在 Mac OS 中运行 Java 7(或 6)应用程序。这可能发生在明天,可能发生在明年,也可能永远都不会发生。
其次,我们需要一个最新的 Java 6 SDK。Java 7 不能通过 Java 5 来编译。就我个人来说,我在设计软件时不喜欢太多的版本依赖,这对于开源软件尤其重要。但是,JDK 只是在最近才开放源码,而且显示了公司 IT 的一些遗留态度:“我们可以控制每个人的构建环境”。移除其中的一些依赖是一项正在进行的并将花费数年的任务,但是,这个过程已经取得了初步进展。就在最近,Sun 将其源码库从专用 Teamware 转移到了开源的 Mercurial 中。从封闭开发模式切换到开放开发模式是一项艰巨的任务,但最终结果是更强大、更灵活、更健壮的代码库。
第三,我们需要一个 C 编译器。其中一些 JDK 是用原生代码编写的。它们不可能都是纯 Java 编写的。对于 Linux,我们需要使用 gcc4。结于 Windows,需要使用 Microsoft Visual Studio .NET。对于 Solaris,需要使用 Sun Studio 11。
在 Linux 中,可能还需要安装或更新一些库。具体要安装哪些库,取决于您的发行版和版本。您可能还需要为现有库安装一组 C 头文件。在本文中,我使用现有的 Ubuntu 7.10 Gutsy Gibbon 发行版。大多数其他合理流通的发行版应该也能工作。如果您发现有一些发行版无法工作,不妨找出其原因并记录缺陷。
最后,在 Windows 中,您可以在 NTFS 文件系统上进行构建。您不能在 FAT-32 上构建 JDK。您还需要安装 Cygwin,因为在 Windows 上构建的 JDK 是 Windows 和 Unix 实用工具的奇异混合物。
获取源码
大约每隔一个月,Sun 会在 OpenJDK 源码发布页面 上发布一组完整的 JDK 源码。下面列出了几种不同的包:
OpenJDK 源码 JDK 7 大约 95% 的主要源码。 平台的二进制插件 Sun 实际并不拥有 JDK 中的所有代码,并且他们无法重新注册他们不拥有的代码。相反,一些代码段必须以闭源二进制软件包来提供。您将需要为您的平台下载其中一些代码。Linux、Solaris 和 Windows 在 32 位和 64 位版本中都受支持 。 Jtreg 测试工具二进制软件包下载 代码的测试框架。您不必真正使用测试框架来构建或修改代码,但是不论如何您都应该掌握它。 OpenJDK 模块项目 这包括 Java 7 的新模块系统。(我将在本系列的后续文章中介绍。) 最终,此项目将汇总到 JDK 中,但现在您并不立即需要它。
因为这些项目所占空间在 120MB 以上,下载服务器的速度可能不是一直都特别快,所以要想全部下载可能需要一段时间。开源的一个好处就是不用单击通过令人讨厌的使用许可。从普通的 URL 中可以下载任何开源软件。这使得 curl、wget 等类似工具的使用更加容易。设置批处理作业来获取这些工具,然后您就可以悠闲地喝一杯咖啡。事实上,无点击还使正常浏览器的使用更加容易。点击通过注册的方式应该可以废除了。点击通过注册只是使律师更加忙碌,除了律师谁还需要这些东西?
jars@jars-desktop:~/openjdk$ wget
http://www.java.net/download/openjdk/jdk7/promoted/b23/openjdk-7-ea-src-b23-30_oct_2007.zip
--18:02:02--
http://www.java.net/download/openjdk/jdk7/promoted/b23/openjdk-7-ea-src-b23-30_oct_2007.zip
=> `openjdk-7-ea-src-b23-30_oct_2007.zip'
Resolving www.java.net... 64.125.132.37, 64.125.132.39
Connecting to www.java.net|64.125.132.37|:80... connected.
HTTP request sent, awaiting response... 301 Moved Permanently
Location:
http://download.java.net/openjdk/jdk7/promoted/b23/openjdk-7-ea-src-b23-30_oct_2007.zip
[following]
--18:02:02--
http://download.java.net/openjdk/jdk7/promoted/b23/openjdk-7-ea-src-b23-30_oct_2007.zip
=> `openjdk-7-ea-src-b23-30_oct_2007.zip'
Resolving download.java.net... 72.5.124.114
Connecting to download.java.net|72.5.124.114|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 84,617,174 (81M) [application/zip]
44% [===============> ] 37,717,212 55.36K/s ETA 12:19
现在,我们只需要前两个条件:OpenJDK 源码和二进制插件。但是,将来您可能还需要其他两个条件。