文章目录
Java中类存储在文件系统的子目录中,类的路径必须和包名匹配。
类文件也可以存储在JAR文件中,JAR文件使用ZIP格式组织文件和子目录,例如jre/lib/rt.jar中包含了数千个类库文件。
1 如何使你的类被多个程序共享
- 把类放到一个包树状结构的目录中,例如在/home/user/classdir中添加com.horstmann.corejava.Emplyee类,应该把Employee类文件放在/home/user/classdir/com/horstmann/corejava中
- 将JAR文件放在一个目录中,例如在/home/user/archives
- 设置类路径(class path)
2 类路径是什么
类路径告诉javac编译器和java解释器(JVM的一部分)在哪里寻找它们要执行或导入的类。
2.1 一个类路径应该包含什么
在Windows系统中,类路径的不同项目之间采用分号(;)分割,例如:
c:\classdir;.;c:\archives\archive.jar
一般类路径包含这三种项目:
- 类目录
- 当前目录,一般用(.)表示
- JAR文件
一般运行时库文件(rt.jar和在jre/lib与jre/lib/ext目录下的其他JAR文件)会被自动搜索,所以无需将它们显式地列在类路径中。
2.2 设置当前目录的重要性
javac编译器总是在当前的目录中查找文件,而java虚拟机仅在类路径中包含有(.)的情况下才会查看当前目录,所以类路径中一定要包含当前目录,否则可能出现程序能够通过编译但无法运行的情况。
2.3 JVM如何定位类文件
假设给定了类路径如下:
c:\user\classdir;.;c:\user\archives\archive.jar
虚拟机如何搜索com.horstmann.corejava.Employee类文件呢?
- 首先查看存储在jre/lib和jre/lib/ext目录下的JAR文件中所存放的系统类文件
- 检查c:\user\classdir\com\horstmann\corejava\Employee.class文件是否存在
- 检查 .\com\horstmann\corejava\Employee.class文件是否存在
- 检查 c:\user\archives\archive.jar中是否存在com\horstmann\corejava\Employee.class类。
2.4 javac编译器如何定位类文件
类路径和2.3相同,javac编译器如何寻找Employee类呢?
如何引用了一个类并且没有指出这个类所在的包,那么编译器将首先查找包含这个类的包,并询查所有的import指令,确定其中是否包含了被引用的类。
假定源文件包含指令:
import java.util.*;
import com.horstmann.corejava.*;
且源代码引用了Employee类,那么编译器将试图查找java.lang.Employee(java.lang是默认导入的)、java.util.Employee、com.horstmann.corejava.Employee类和当前包中的Employee类。并逐一查看,但是如果找到了不止一个Employee类,就会产生编译错误。
3 如何设置类路径
3.1采用 -classpath(或 -cp)指定类路径
java -classpath c:\user\classdir;.;c:\user\archives\archive.jar MyProg
3.2 设置CLASSPATH环境变量
在Windows Shell中
set CLASSPATH=c:\user\classdir;.;c:\user\archives\archive.jar