当JVM(Java虚拟机)启动时,会形成由三个类加载器组成的初始类加载器层次结构:
bootstrap classloader
|
extension classloader
|
system classloader
system classloader是类路径加载器,即加载classpath路径
下面分三种情况说明classpath路径(windows 系统)。
1.在DOS命令中,可以使用下面命令来查看当前系统的
C:/>echo %classpath%
结果为 F:/Tomcat 6.0/lib
I:/test/路径下有Test1.class,Test2.class
这两个文件的源代码内容如下:
public class Test1
{
public static void main(String[] args)
{
Test2 test2 = new Test2();
test2.print();
}
}
public class Test2
{
public void print()
{
System.out.println("this is Test2");
}
}
在DOS中进入I:/test 输入如下的命令:
从图中可以看出,运行Test1.java时抛出错误。
原因:Test1中定义Test2对象时,类加载器会去加载Test2 ,类加载器加载类的路径就是系统变量classpath中指定的路径,而Test2类文件并不在F:/Tomcat 6.0/lib中,所以会抛出java.lang.NoClassDefFoundError错误,在DOS中重新设置系统变量classpath的值为“.”,“.”代表当前路径即I:/test,这时再运行Test1,打印出信息,运行成功,因为类加载器在I:/test下找到了Test2。
2.在eclipse中新建一个java工程项目MyProject,则会在MyProject工程下产生一个.classpath文件,这个文件就是MyProject工程编译和运行时使用的classpath环境,这时我们在dos命令下键入echo %classpath%命令所显示的系统环境变量的classpath路径会失效,类路径加载器只会去.classpath文件中指定的路径加载类文件或其它资源(eg:XXXX.properties),而不会去加载系统环境变量classpath所指的路径中的类文件或其它资源。
在eclipse中设置工程的classpath:右键工程名->"properties"->"java build path"->在右边的标签页中选择"libraries",可以加上你想要的任何路径和jar包,设定好后在工程下的.classpath文件中可以看到我们加进去的路径和jar包,(注:不要手动修改这个文件,不然会报错的,只能用来看),在"Order and Export"标签页中可以指定类加载器加载路径的顺序,修改后可以再.classpath文件中看到顺序发生变化。
3.tomcat中classpath的路径设定以及类加载器的相关知识,可以去开tomcat的官方资料,上面介绍的非常详细。
网站地址:http://tomcat.apache.org/tomcat-6.0-doc/class-loader-howto.html
注:
实际上,如果使用的是1.5以上版本的JDK,完全可以不用设置CLASSPATH环境变量
那么CLASSPATH环境变量的作用时什么呢?当我们使用java Java类名 命令来运行Java程序时,JRE会自动在当前目录下搜索java类,但是1.4以前版本的JDK都没有设计这个功能,这意味着即使当前路劲已经包含了HelloWord.class,并在当前路劲下执行java HelloWord,系统将一样提示找不到HelloWord类。
如果使用1.4以前版本的JDK,则需要在CLASSPATH环境变量中添加一点(.),用以告诉JRE需要在当前路劲下搜索Java类。
除此之外,编译和运行Java程序还需要JDK的lib路径下的dt.jar和tools.jar文件里的Java类,因此还需要把这两个文件添加到CLASSPATH环境变量里。
因此,若使用1.4以前版本的JDK来编译和运行java程序,常常需要设置CLASSPATH环境变量值为 .;%JAVA_HOME%/lib/dt.jar;%JAVA_HOME%/lib/tools.jar
后来SUN改进了JDK的设计,JRE会自动搜索当前路径下的类文件,而且使用Java的编译和运行工具时,系统可以自动加载dt.jar 和 tools.jar文件中的Java类,因此不再需要设置CLASSPATH环境变量