Installed Extensions

安装的扩展是 Java Runtime Environment(JRE™)软件的lib/ext目录中的 JAR 文件。顾名思义,JRE 是 Java 开发套件的运行时部分,包含平台的核心 API,但没有诸如编译器和调试器之类的开发工具。 JRE 可以单独使用,也可以作为 Java 开发工具包的一部分使用。

JRE 是 JDK 软件的严格子集。 JDK 软件目录树的一个子集如下所示:

JDK 软件目录树

JRE 由图中高亮框中的那些目录组成。无论您的 JRE 是独立的还是 JDK 软件的一部分,运行时环境都会自动将 JRE 目录lib/ext中的任何 JAR 文件都视为 extensions。

由于已安装的扩展扩展了平台的核心 API,因此请谨慎使用。它们很少适合单个或少量应用程序使用的interface。

此外,由于已安装扩展定义的符号在所有 Java 进程中都是可见的,因此应注意确保所有可见的符号均遵循适当的“反向域名”和“类层次结构”约定。例如com\.mycompany\.MyClass

从 Java 6 开始,扩展 JAR 文件也可以放置在独立于任何特定 JRE 的位置,以便扩展可以由系统上安装的所有 JRE 共享。在 Java 6 之前,值java\.ext\.dirs指向单个目录,但是从 Java 6 开始,它是目录列表(如CLASSPATH),用于指定在其中搜索 extensions 的位置。路径的第一个元素始终是 JRE 的lib/ext目录。第二个元素是 JRE 外部的目录。此其他位置允许扩展 JAR 文件安装一次,并由该系统上安装的多个 JRE 使用。位置因 os 而异:

  • Solaris™os:/usr/jdk/packages/lib/ext

  • Linux:/usr/java/packages/lib/ext

  • Microsoft Windows:%SystemRoot%\Sun\Java\lib\ext

请注意,放置在上述目录之一中的已安装 extensions 扩展了该系统上 JRE 的* each *(Java 6 或更高版本)平台。

一个简单的例子

让我们创建一个简单的已安装扩展。我们的扩展包含一个类RectangleArea,它计算矩形的面积:

public final class RectangleArea {
    public static int area(java.awt.Rectangle r) {
        return r.width * r.height;
    }
}

此类具有一个方法area,该方法采用java\.awt\.Rectangle的实例并返回矩形的面积。

假设您要使用名为AreaApp的应用程序测试RectangleArea

import java.awt.*;

public class AreaApp {
    public static void main(String[] args) {
        int width = 10;
        int height = 5;

        Rectangle r = new Rectangle(width, height);
        System.out.println("The rectangle's area is " 
                           + RectangleArea.area(r));
    }
}

此应用程序实例化一个 10 x 5 的矩形,然后使用RectangleArea\.area方法打印出矩形的区域。

在没有扩展机制的情况下运行 AreaApp

首先,让我们回顾一下如何在不使用扩展机制的情况下运行AreaApp应用程序。我们假设RectangleArea类 Binding 在名为area\.jar的 JAR 文件中。

当然,RectangleArea类不是 Java 平台的一部分,因此您需要将area\.jar文件放在 Classpath 中才能运行AreaApp而不遇到运行时异常。例如,如果area\.jar在目录/home/user中,则可以使用以下命令:

java -classpath .:/home/user/area.jar AreaApp

此命令中指定的 Classpath 既包含当前目录(包含AreaApp\.class),又包含指向包含RectangleArea软件包的 JAR 文件的路径。通过运行以下命令,您将获得所需的输出:

The rectangle's area is 50

使用扩展机制运行 AreaApp

现在,让我们看看如何使用RectangleArea类作为扩展来运行AreaApp

要使RectangleArea类成为 extensions,请将文件area\.jar放在 JRE 的lib/ext目录中。这样做会自动使RectangleArea成为已安装扩展的状态。

area\.jar作为扩展安装后,您可以运行AreaApp,而无需指定 Classpath:

java AreaApp

因为您使用的是area\.jar作为已安装的扩展,所以即使您未在 Classpath 中指定RectangleArea类,运行时环境也能够找到并加载该类。同样,系统上任何用户所运行的任何 applet 或应用程序都将能够找到并使用RectangleArea类。

如果系统上安装了多个 JRE(Java 6 或更高版本),并且希望RectangleArea类可作为所有这些的扩展,而不是将其安装在特定 JRE 的lib/ext目录中,请在系统中安装-广泛的位置。例如,在运行 Linux 的系统上,将area\.jar安装在目录/usr/java/packages/lib/ext中。然后AreaApp可以使用该系统上安装的不同 JRE 运行,例如,如果将不同的浏览器配置为使用不同的 JRE。