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