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
的值).