Download Extensions
下载扩展是 JAR 文件中的类集(和相关资源)。 JAR 文件的清单可以包含引用一个或多个下载 extensions 的 Headers。可以通过以下两种方式之一来引用扩展:
-
由
Class\-Path
Headers -
由
Extension\-List
Headers
请注意,清单中最多允许每个。 Class\-Path
Headers 指示的下载扩展仅在下载它们的应用程序的生命周期内下载,例如 Web 浏览器。它们的优点是 Client 端上没有安装任何东西。它们的缺点是每次需要时都下载它们。由Extension\-List
Headers 下载的下载 extensions 将安装到下载它们的 JRE 的/lib/ext
目录中。它们的优点是可以在需要时下载它们。随后,无需下载即可使用它们。但是,如本教程后面所示,它们的部署更加复杂。
由于使用Class\-Path
Headers 的下载扩展程序更简单,因此我们首先考虑一下。例如,假设a\.jar
和b\.jar
是同一目录中的两个 JAR 文件,并且a\.jar
的清单包含以下 Headers:
Class-Path: b.jar
然后,b\.jar
中的类用作扩展类,以实现a\.jar
中的类。 a\.jar
中的类可以调用b\.jar
中的类,而不必在 Classpath 中命名b\.jar
的类。 a\.jar
本身可以是 extensions,也可以不是。如果b\.jar
与a\.jar
不在同一目录中,则Class\-Path
Headers 的值应设置为b\.jar
的相对路径名。
扮演下载扩展角色的类没有什么特别的。仅将它们视为扩展是因为其他某些 JAR 文件的清单引用了它们。
为了更好地了解下载扩展的工作方式,让我们创建一个并使用它。
An Example
假设您要创建一个使用上一部分的RectangleArea
类的 Servlets:
public final class RectangleArea {
public static int area(java.awt.Rectangle r) {
return r.width * r.height;
}
}
在上一部分中,通过将包含RectangleArea
类的 JAR 文件放入 JRE 的lib/ext
目录中,将其制成了已安装的 extensions。通过使其成为已安装的扩展,可以使任何应用程序都可以使用RectangleArea
类,就像它是 Java 平台的一部分一样。
如果您希望能够使用 applet 中的RectangleArea
类,情况会有所不同。例如,假设您有一个使用RectangleArea
类的 ServletsAreaApplet
:
import java.applet.Applet;
import java.awt.*;
public class AreaApplet extends Applet {
Rectangle r;
public void init() {
int width = 10;
int height = 5;
r = new Rectangle(width, height);
}
public void paint(Graphics g) {
g.drawString("The rectangle's area is "
+ RectangleArea.area(r), 10, 10);
}
}
此 Servlets 实例化一个 10 x 5 的矩形,然后使用RectangleArea\.area
方法显示该矩形的区域。
但是,您不能假定下载和使用您的 applet 的每个人都可以在他们的系统上使用RectangleArea
类,作为已安装的 extensions 或其他方式。解决该问题的一种方法是从服务器端提供RectangleArea
类,您可以通过将其用作下载 extensions 来实现。
要了解如何完成此操作,我们假设您已将AreaApplet
Binding 在名为AreaApplet\.jar
的 JAR 文件中,并且将RectangleArea
类 Binding 在RectangleArea\.jar
中。为了将RectangleArea\.jar
视为下载扩展,必须在AreaApplet\.jar
清单的Class\-Path
Headers 中列出RectangleArea\.jar
。 AreaApplet\.jar
的清单可能看起来像这样,例如:
Manifest-Version: 1.0
Class-Path: RectangleArea.jar
此清单中Class\-Path
Headers 的值为RectangleArea\.jar
,未指定路径,表示RectangleArea\.jar
与 Servlets 的 JAR 文件位于同一目录中。
有关 Classpath 标题的更多信息
如果 Servlets 或应用程序使用多个 extensions,则可以在清单中列出多个 URL。例如,以下是有效的 Headers:
Class-Path: area.jar servlet.jar images/
在Class\-Path
Headers 中,列出的所有不以'/
'结尾的 URL 均假定为 JAR 文件。以/
结尾的 URL 表示目录。在前面的示例中,images/
可能是包含小应用程序或应用程序所需资源的目录。
请注意,清单文件中仅允许一个Class\-Path
Headers,清单中的每一行不得超过 72 个字符。如果需要指定的 Classpath 条目多于一行,则可以将它们扩展到后续的延续行。每条连续线以两个空格开头。例如:
Class-Path: area.jar servlet.jar monitor.jar datasource.jar
provider.jar gui.jar
将来的发行版可能会消除以下限制:每个 Headers 仅包含一个实例,并且将行数限制为仅 72 个字符。
下载 extensions 可以是“菊花链式”,这意味着一个下载 extensions 的清单可以具有一个Class\-Path
头,该头引用第二个 extensions,该引用可以引用第三个 extensions,依此类推。
安装下载扩展
在上面的示例中,仅当加载 Servlets 的浏览器仍在运行时,Servlets 下载的 extensions 才可用。但是,如果 Servlets 和 extensions 的清单中都包含其他信息,则 Servlets 可以触发扩展的安装。
由于此机制扩展了平台的核心 API,因此应谨慎使用。它很少适合单个或一小组应用程序使用的interface。所有可见符号应遵循反向域名和类层次结构约定。
基本要求是,Servlets 及其使用的 extensions 都必须在其清单中提供版本信息,并且必须对其进行签名。版本信息允许 Java 插件确保扩展代码具有 applet 期望的版本。例如,AreaApplet
可以在其清单中指定areatest
extensions:
Manifest-Version: 1.0
Extension-List: areatest
areatest-Extension-Name: area
areatest-Specification-Version: 1.1
areatest-Implementation-Version: 1.1.2
areatest-Implementation-Vendor-Id: com.example
areatest-Implementation-URL: http://www.example.com/test/area.jar
area\.jar
中的清单将提供相应的信息:
Manifest-Version: 1.0
Extension-Name: area
Specification-Vendor: Example Tech, Inc
Specification-Version: 1.1
Implementation-Vendor-Id: com.example
Implementation-Vendor: Example Tech, Inc
Implementation-Version: 1.1.2
Servlets 和 extensions 都必须由同一签名者签名。签名 jar 文件将对它们进行原位修改,从而在清单文件中提供更多信息。签名有助于确保仅安装受信任的代码。对 jar 文件进行签名的一种简单方法是,首先创建一个密钥库,然后使用该密钥库来保存 applet 和 extensions 的证书。例如:
keytool -genkey -dname "cn=Fred" -alias test -validity 180
系统将提示您 Importing 密钥库和密钥密码。生成密钥后,可以对 jar 文件进行签名:
jarsigner AreaApplet.jar test
jarsigner area.jar test
系统将提示您 Importing 密钥库和密钥密码。有关keytool
,jarsigner
和其他安全工具的更多信息,请访问Java 2 平台安全性工具摘要。
这是AreaDemo\.html
,它加载 Servlets 并导致扩展代码被下载和安装:
<html>
<body>
<applet code="AreaApplet.class" archive="AreaApplet.jar"/>
</body>
</html>
首次加载页面时,系统会告知用户该 applet 需要安装扩展。随后的对话框将通知用户有关已签名的 Servlets 的信息。接受两者都可以将扩展安装在 JRE 的lib/ext
文件夹中并运行 Servlets。
重新启动 Web 浏览器并加载相同的网页后,由于已安装了area\.jar
,因此仅显示有关 Servlets 签名者的对话框。如果在不同的 Web 浏览器中打开AreaDemo\.html
(假设两个浏览器使用相同的 JRE),也是如此。