JVM随笔(二)之搜索类

上章我们知道JVM可以通过参数的方式指定main方法所在的主类,但是即使最简单的"HelloWorld"程序,也是无法自行运行的,HelloWorld程序如下:

```java public class HelloWorld{ public static void main(String[] args){ System.out.println("Hello World"); } } ```

在加载HelloWorld之前,首先JVM还需要加载它的超类,也就是java.lang.Object。在调用main方法之前,还需要加载其参数也就是,java.lang.String和java.lang.String[]。执行main方法中的打印方法,还需要加载java.lang.System类,等等。那么JVM将从哪里去加载这些类呢?

java虚拟机规范中没有规定虚拟机从哪里加载类,因此不同的虚拟机可以采用不同的方式加载。Oracle的Java虚拟机的实现是根据类路径来进行搜索。按照搜索的先后顺序,类路径可以分为如下三个部分。

  • 启动类路径(bootstrap classpath)

    启动类路径默认对应jre/lib目录,java的标准库(大部分在rt.jar中)位于该路径下。

  • 扩展类路径(extension classpath)

    扩展类路径默认对应jre/lib/ext,使用Java扩展机制的类位于该路径下,比如 swing的一些类都是Java扩展。

  • 用户类路径(user classpath)

    我们自己应用中的类,以及第三方的类库位于用户类路径。

我们可以使用-Xbootclasspath选项可以对启动类路径进行修改,但是通常不需要需改启动类路径。可以使用-Djava.ext.dirs=directories-extdirs directories修改扩展类路径。

用户类路径默认是当前目录,也就是`.`。可以通过设置CLASSPATH环境变量来进行修改用户类路径,但是这样不够灵活,所以一般不推荐使用。更好的办法是通过java命令传递一个`-classpath`或`-cp`选项进行指定。参数的优先级高于CLASSPATH环境变量。

其中`-classpath`或`-cp`选项既能指定目录,也可以指定jar文件或者zip文件,如下


java -cp /path/classes :/path/classes2 ...
java -cp /path/lib.jar:/path/lib1.jar ...
java -cp /path/lib.zip:/path/lib1.zip


其中可以多个混合使用,分割符在Windows下使用;在Linux下使用:,在java6后还可以使用通配符*去进行模糊匹配

原文地址:https://www.cnblogs.com/wuqinghua-blog/p/10994904.html