《Linux 公报》……让Linux更富魅力! 


为 Linux 设置一个 Java 开发环境

作者:Chris Gibbs  译者:少敏


目录

获取Java开发工具箱(JDK)
内核对Java的支持
JDK
Java Beans
Swing
Java访问工具
Java Servlet开发工具箱(JSDK)
文档
Java教程
Sun公司的HotJava浏览器
下个月

简介

这篇文章是想帮助那些Linux或Java新手在他们的电脑上运行Java应用程序,并且为开发新的Java应用程序提供一个有效的开发环境。
 
我将特别解释如何设置Sun公司的 1.1.x JDK 和其它相关配套。这不是在Linux上运行Java的唯一途径。
Blackdown.org 现在提供Linux版的新的 1.2.x JDK (在写这篇文章的时候,它还仍然是测试版)。我建议只有当你正在用新的 2.2.x 内核时才用它。假如你要安装 1.2.x JDK,请注意,你不必获取 SwingJSDK 配套, 因为它们已经被包括在内了。假如你使用 1.2.x JDK 来运行较老的Java应用程序,你可能会发现一些兼容性的问题。尤其是假如你打算用 Apache 的扩展 javapache,你需要用 JDK 1.1.x
此外,还有其它第三方的 Java 环境和编译器,例如 IBM 的 jikes。使用这些环境和编译器,你要自担风险!Sun公司定义并开发了Java 语言,因此我希望他们的 Java 环境是最标准的。其它环境可能是有趣的,但我在此就不述及了。
 
不幸的是Linux版的 Java 语言的开发落后于其它操作系统版本的开发。虽然在 Linux 下使用 Java 仍然有很多优势,也容易得到一些常用的开发工具。如果你未见过最新版本的DDD( 动态显示调试器 ),你或许不会认识到它现在支持Java。如果你要在 Linux 下写程序,DDD 是一个必不可少的工具软件。
 
为何要使用Java?
Java 最大的好处也是它的最大坏处。理由是,同样的 Java 代码在不经重新编译就可运行于不同的平台上,这导致 Java 应用软件会显得慢。而因为慢这一条,导致一些人对使用 Java 产生疑问。
 
当然,如果速度是选择编程语言时所要考虑的最主要的因素,我根本不会考虑使用 Java。尽管这本电子杂志的早期几期中说过的一些应用软件,例如 Jedit 和 Java CD 播放器在速度上和用C写的程序一样,它们启动起来非常慢,当我有其它快得多的替代选择时,我很不愿用 Java 版的。
 
但是 Java 不是为了这种应用软件的。Java 杰出之处是在当初为它而设计的方面,也就是提供一个使得应用程序可在因特网上用的方法。在因特网上,装载应用软件的速度相对下载一个应用软件所需的时间而言并不真正重要。
 
现在来考虑你的 ISP (网络服务供应商),以及给你提供因特网访问的服务器。你的 ISP (甚至是你的本地内联网 Intranet )需要最快机器,并且可能有一些制约条件( 例如花费 )。与在服务器端的应用程序的软件上的投入相比,服务器本身的实际花费可能并不重要。用 Java 来执行服务器端的应用程序,使你的 ISP 不必选择用最好的机器这个架构以及不必担心在运行这种应用程序时在操作系统方面的花费和可行性。只需把它们简单地从一台机器上拷贝到另一台上。或许某一天,微软会开发出一个比任何Unix系统都好的可靠的操作系统。即使那一天来临,我也无须改变所用的 Java,使用 Java 可让我保留和现在用的一样的服务器端应用软件。
 
如果你只是使用单台计算机,无需访问本地或因特网网络,你就不必考虑用 Java。但是假如你的电脑将联到本地网络或因特网,那么则必须认真对待是否要用 Java 这个问题。Java 不是开发网络应用程序的唯一方法,例如也可用 Perl 来编写。但 Java 是一个非常吸引人的选择。


获取程序开发工具箱JDK

请不要从 Sun公司直接获取JDK。他们只提供对微软,Solaris等系统的支持。你可到 Blackdown.org 去找你所要的版本。
 
在此提到的其它软件包,应该可从 Sun公司得到。
 
JDK 的 Linux口可从 Linux 发布盘或在 http://blackdown.org 找到。你可能会发现你对要安装的文件感到不知所措。有 JRE(Java运行环境) 还有 JDK。我建议你要得到整个 JDK 的软件包,因为它包含了在其它配套中的所有东西。


内核对Java的支持

Linux可能是第一个对 Java 提供直接内核支持的操作系统。这使得 Linux 可直接运行 Java 应用程序和 Java applet,而不需要用象 Netscape 这样的浏览器。但是,如果你认为直接内核支持意味着内核可运行Java 代码所需要的任何东西,那可就错了。
 
你需要认识到的是Java的运行类似解释程序而不是编译程序。在计算机时代的早期,使用解释语言来写简单的应用程序是很普遍的,例如 GW-BASIC。所写的代码不被编译成程序,而是传给解释器,由它来实际执行各个指令。这是很没有效率的工作方式,其速度总是很慢。
 
Java 不同于一个解释语言,例如早期的 Basic 语言。Java 的源代码会被编译。但它的源代码不被编译成电脑可直接执行的程序,和用gcc编译C程序产生的程序不同。它是以字节编译成标准格式。相同的 Java 应用程序可运行于任何平台的原因就在于这个字节码是一种标准格式。由Sun公司或Blackdown.org所提供的 javaappletviewer所完成的功能是传送字节码并执行指令。字节码在被执行前必须被传送给解释器,这就是为什么Java应用程序显得慢的原因。不过,情形没有早期的BASIC程序那样糟,因为这个字节码已被java编译器优化了。

当你把支持Java编译进你的内核程序,你真正所做的是告诉操作系统当要执行Java应用程序时调用 javaappletviewer。Linux只是给你一个捷径,即 'appletviewer 我的应用程序'。
 

因此你必须告诉内核你的Java执行文件存在哪里。如果你是从Blackdown.org获得JDK的,你的java和appletviewer将放在/usr/local/java/bin。如果是从 S.u.S.E.的发布软件安装JDK的,它们则被放在/usr/lib/java/bin。当然你也可把JDK安装在非标准的地方。
 
在你重新编译你的Linux内核之前,编辑 /usr/src/linux/fs/binfmt_java.c 这个文件会影响实际的环境。
     #include <linux/malloc.h>
     #include <linux/binfmts.h>

     #define _PATH_JAVA      "/usr/local/java/bin/java"          // 用你系统中的正确位置来代替
     #define _PATH_APPLET    "/usr/local/java/bin/appletviewer"  // 用你系统中的正确位置来代替
     #define _PATH_SH        "/bin/bash" 

     char binfmt_java_interpreter[65] = _PATH_JAVA; 
     char binfmt_java_appletviewer[65] = _PATH_APPLET;
请注意的是javaappletviewer 的位置必须是实际执行文件所在的位置,而不是你所建的符号链接symbolic link。 在这个例子中的目录 /usr/local/java 可以是 /usr/lib/java-1.1.7 的符号链接, 但实际的文件不能符号链接, 它必须存在于 /usr/lib/java-1.1.7/bin。
 
现在你能够决定是否把支持Java直接编译到内核中,或者把它当作模块。我选择使用模块。我觉得需要加的注释只是当我要运行 html 文件时, kernld 不会自动装载binfmt_java 模块, 因此我必须首先用 "insmod binfmt_java"。
 
运行 HTML 文件?
是的, Linux 将允许你把某些HTML文件当作应用程序来运行。要明白为什么要这样做,你须要明白Java applet和Java 应用程序的差别。Java应用程序提供它自己所需的所有资源,而applet则不必。一般来说,applet 需要被包括在网页中,该网页可被有Java功能的浏览器如Netscape或者HotJava来观看,因为applet 没有自己的顶层窗口。另一种办法是使用 appletviewer 程序来看 applet。
 
Linux 还给你另一个选项,如果你把下面这一行
        <!--applet-->
加到一个 HTML 文件 ( '<' 必须是这个文件中的第一个字符 ), 用 chmod 把这个文件的属性变为可执行的,然后你就能够直接运行包括在这个文件中的applet了。
 
用相同的方式,Java 应用程序是由一个或多个类(class)文件组成。要使这个应用程序可被Linux执行,只需要用 chmod 把最顶层的类文件变为可执行的。


JDK

读一读JDK所带的文档,我们发现没有必要设置 CLASSPATHJDK_HOME 环境。这对 JDK 本身是对的,但我发现一些应用程序需要设置好这些环境。无论如何,设置它对你无任何害处。我建议你用下面的步骤来正确安装 JDK:
  1. export PATH=$PATH:{JDK_HOME}/bin
  2. export JDK_HOME={JDK_HOME}
  3. export JAVA_HOME={JDK_HOME}
  4. export CLASSPATH=./:{JDK_HOME}/lib/classes.zip
这里的 {JDK_HOME} 就是你安装JDK的顶层目录。
 

Java Beans

JavaBeans API(应用程序接口)允许你用Java编程语言创建组件软件。组件是完整的,自包含的,可重用的软件单元,它们可被可视地链接到任何Java程序,applet或者servlet。这种软件单元被称做Bean。已有许多Java IDE(集成开发环境), 例如 NetBeans 或者 Visarj 使用这个技术来提供应用程序建造工具。在发布套件中所包括的是 BeanBox, 一个让你起步的简单的JavaBean 集成开发环境。
 
当你用在 BDK/beanbox 子目录下的 bin.sh 启动 BeanBox, 将为你打开三个窗:
工具盒 初始已包括很多 bean 的例子, 你可加上你的bean来创建自己的可视编程环境。用滑鼠在bean上按动来选择它。然后在 BeanBox 的某处按动。javaBean 就会出现,并且它的属性会在属性窗中列出。然后你就可用属性窗来为你的应用程序来制作JavaBean。当你加完了 Bean, 对 BeanBox 中的你的应用程序的外观满意后,你可用 BeanBox 窗中菜单 File/Make applet 来生成applet并有相配的html文件的例子。
 
到此应该清楚的是 JavaBeans 提供了一种不用写一行代码的开发应用程序的方法。当然你需要自己写 bean 但很多第三方的供应者制作 Bean, 并且因特网是寻找新的组件的好地方。
 
JavaBeans 的一个特点是它们以 JAR 文件格式打包。这个格式比起java class文件有许多优点,包括:
JDK 1.2.x 所包括的另一个增加的功能是包的版本,包的封存和包的扩展。
 
安装
  1. http://java.sun.com/beans 获取BDK
  2. 在一个子目录下把它打开, 例如 /usr/lib/BDK
  3. 可选择地给CLASSPATH增加一个新的类。例如 export CLASSPATH=$CLASSPATH:/usr/lib/BDK/beanbox/classes
  4. 进入 demo 子目录并运行 "make -f GNUMakefile"
  5. 进入 demo/html 目录并用上面所述的方式把文件属性变为可执行的,试用一下
  6. 进入 beanbox 目录并运行"run.sh"

Swing

不是所有的 Java 应用程序都是一样的! 有些看起来比其它的好。Swing 提供了几项对Java语言的扩充。即使你不需要 Swing 来开发和运行Java应用程序和 applet, 你可能也需要它来编译和运行某些在因特网上免费可得的 Java 应用程序(例如 jedit)。
Java 基本类 (JFC, 已被包括在 Swing 包中 ), 配上 Swing, 提供了一套在各平台下都可用的 "轻量级" 的组件。它们有效地提供了对 Java 语言的图形用户界面的 GUI 扩充,可给你的应用程序提供许多外观感觉上的扩充。
上图是你运行swingset应用程序时的初始屏幕显示。这可用来示范Swing所提供的扩充。通过选择一个类目,例如ListBox,你就可显示和变更各种不同的可选项,从而熟悉Swing所能提供的效果。
 
我推荐用的可完全使用Swing的应用程序是 jedit, 它是一个非常漂亮的编辑器。它的全部源代码都可得到。它适合编辑文本文件,Java源程序,Perl脚本,LaTeX文档等等。这个编辑器支持插件(plug-ins),包括很多试用的样例供你初步使用。
 
安装
  1. 在你所选的目录下打开 Swing 包 (我建议用 1.1 版本)。例如 /usr/local/Swing
  2. export SWING_HOME={SWING_HOME}
     可选择地,
  3. CLASSPATH 加上在 {SWING_HOME} 下的 .jar 文件和 src.zip。
这里的 {SWING_HOME} 是你打开 Swing 所在的目录。


Java 访问工具

实际上,有两个包: Java 访问 APIJava 访问工具。
Java访问 API 定义组成Java应用程序的各个用户界面单元,并提供访问Java 应用程序的辅助技术间的约定。如果一个Java 应用程序完全支持Java访问 API, 那么它应该是与诸如屏幕阅读器,屏幕放大器等辅助技术相兼容的。一个完全支持Java访问API的Java应用程序,不再需要关闭屏幕模式,因为这个API已提供了一般关闭屏幕模式所包括的所有信息。
 
为了提供对Java应用程序的访问,辅助技术所要求的比Java访问API更多:它要求对执行API的对象的定位支持,也要求对装入Java虚拟机的支持,还要跟踪事件等等。Java访问工具类提供这个辅助。
可能你从上面的屏幕显示可猜到,Java访问工具需要你安装好 Swing 包。
 
在这个包中提供了几个示例工具。上面所抓取的屏幕显示的是Java 监测器。它可让你获得由Java虚拟机在屏幕上显示的对象的信息资料。此外还包括:
安装
这与在此提到的其它包的安装有点不同。因为所包括的不同的工具必须由你明确地打开。
 
当你启动任何一个Java应用程序时,通过下面的步骤,你也能够自动声明上面所提到到的其中一个工具:
  1. 在你所选的目录下打开包。例如 /usr/local/jaccess
  2. 用上面所说的方法安装 Swing
  3. 给你的CLASSPATH 增加新的 jar 文件。例如 export CLASSPATH=$CLASSPATH:{jaccess_home}/jaccess.jar:{jaccess_home}/jaccess-examples.jar
  4. 编辑 JDK_HOME/lib/awt.properties 文件,加上下面一行来选用 jaccess:
           AWT.EventQueueClass=com.sun.java.accessibility.util.EventQueueMonitor
  5. 决定你要用哪些工具,在 awt.properties 文件中给每个要用的工具加上一行。例如,要用JavaMonitor,加上这一行:
           AWT.assistive_technologies=JavaMonitor

JSDK

Java Servlet API 是对Java程序开发工具箱的标准扩展。Servlet是运行在服务器内部,用来扩展服务器功能的程序。例如,servlet可作为平台独立的程序来替代CGI脚本。支持servlet的服务器回应客户端的请求。
上图示出了Java servlet最典型的使用。HTTP 服务器运行servlet,负责从HTML订单输入表格中拿数据,并用公司规则来更新数据库。简单地说,java servlet 是服务器版的 java applet。由于服务器是在远程(从用户的角度看), servlet没有图形用户界面。
 
Servlet提供了一种写起来容易运行起来快的产生动态文本的方法。Servlet也用特定平台的API来定位服务器端程序的问题。它们是用Java Servlet API开发出来的,是标准的Java扩展。
 
因此可用 servlet 来处理 HTTP 客户端的请求。例如, servlet 的处理数据用HTML表格通过HTTP被发送。包括购货订单或信用卡数据。servlet 可以是订单输入和处理系统的一部分,用于生产和存货数据库,也可是一个在线支付系统。
 
servlet还有如下用途:
如果你使用 Apache 服务器,那么你可能对javapache 项目感兴趣。从 http://java.apache.org/ 可得到。要使用它,你需要用 1.1x 版的JDK, 并且必须用 2.0版的 JSDK。下个月我希望对这个项目做一个介绍。
 
JSDK 可从 http://java.sun.com/products/java-server/servlets 下载。请记得,如果你用的是新的 1.2.x 版的 JDK,你不必下载这个包,因为它已包括了 JSDK。
 
安装
  1. 在你所选的位置打开 JSDK 包, (例如 /usr/lib/JSDK)
  2. JSDK /bin 目录加入你的路径。最好的办法是在你的/etc/profile文件中放一行
            export PATH=$PATH:/usr/lib/JSDK/bin

    给你的 CLASSPATH 加上JSDK 类,例如:

            export CLASSPATH=$CLASSPATH:/usr/lib/JSDK/lib/jsdk.jar
    同样地,你可把这一行加到你的 /etc/profile 文件中。

    文档

    每个包都包括它自己的HTML格式的文档。然而, 由于你需要从 Blackdown.org 而不是从 Sun 公司获取JDK,关于 JDK 的文档会从包中失去。
     
    Sun 公司为 1.1.x 和 1.2.x 版的 JDK 提供完整的文档。1.1.x 版的文档也用于 1.1.3版。我想从那时起这个文档没有被更新过。
     
    demo 子目录下你可找到很多例子。找一个启动java applet的 HTML 文件,用我上面说过的方法把它变为可执行文件,你就可把它当作普通程序来运行。
     
    docs 子目录包括完整的Java语言编程指南。这是Java 教材的进一步深入。


    Java 教材

    Sun公司有综合性的Java教材让你起步,加速你的Java编程。完整的教材和它的特定部分都可下载得到:
     
     
    格式  压缩 /
    未压缩 
    下载地址 
    在线教材
    (最后更新
    12月21日)
    Zip  8.5 MB / 14.7 MB ftp://ftp.javasoft.com/docs/tutorial.zip
    tar/compress  10.5 MB / 14.7 MB  ftp://ftp.javasoft.com/docs/tutorial.tar.Z
    tar/GNUzip  7.2 MB / 14.7 MB  ftp://ftp.javasoft.com/docs/tutorial.tar.gz
    教材例子
    (最后更新
    12月21日)
    Zip  2.9 MB / 4.4 MB  ftp://ftp.javasoft.com/docs/tut-examples.zip
    tar/compress  3.6 MB / 4.4 MB  ftp://ftp.javasoft.com/docs/tut-examples.tar.Z
    tar/GNUzip  2.5 MB / 4.4 MB  ftp://ftp.javasoft.com/docs/tut-examples.tar.gz
    JFC/Swing Trail
    (最后更新
    12月21日)
    Zip  2.8 MB / 4.6 MB  ftp://ftp.javasoft.com/docs/tut-swing.zip
    Servlets 书店例子
    (最后更新
    12月21日)
    Zip  18 KB / 51 KB  ftp://ftp.javasoft.com/docs/tut-bookstore.zip
    BINGO E
    例子
    (最后更新
    12月21日)
    Zip  35 KB / 108 KB  ftp://ftp.javasoft.com/docs/tut-bingo.zip

    你也可用下面的地址在线阅读这些教材 http://java.sun.com/docs/books/tutorial.

    请注意: 虽然你可自由地对上面的教材在当地网络或内联网上建立镜象,Sun公司要求你不要把它们在因特网上发布。

    Sun公司的 HotJava 浏览器

    这是一个完全用Java写的网页浏览器。甚至是在 133Mhz 奔腾处理器上它都非常慢。它是Linux下可运行Java applet的很少的几个浏览器中的一个。还有其它原因使得它很有趣。
     
    HotJava高度模块化,用户界面很容易定制,还有Sun公司申明的它不会占用很多系统资源。我发现实际上当我跑其它应用程序时,如果用它装载Java applet会死机。我想这都是因为Sun公司对此没有说明。
    Sun 公司申明这个浏览器可理想地用于各种设施 - 例如屏幕电话和桌面电脑。我所要说的是,只有当这个浏览器能够更快一些 ( 在我的有32M内存的奔腾机上,大约要三分钟的时间来启动和装入缺省屏幕显示), 能够更可靠一些,才能够用它用得多一些,除非你有很快的电脑微处理器。
     
    HotJava的核心是 HotJava HTML 组件。这是一个 JavaBean,它分析和呈递 HTML。它可嵌入你自己的应用程序,包括新闻阅读器和微波炉 (是的,现在已有微波炉甚至是冰箱,都可让你从因特网上访问), 可用它来显示信息。
     
    HotJava 支持下列因特网标准:-
    根据你的需要,也可得到下列包:

    下个月

    上个月我解释了怎样设置 Apache HTTP 服务器。下个月我打算把这两篇文章结合起来,让你看看如何把javapache 扩展与 Apache 合并起来,从而你就可使用Java来创建动态HTML网页和服务器端的应用程序来扩展你的网站。
    在我以后的文章中,我将对可得到的Netscape插件做一个概要介绍,让你看看开发你自己的插件是多么简单。同时,我欢迎你对我将来的文章进行评论和提出你的建议。

编辑的通告: 十月份的 Linux Journal 在线栏目,包括了与Java有关的两篇文章:


版权所有 © 1999 NJLUG
出版于第45期《Linux公报》1999年9月 中文版第十一期

[ TABLE OF CONTENTS ] [ FRONT PAGE ] Back Next