JDK 初学者指南
虽然有几个正在进行的项目旨在将 Sun 的 Java 开发工具包 (JDK) 移植到 Linux,但为了本文的目的,我将着眼于最大且最稳定的努力。它由 Blackdown 组织托管,大部分努力来自 Randall Chapman(针对 JDK 1.0)和 Steve Byrne(针对 JDK 1.1)。在撰写本文时(1998 年 8 月),JDK 1.1.6 版本 3 正在进行 beta 测试。此版本将在本杂志印刷时公开发布。有关 Linux 的 JDK 端口的最新信息,请参阅 Blackdown 的网页 http://www.blackdown.org/java-linux.html。
请注意,我使用 Caldera Open Linux 1.2 Standard 发行版的 Linux,因此我将讨论关于该发行版的 JDK 安装。JDK 1.1.6 移植到 Linux 在 Caldera Open Linux 1.1 和 1.2 开箱即用的安装中非常稳定。它也适用于许多其他 Linux 发行版。
Blackdown Java Linux 移植工作仍然需要志愿者。请随时与他们联系。事实上,我收到了 Steve Byrne 发来的一封电子邮件,称源代码并不难理解,除了调试之外,许多领域都需要志愿者。他还说源代码中存在许多专业领域,因此如果您擅长某件事但不擅长另一件事,请不要让它阻止您成为志愿者。
我将根据个人经验回顾三个不同 JDK 文件的要点。主要信息来源是 Blackdown 站点上的 Java Linux FAQ。第一个文件是 http://www.blackdown.org/java-linux/docs/faq/FAQ-java-linux.html。另外两个文件是 Sun 的 JDK 附带的 README 和 Linux 端口的 JDK 附带的 README.linux。安装 JDK 后,可以在 jdk1.1.6 目录中找到这两个文件。Java-Linux FAQ 中也有一个指向 README.linux 的链接。
存在两种类型的 Java 程序:应用程序和小程序。小程序只是在网页浏览器上下文中运行的小型 Java 程序。应用程序是独立的程序。
应用程序和小程序都从 Java 源代码文件开始。当 Java 程序被编译时,源代码被转换为 Java 字节码。通常,为源代码文件中声明的每个“类”生成一个字节码文件。这些字节码文件的扩展名为“.class”。
然后,字节码由 Java 虚拟机 (JVM) 解释执行。除非您拥有一台在硬件中实现 Java 字节码的机器,否则 JVM 是您正在使用的操作系统运行的程序。Linux 下的情况就是如此。
正如我之前所说,应用程序和小程序之间的区别在于它们的启动方式。应用程序从命令行启动。它是一个独立的程序。相比之下,小程序由网页浏览器启动。
当编写应用程序时,会定义一个名为 main 的方法。应用程序的执行从 main 开始。要在命令行启动应用程序,请键入 java SomeApplication。请注意,您无需键入 .class 扩展名。
小程序有一个名为 init 的方法。除了小程序字节码之外,还存在一个 HTML 文件,其中包含一个 <APPLET ...> </APPLET> 标签对,用于定义字节码的位置和其他有用的信息。当小程序从网页浏览器中启动时,会调用 init 来启动小程序。可以使用名为 appletviewer 的程序从命令行启动小程序。此程序与 JDK 一起分发,它接受 HTML 文件的名称,查找所有小程序标签并运行这些小程序。
main 和 init 都可以用单个 Java 程序实现。因此,生成的程序可以通过 java SomeApplication 或网页浏览器启动。
正如我上面提到的,Blackdown 组织是最大的 Java Linux 努力的仓库。该站点包含分发位置、电子邮件列表和当前 Linux JDK 的已知问题。目前,Linux 的最新 Java 开发工具包版本是 JDK 1.1.6 版本 3。
JDK 有两种版本:一种用于 libc,另一种用于 glibc。有关差异的解释,请参阅 Java-Linux FAQ。根据 JDK 附带的 README.linux 文件,确定您需要哪个版本的一个好方法是查看系统上安装的库。可以使用以下命令完成此操作
ls -l /lib/libc.so.*
如果文件是 libc5,您应该下载 libc 版本。如果它们是 libc6,那么您应该下载 glibc 版本。
要下载 JDK 发行版,请将您的网页浏览器指向 http://www.blackdown.org/java-linux/mirrors.cgi。此页面列出了分发 JDK 的站点。您只能从 Blackdown 的镜像站点获取 Linux JDK 端口。
查看镜像站点,并选择离您近的下载站点。由于 Caldera 使用 libc5,我按照链接进入 JDK-1.1.6/i386/libc/v3/。下载文件 jdk1.1.6-v3-libc.tar.gz。您也可以从此目录下载其他文件。
选择一个目录以使用 tar 命令解压发行版。我选择了 /usr/local/。如果您选择其他目录,请在本文的其余部分中,凡是出现 /usr/local/ 的地方都使用该目录代替。选择目录后,使用 cd 进入该目录,然后键入
tar xzf jdk.1.1.6-v3-libc.tar.gz
JDK 的安装完成。您现在应该访问 JavaSoft 下载文档。请参阅 http://www.javasoft.com/docs/index.html 获取下载和安装说明。
要完成设置,您应该修改您的 PATH 环境变量,以包含 JDK 包装器的位置。使用您喜欢的编辑器,编辑相应的启动文件(对我来说,这是 .profile),并将 /usr/local/jdk1.1.6/bin 添加到您的 PATH 中。将此添加到您当前 PATH 设置的开头可确保调用此 JDK。
您还需要添加两个新的环境变量:JAVA_HOME 和 CLASSPATH。
JAVA_HOME 告诉 JDK 其基本目录的位置。虽然设置此变量不是强制性的,因为 JDK 在确定此位置方面做得很好,但其他 Java 程序(如 Swing Set)会使用它。
CLASSPATH 可能会令人困惑和沮丧,但从一开始就正确地使用它是可能的。只需记住这个简单的类比:CLASSPATH 对于 Java 就像 PATH 对于您机器上的 shell 一样。更仔细地查看类比,您的 shell 只执行 PATH 指向的目录中的程序或脚本,除非指定程序的完整路径。CLASSPATH 对于 Java 的工作方式相同。只有 CLASSPATH 环境变量指定的目录中的应用程序和小程序才能在不指定完整位置的情况下运行。
我通常将 CLASSPATH 设置为一个简单的点。这让我可以运行当前目录中的任何应用程序。我还创建脚本,根据我在特定会话期间正在做的事情,在“根据需要”的基础上设置我的 CLASSPATH。
如果您使用 bash 作为您的 shell,则可以按如下方式设置这三个环境变量
PATH=/usr/local/jdk1.1.6/bin:$PATH CLASSPATH=. JAVA_HOME=/usr/local/jdk1.1.3" export PATH CLASSPATH JAVA_HOME
请注意,Red Hat 4.1 和 4.2 附带的 RPM 包 不能 开箱即用。我建议删除 RPM 包并使用 Blackdown 的 JDK 发行版。使用命令 rpm -e jdk 和 rpm -e kaffe 删除 RPM 包。
您现在已准备好测试 JDK。登录或执行启动文件以设置新的环境变量,并确保新的环境变量确实生效。执行 rlogin localhost 将会奏效。
现在,键入 java。应该会出现一条显示用法参数的消息。键入 javac 也应该工作,显示不同的用法参数。
接下来,使用您喜欢的编辑器并输入您的第一个 Java 程序;将此文件命名为 HelloLinux.java。
public class HelloLinux { public static void main (String args[]) { System.out.println("Hello Linux!"); } }
要编译此程序,请键入 javac HelloLinux.java。编译过程会创建一个名为 HelloLinux.class 的单个文件。要运行您的 Java 应用程序,请输入 java HelloLinux。这将输出单行“Hello Linux!”
Linux 内核能够检测 Java 字节码并自动启动 Java 来运行它。这消除了首先键入 java 的需要。当内核配置了 Java 支持时,您只需要做两件事。首先,更改 .class 文件的权限,使其可执行,使用 chmod 命令。然后,像运行任何普通脚本或可执行程序一样运行它。
例如,在编译 Java 程序 HelloLinux 之后,执行以下命令
chmod 755 HelloLinux.class ./HelloLinux.class
请注意,您现在必须指定应用程序的完整名称。这包括 .class 扩展名。
要设置 Java 支持,您需要 Linux 内核的源代码。Caldera OpenLinux 的默认安装会为您安装内核源代码。使用这个或下载最新和最好的内核源代码并安装它。
如果您以前没有为您的 Linux 机器编译过内核,我建议做一两次来感受一下。这也将确保当您尝试向内核添加原生 Java 支持时,不会出现与 Java 无关的问题。
需要三个步骤来设置内核以自动运行 Java 字节码。您可以在内核源代码树的 Documentation/java.txt 中找到有关使用内核此功能的更多信息。
在“代码成熟度选项”菜单中,选择“提示开发和/或不完整的代码/驱动程序”。Java 支持仍然有些新,可能存在并非每个人都准备好遇到的问题。
在“常规设置”菜单中,选择“Java 二进制文件内核支持”。将其标记为模块或内核的一部分。
在编译内核之前,编辑 fs/binfmt_java.c 文件,并将指向您的 java 解释器的路径放置在位于该文件开头的 #defines 中。(对我来说,此路径是 /usr/local/jdk1.1.6/bin/java/。)另外,编辑指向 applet viewer 的路径。另一种方法是保持 fs/binfmt_java.c 中的路径不变,并创建指向适当位置的符号链接。
如果您将 Java 支持编译为内核的一部分——即,它 不是 一个模块——那么还有另一种方法可以告诉内核您的 java 包装器所在的位置。以 root 用户身份登录并发出命令
echo "/path/to/java/interpreter" >\ /proc/sys/kernel/java-interpreter请注意,每次启动内核时都需要执行此命令,因此您应该将其放置在 rc.local 文件或等效位置中。
除了小程序和应用程序之外,JDK 还包含许多示例。将当前路径更改为 /usr/local/jdk1.1.3/demo/,您将看到此目录中包含示例的众多目录。一些示例包括井字棋、图形测试和分子查看器。
要运行井字棋,请使用您的网页浏览器打开文件 /usr/local/jdk1.1.6/demo/TicTacToe/example1.html。
图形测试位于 jdk1.1.6/demo/GraphicsTest/ 中。值得注意的是,它已被编写为既可以作为应用程序又可以作为小程序执行。
分子查看器是一个小程序,位于 jdk1.1.6/demo/MoleculeViewer/ 中。我提到它只是因为它很酷——它展示了 Java 的强大功能。
我工作的公司 Visualize, Inc. (http://www.visualizetech.com/) 专注于高端数据绘图软件,也称为数据可视化。我们的产品都源自我们的核心库 VantagePoint。VantagePoint 已通过 100% Pure Java 认证。用 Java 编写我们的产品使我们能够一次开发软件,然后在 Java 已移植到的任何平台上运行它。在实践中,我们的客户作为跨平台软件包的产品遇到的问题很少。事实上,VantagePoint 的最早版本完全在 Linux 上开发。Linux 仍然在我们公司中扮演着重要的角色。
VantagePoint 产品作为图形解决方案,将世界视为 数据集。对数据集可能执行的操作是 绘图、加载 和 分析。在对数据集执行分析之后,可以再次执行这些操作中的任何一个。一个有用的操作顺序是打开和加载数据集,绘制数据以获得可视化表示,分析数据,然后绘制分析结果。
VantagePoint 的一个产品 DP Server 是您可能拥有的任何数据集的管理器。它还允许从在 Intranet 或 Internet 上的网页浏览器中运行的小程序建立连接。
现在,转到页面 http://www.visualizetech.com/lj/。点击链接“Linux 统计信息”。此页面,看起来像图 1,启动一个 Java 小程序,该小程序连接到 DataPoint 服务器以显示二维折线图。它会定期更新,每次更新都显示 Linux Web 服务器上的当前 CPU 使用率。在此特定快照期间,Linux 机器刚刚完成编译 HelloLinux.java 程序。
Gordon Chamberlin 是位于亚利桑那州凤凰城的 Visualize, Inc. 的程序员和系统管理员。他在 1.2.x 版本时接触了 Linux,并很快买了一台 486,以便能够在家里使用 Linux。他喜欢玩电脑游戏,尤其是 Descent II,并与他的妻子 Barbara 共度时光。请将意见、问题或笑话发送至 glac@visualizetech.com。