这些Java教程是针对JDK 8编写的。本页中描述的示例和实践不利用后续版本中引入的改进,并可能使用不再可用的技术。
有关Java SE 9及后续版本中更新的语言功能的概述,请参阅Java语言更改。
有关所有JDK版本的新功能、增强功能和已删除或弃用选项的信息,请参阅JDK发行说明。
在实际部署类似计算引擎这样的服务的真实场景中,开发人员往往会创建一个包含Compute
和Task
接口的Java Archive (JAR)文件,供服务器类实现和客户端程序使用。接下来,一个开发人员,可能是与接口JAR文件相同的开发人员,会编写一个Compute
接口的实现,并将该服务部署在可供客户端访问的机器上。客户端程序的开发人员可以使用包含在JAR文件中的Compute
和Task
接口,独立开发一个任务和使用Compute
服务的客户端程序。
在本节中,您将学习如何设置JAR文件、服务器类和客户端类。您将看到客户端的Pi
类将在运行时下载到服务器上。此外,Compute
和Task
接口将在运行时从服务器下载到注册表中。
这个示例将接口、远程对象实现和客户端代码分为三个包:
compute
- Compute和Task接口engine
- ComputeEngine实现类client
- ComputePi客户端代码和Pi任务实现首先,您需要构建接口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
的实现。
假设开发人员ann
将ComputeEngine.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
类依赖于Compute
和Task
接口,它们包含在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.java
和Pi.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/
访问该位置。
客户端类依赖于Compute
和Task
接口,这两个接口包含在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虚拟机进行下载。现在,您可以运行服务器,然后运行客户端。