二、可能出现的问题
不管他们是否愿意承认,初学者和富有经验的java开发者都一样,他们都曾经在某些时候(通常是在那些最糟糕的情形下)被冗长、复杂的classpath欺骗。 应用程序所依赖的第三方类和用户定义类的数量逐渐增长,classpath也逐渐成了一个堆积所有可能的目录和档案文件名的地方。此时,类装载器首先装载的究竟是哪一个类也就不再显而易见。如果classpath中包含重复的类入口,这个问题尤其突出。前面已经提到,类装载器总是装载第一个它在classpath中找到的具有合适名字的类,从实际效果看,它“隐藏”了其他具有合适名字但在classpath中优先级较低的类。
如果不小心,你很容易掉进这个classpath的陷阱。当你结束了一天漫长的工作,最后为了让应用程序使用最好、最新的类,你把一个目录加入到了classpath,但与此同时,你却忘记了:在classpath的另一个具有更高优先级的目录下,存放着该类的另一个版本!
三、一个简单的classpath工具
优先级问题是扁平路径声明方法与生俱来固有的问题,但它不是只有java的classpath才有的问题。要解决这个问题,你只需站到富有传奇色彩的软件巨构的肩膀上:unix操作系统有一个which命令,在命令参数中指定一个名字,which就会显示出当这个名字作为命令执行时执行文件的路径名。实际上,which命令是分析path变量,然后找出命令第一次出现的位置。对于java的类路径管理来说,这应该也是一个好工具。在它的启发之下,我着手设计了一个java工具jwhich。这个工具要求指定一个java类的名字,然后根据classpath的指引,找出类装载器即将装载的类所在位置的绝对路径。
下面是一个jwhich的使用实例。它显示出当java类装载器装载com.clarkware.ejb.shoppingcartbean类时,该类第一次出现位置的绝对路径名,查找结果显示该类在某个目录下:
> java jwhich com.clarkware.ejb.shoppingcartbean
class 'com.clarkware.ejb.shoppingcartbean' found in
'/home/mclark/classes/com/clarkware/ejb/shoppingcartbean.class'
下面是第二个jwhich的使用实例。它显示出当java类装载器装载javax.servlet.http.httpservlet类时,该类第一次出现位置的绝对路径名,查找结果显示该类在某个档案文件中:
> java jwhich javax.servlet.http.httpservlet
class 'javax.servlet.http.httpservlet' found in
'file:/home/mclark/lib/servlet.jar!/javax/servlet/http/httpservlet.class'
Java Asp PHP .Net XML C/C++ CGI VB Jsp J2ee J2se J2me EJB Servlet Tomcat Resin Struts Weblogic Eclipse ANT GUI JMS Web servise IDEA Webphere Hibernate Spring Jboss Applet Swing Socket Javamail Perl Ajax P2P 安全 模式 框架 测试 开源 游戏
Windows XP Windows 2000 Windows 2003 Windows Me Windows 9.x Linux UNIX 注册表 操作系统 服务器 应用服务器