Java是如何查找class的?
Contents
Java中的三种类型class
Bootstrap classes
这些是核心class,即Java平台最基础的class. 它放在 rt.jar(runtime),以及其他一些非常重要的jar包里.
它是通过参数sun.boot.class.path来决定的.也有一个非标准的JVM参数来决定这些class:-Xbootclasspath.例子:
java -Dsun.boot.class.path=/path/to/xx1.jar:/path/to/xx2.jar(注意,不同的操作系统,分隔符不同,*unix下是:,Windows下的是;)
使用-Xbootclasspath方式有以下三种:
替换
java -Xbootclasspath:/path/to/xx1.jar:/path/to/xx2.jar
追加
即在原java的bootstrap cless的基础上,追加以下这些jar包的class
java -Xbootclasspath/a:/path/to/xx1.jar:/path/to/xx2.jar
前置
即在原java的bootstrap class的基础上,前置(即优先)查找以下jar包的class
java -Xbootclasspath/p:/path/to/xx1.jar:/path/to/xx2.jar
Extension classes
这些是扩展class,由用于Java扩展机制使用.这些是由一些在扩展目录的jar文件组成的.它们放在jre/lib/ext目录, 该目录下的所有jar文件是使用Java Extension Framework加载的.
可以使用-Djava.ext.dirs参数来修改这些目录的值.例如:
java -Djava.ext.dirs=/path/to/your/dirs1:/path/to/your/dirs2(*unix是:分隔符,Windows是;分隔符)
User classes
这些值存放在java.class.path系统属性里.
这个是由开发者以及那些没有使用扩展机制的第三方定义的class. 它是通过-classpath 或者 -cp 的命令行选项或者CLASSPATH环境变量来定位class的.
它的值有以下几种情况:
.:意味着这些class在当前目录或者子目录(如果有package)吧.
CLASSPATH: 如果有这个环境变量,它就会覆盖默认的值.
-cp或者-classpath: 它会覆盖默认的值,以及CLASSPATH环境变量的值.
通过-jar来启动的: 所有的class,都必须包含在jar文件里.(即它会忽略CLASSPATH以及-cp或-classpath的值).