4.8 类路径
在前面已经看到,类存储在文件系统的子目录中.类的路径必须与包名匹配.另外,类文件也可以存储在JAR(java归档)文件中.在一个JAR文件中,可以包含多个压缩形式的类文件和子目录,这样既可以节省又可以改善性能.JDK提供了许多JAR文件,例如在jre/lib/rt.jar中包含数千个类库文件.
提示:JAR文件使用ZIP格式组织文件和子目录.可以使用所有ZIP应用程序查看内部的rt.jar以及其他的JAR文件.
为了使类能够被多个程序共享,需要做到下面几点:
1.把类放到一个目录中,例如/home/user/classdir .需要注意,这个目录是包树状结构的基目录.如果希望将com.horstmann.corejava.Employee类添加到其中,这个Employee.class类文件就必须位于子目录/home/user/classdir/com/horstmann/corejava中.
2.将JAR文件放在一个目录中.例如:/home/user/archives .
3.设置类路径( class path).类路径是所有包含类文件的路径的集合.
在UNIX环境中,类路径中的不同项目之间采用冒号(:)分隔:
/home/user/classdir:.:/home/user/archives/archive.jar
而在windows环境中,则以分号(;)分隔:
c:\classdir;.;c:\archives\archive.jar
在上述两种情况中,句点(.)表示当前目录
类路径包括:
基目录/home/user/classdir或c:\classes;
当前目录(.)
JAR文件/home/user/archives/archive.jar或c:\archives\archive.jar
警告:javac编译器总是在当前目录中查找文件,但Java虚拟机仅在类路径中有"."目录的时候才查看当前目录.如果没有设置类路径,那也并不会产生问题,默认的类路径包含"."目录.然而如果设置了类路径却忘记了包含"."目录,则程序仍然可以通过编译,但不能运行.
类路径所列出的目录和归档文件时搜寻类的起始点.下面看一个类路径示例:
/home/user/classdir:.:/home/user/archives/archive.jar
假定虚拟机要搜寻com.horstmann.corejava.Employee类文件.
它 首先要查看存储的jre/lib和jre/lib/ext目录下的归档文件中所存放的系统类文件.显然,在那里找不到相应的类文件, 然后再查看类路径.于是查看:
/home/user/classdir/com/horstmann/corejava/Employee.class
com/horstmann/corejava/Employee.class从当前目录开始
com/horstmann/corejava/Employee.class inside /home/user/archives/archives.jar
编译器定位文件要比虚拟机复杂得多.如果引用了一个类,而没有指出这个类所在的包,那么编译器将首先查找包含这个类的包,并询查所有的 import 命令,确定其中是否包含了被引用的类.例如,假定源文件包含指令:
import java.util.*;
import com.horstmann.corejava.*;
并且源代码引用了Employee类.编译器将试图查找java.lang.Employee(因为java.lang包被默认导入),java.util.Employee,com.horstmann.corejava.Employee和当前包中的Employee .对这个类路径的所有位置中所列出的每一个类进行逐一查看.如果找到了一个以上的类,就会产生编译错误(因为类必须是唯一的,而 import 语句的次序却无关紧要).
编译器的任务不止这些,它还要查看源文件是否比类文件新.如果是这样的话,那么源文件就会被自动地重新编译.
设置类路径
最好采用-classpath(或-cp)选项指定类路径:java -classpath /home/user/classdir:.:/home/user/archives/archive.jar MyProg
或者
java -classpath c:\classdir;.;c:\archive\archive.jar MyProg
整个命令应该书写在一行中.
利用-classpath选项设置路径是首选的办法,也可以通过设置CLASSPATH环境变量完成整个操作.命令格式如下:
export CLASSPAHT=/home/user/classdir:.:/home/user/archives/archive.jar
在Windows shell,命令格式如下:
set CLASSPATH=c:\classdir;.;c:\archives\archive.jar
直到退出shell为止,类路径设置均有效.