一、类加载器与classpath
以下为系统中的三种类加载器,每个类加载器都有自己用来寻找类文件的路径。其中系统类加载器负责加载classpath(用户类路径)上指定的类库,classpath是包含有class文件的目录、jar包或者是war包
-
启动类加载器(Bootstrap ClassLoader) 此类加载器负责将存放在
<JAVA_HOME>\lib
目录中的,或者被-Xbootclasspath
参数所指定的路径中的,并且是 虚拟机识别 的(仅按照文件名识别,如rt.jar,名字不符合的类库即使放在lib目录中也不会被加载)类库加载到虚拟机内存中。启动类加载器无法被Java程序直接引用,用户在编写自定义类加载器时,如果需要把加载请求委派给引导类加载器,直接使用null代替即可。 -
扩展类加载器(Extension ClassLoader) 这个类加载器是由
ExtClassLoader(sun.misc.Launcher$ExtClassLoader)
实现的。它负责将<Java_Home>/lib/ext
或者被java.ext.dir
系统变量所指定路径中的所有类库加载到内存中,开发者可以直接使用扩展类加载器。 -
应用程序类加载器(Application ClassLoader) 这个类加载器是由
AppClassLoader(sun.misc.Launcher$AppClassLoader)
实现的。由于这个类加载器是ClassLoader
中的getSystemClassLoader()
方法的返回值,因此一般称为 系统类加载器。它负责加载用户类路径(ClassPath)
上所指定的类库,开发者可以直接使用这个类加载器,如果应用程序中没有自定义过自己的类加载器,一般情况下这个就是程序中 默认的类加载器 。
二、classpath的获取规则
- 当前路径"."。
- 系统变量CLASSPATH。
- 命令行设置的-cp或者-classpath。
- 使用-jar命令设置的jar包。
其中,四种方式优先级逐步提升,也就是
当前路径 < 系统变量CLASSPATH < -cp命令行设置的路径 < -jar设置的路径
三、如何设置classpath
- 设置系统变量
setenv CLASSPATH path1:path2
- 命令行使用-cp设置
-cp path1:path2...
- -jar命令
-jar xxx.jar
linux下都使用“:”分隔