文档

Java™教程
隐藏目录
编译示例程序
导航: RMI
章节: 编译和运行示例

编译示例程序

在实际部署类似计算引擎这样的服务的真实场景中,开发人员往往会创建一个包含ComputeTask接口的Java Archive (JAR)文件,供服务器类实现和客户端程序使用。接下来,一个开发人员,可能是与接口JAR文件相同的开发人员,会编写一个Compute接口的实现,并将该服务部署在可供客户端访问的机器上。客户端程序的开发人员可以使用包含在JAR文件中的ComputeTask接口,独立开发一个任务和使用Compute服务的客户端程序。

在本节中,您将学习如何设置JAR文件、服务器类和客户端类。您将看到客户端的Pi类将在运行时下载到服务器上。此外,ComputeTask接口将在运行时从服务器下载到注册表中。

这个示例将接口、远程对象实现和客户端代码分为三个包:

首先,您需要构建接口JAR文件以供服务器和客户端开发人员使用。

构建接口类的JAR文件

首先,您需要编译compute包中的接口源文件,然后构建一个包含它们的类文件的JAR文件。假设用户waldo编写了这些接口,并将源文件放在Windows上的c:\home\waldo\src\compute目录下,或者Solaris OS或Linux上的/home/waldo/src/compute目录下。在给定这些路径的情况下,您可以使用以下命令编译接口并创建JAR文件:

Microsoft Windows

cd c:\home\waldo\src
javac compute\Compute.java compute\Task.java
jar cvf compute.jar compute\*.class

Solaris OS或Linux

cd /home/waldo/src
javac compute/Compute.java compute/Task.java
jar cvf compute.jar compute/*.class

jar命令由于-v选项显示以下输出:

已添加清单
正在添加: compute/Compute.class(输入 = 307) (输出= 201)(压缩 34%)
正在添加: compute/Task.class(输入 = 217) (输出= 149)(压缩 31%)

现在,您可以将compute.jar文件分发给服务器和客户端应用程序的开发人员,以便他们可以使用这些接口。

在使用javac编译器构建服务器端或客户端类之后,如果这些类中的任何一个需要被其他Java虚拟机动态下载,您必须确保它们的类文件放置在可以通过网络访问的位置。在这个例子中,对于Solaris OS或Linux,这个位置是/home/user/public_html/classes,因为许多Web服务器允许通过构造为http://host/~user/的HTTP URL来访问用户的public_html目录。如果您的Web服务器不支持这个约定,您可以在Web服务器的层次结构中使用不同的位置,或者您可以使用文件URL。文件URL的形式在Solaris OS或Linux上为file:/home/user/public_html/classes/,在Windows上为file:/c:/home/user/public_html/classes/。您还可以选择另一种适当的URL类型。

类文件的网络可访问性使得RMI运行时可以在需要时下载代码。RMI不会为代码下载定义自己的协议,而是使用Java平台支持的URL协议(例如HTTP)来下载代码。请注意,使用完整的重型Web服务器来提供这些类文件是不必要的。例如,可以在此处找到一个简单的HTTP服务器,它提供了通过HTTP在RMI中下载类所需的功能。
还可以参阅远程方法调用主页

构建服务器类

engine包仅包含一个服务器端实现类ComputeEngine,它是远程接口Compute的实现。

假设开发人员annComputeEngine.java放置在Windows上的目录c:\home\ann\src\engine或Solaris OS或Linux上的目录/home/ann/src/engine中。她正在将类文件部署到一个子目录中,供客户端下载,该子目录位于她的public_html目录下,Windows上为c:\home\ann\public_html\classes或Solaris OS或Linux上的/home/ann/public_html/classes。这个位置可以通过某些Web服务器作为http://host:port/~ann/classes/访问。

ComputeEngine类依赖于ComputeTask接口,它们包含在compute.jar JAR文件中。因此,在构建服务器类时,您需要在类路径中添加compute.jar文件。假设compute.jar文件位于Windows上的目录c:\home\ann\public_html\classes或Solaris OS或Linux上的目录/home/ann/public_html/classes中。在给定这些路径的情况下,您可以使用以下命令构建服务器类:

Microsoft Windows:

cd c:\home\ann\src
javac -cp c:\home\ann\public_html\classes\compute.jar
    engine\ComputeEngine.java

Solaris OS或Linux:

cd /home/ann/src
javac -cp /home/ann/public_html/classes/compute.jar
    engine/ComputeEngine.java

ComputeEngine的存根类实现了Compute接口,该接口引用了Task接口。因此,这两个接口的类定义需要对网络可访问,以便存根可以被其他Java虚拟机接收,比如注册表的Java虚拟机。客户端Java虚拟机在其类路径中已经有了这些接口,因此实际上不需要下载它们的定义。位于public_html目录下的compute.jar文件可以起到这个作用。

现在,计算引擎已经准备好部署。你现在可以这样做,或者等到构建客户端之后再部署。

构建客户端类

client包中包含两个类,ComputePi是主客户端程序,Pi是客户端对Task接口的实现。

假设用户jones,即客户端类的开发者,已经将ComputePi.javaPi.java放在了Windows上的目录c:\home\jones\src\client或Solaris OS或Linux上的目录/home/jones/src/client中。他正在将计算引擎的类文件部署到他的public_html目录的子目录中,Windows上的目录为c:\home\jones\public_html\classes或Solaris OS或Linux上的目录为/home/jones/public_html/classes。通过某些Web服务器,可以通过http://host:port/~jones/classes/访问该位置。

客户端类依赖于ComputeTask接口,这两个接口包含在compute.jar JAR文件中。因此,在构建客户端类时,需要将compute.jar文件添加到类路径中。假设compute.jar文件位于Windows上的目录c:\home\jones\public_html\classes或Solaris OS或Linux上的目录/home/jones/public_html/classes。在给定这些路径的情况下,可以使用以下命令构建客户端类:

Microsoft Windows:

cd c:\home\jones\src
javac -cp c:\home\jones\public_html\classes\compute.jar
    client\ComputePi.java client\Pi.java
mkdir c:\home\jones\public_html\classes\client
cp client\Pi.class
    c:\home\jones\public_html\classes\client

Solaris OS或Linux:

cd /home/jones/src
javac -cp /home/jones/public_html/classes/compute.jar
    client/ComputePi.java client/Pi.java
mkdir /home/jones/public_html/classes/client
cp client/Pi.class
    /home/jones/public_html/classes/client

只需要将Pi类放置在目录public_html\classes\client中,因为只有Pi类需要提供给计算引擎的Java虚拟机进行下载。现在,您可以运行服务器,然后运行客户端。


上一页:编译和运行示例
下一页:运行示例程序