Java 启动器如何查找 JAR-CLASS-PATH 类

JAR 文件通常包含一个“清单” - 该文件列出 JAR 的内容。清单可以定义 JAR-CLASS-PATH ,而后者进一步扩展类路径(仅当从该 JAR 中加载类时)。查找 JAR-CLASS-PATH 访问的类时将按以下顺序进行:

通常,查找 JAR-CLASS-PATH 项引用的类时,即将其当作 JAR 文件的一部分。出现在 JAR-class-path 中的 JAR 文件将在 JAR-CLASS-PATH 前面的类路径项之后及 JAR-CLASS-PATH 后面的类路径项之前进行搜索。

然而,如果 JAR-CLASS-PATH 指向一个已搜索过的 JAR 文件(例如扩展或在类路径前面列出的 JAR 文件),则不再搜索该 JAR 文件(这种优化方式提高了效率,防止了循环搜索)。这样的 JAR 文件将在它出现的地方(类路径中更靠前的地方)进行搜索。

如果 JAR 文件作为扩展安装在 jdk 的 ext 子目录中,则忽略它所定义的 JAR-CLASS-PATH。我们假定扩展所需的所有类都是 JDK 的一部分或已作为扩展安装。

OldJava 启动器如何查找类

oldjava 启动器不支持 Java 扩展框架。下列情况下,它提供向后兼容性:

有一个实现 1.1 风格的安全管理器(与 1.2 类加载方法不兼容)的应用程序,或者

正在加载的类已生成,或以与 1.2 类结构不兼容的方式(例如用模糊器)管理。

(有关这些问题的详细信息,参见 Windows 或 Solaris 的 java 启动器参考页。)

oldjava 启动器在一个类路径中组合了自举类和用户类。用 oldjava 指定类路径的方法有两种:

在 CLASSPATH 环境变量中指定用户类路径。用户类路径加在预定义的自举类路径后。

用命令行选项 -cp 或 -classpath 指定完整的类路径。忽略 CLASSPATH 的值和预定义的自举类路径。

组合类路径存储在 java.class.path 系统属性中。

Javac 和 JavaDoc 如何查找类

javac 和 javadoc 工具使用两种不同方式使用类文件。

象其它 Java 应用程序一样,javac 和 javadoc 必须加载多种类文件才能运行。

要处理它们操作的源代码,javac 和 javadoc 必须获得源代码中所用对象类型的信息。

用来解析源代码引用的类文件大部分和用来运行 javac 和 javadoc 的类文件相同,但有重要的一些例外:

javac 和 javadoc 经常解析对与 javac 或 javadoc 的实现无关的类和接口的引用。有关被引用的用户类和接口的信息可能以类文件、源代码文件或二者结合起来的形式存在。

tools.jar 中的工具类仅用来运行 javac 和 javadoc。工具类不用来解析源代码引用,除非 tool.jar 在用户类路径中。

程序员可能要用另一种 Java 平台实现解析自举类或扩展类引用。利用 -bootclasspath 和 -extdirs 选项,javac 和 javadoc 都可以支持这种操作。使用这些选项不会修改用来运行 javac 或 javadoc 工具本身的类文件集。

如果在类文件和源文件中定义了被引用的类,则 javadoc 通常使用源文件(javadoc 不编译源文件)。同样情况下,javac 使用类文件,但会自动重新编译它认为过期的类文件。自动重新编译的规则将在 javac 文档(Windows 或 Solaris)中介绍。