为了展示classpath和扩展机制的主要区别,我将会把编译过的HelloWorld.class文件归档到一个jar包里,命名为HelloWorld.jar。并把它放在一个跟编译过的Main.class不同的目录下。
  为了展示传统的classpath的使用,我把HelloWorld.jar放在一个叫做C:hello的目录下并且会用通配符访问JAR来给Main使用。下面的两个截图对此进行了展示。

  以上两个截图说明,尽管我删掉了当前目录下的HelloWorld.class,Java 主应用仍然能加载它。这是因为Java launcher被告知(通过-classpath这个可选参数)去C:hello目录下寻找。使用扩展机制,不需要把类放到当前目录或者指定到 classpath下可以加载。接下来的截图展示了这一点。

  上面的截图说明,当某个类是在扩展目录下的某个JAR里,Java launcher甚至不需要把HelloWorld.class放到同一个目录下或者在classpath中指定。这常常被用来说明使用扩展机制的优点。因为所有在这个JRE(或者可能是主机上的所有应用)上运行的程序都可以不用在classpath上指定能看到扩展目录下的类。
  使用传统classpath方式——指导应用去加载JAR中的类,包含.class文件的JAR文件必须以.jar结尾。接下来的截图展示了当把在 classpath引用的目录下的HelloWorld.jar重命名为HelloWorld.backup之后所发生的事情。

  上面这张图展示了当classpath引用的目录下JAR文件没有以.jar结尾时发生的NoClassDefFoundError异常。可能有点令人惊讶,扩展机制不是这样工作的。所有在扩展目录下的JAR文件,不管后缀名是什么甚至没有后缀名都会被加载。接下来的截图展示了这一点。