如何使用Codebase

一、Codebase和安全问题

我们需要注意的是下载代码如何与Java的安全机制进行协调。本质上讲,codebase属性是应用程序在运行时动态地扩展自己classpath的一种方法。很明显,这会引起安全问题,你可能会下载一些不安全的类代码。所以一个Java 程序如果要下载远程的类,必须安装安全管理器。如果没有安全管理器,一个Java程序只能在装载局部代码,并且忽略所接受到的codebase信息。

大部分RMI程序需要从远端下载stub文件,而所有的Jini程序都需要下载服务代理。所以如果你不安装安全管理器,你就不能开发RMI和Jini程序。当你遇到安全例外的错误时,你最好检查以下自己的程序,是否安装了安全管理器。

二、开发时的问题

使用codebase经常出现的问题可能与我们的开发观念有关。我们许多人在安装我们的开发环境时都是尽可能的方便。也就是说,当开发分布式应用程序时,我们把客户端和服务端的程序放在同一目录下运行。这会产生许多问题,首先因为客户程序和服务程序都在本地,即使你没有正确的设置codebase属性,类文件也可以在本地的classpath装载进JVM。其次,你可能会忘记安装安全管理器,因为所有的类都可以在本地找到。

也就是说,我们这样开发,最大的弊端就是,我们不知道那些类是应该从远端下载的,因为所有的类在本地都找得到。这样你也许会发现你的程序在开发调试时运行的很正常,而一旦到了真正的运行环境,也就说分发到了一个分布式环境中时,就出现了许多问题。也就是我们所说的codebase,以及从网络上下载类的各种问题。我将在另一篇文章中讲如何安装你的开发环境来仿真多机环境。

三、一些常见的codebase错误

上面我们所讲的时codebase是怎么一回事,它是如何工作的。现在,我想讲几个Jini和RMI开发者应该注意的几个问题。

1、在codebase中指定多个url:在一个单独的codebase中分隔多个url正确的方法是用空格。例如


         -Djava.rmi.server.codebase="http://url:8080 http://url:8080/myclasses.jar"
   

2、不要使用带file的url:如果你有一个可用的webserver,或者你不想以后运行时出现麻烦,建议你不要使用file:URL的形式作为一个codebase。我曾经看过一个讲codebase的例子,还使用file:形式,真的是有些误导读者。用file 这种形式不是个好主意。因为如果服务器给客户传递一个file codebase,那么客户只会试图从本地文件系统装载类代码。如果你在同一台机器上开发和调试服务和客户程序,那么这是可以工作的。但是如果你在不同的机器上运行程序,就会出现问题。

3、在codebase URL中不要使用localhost:localhost是用来指定当前机器的。如果服务器设置的url中包含localhost,那么客户分析这个url,就会试图从自己的系统装载类文件。这和file一样是个不好的习惯。

四、开发RMI程序是不是需要一个webserver

有时我也怀疑为了开发RMI程序就安装一个webserver,是不是有点太夸张了。开发RMI程序是不是真的需要一个单独的webserver。其实codebase的设置是很灵活的。我们可以使用一个单独的webserver,来作为一个组成员的类文件下载的服务器。对于开发大型的RMI应用程序来说,这是不会有问题的。如果是个人开发的,现在在Jini开发时,sun公司提供了一个简单的webserver,httpd。这个是完全可以完成类文件下载的。