站内搜索: 请输入搜索关键词

当前页面: 开发资料首页Java 专题CP的知识风暴系列:"Optional Package Versioning"机制和在applet、ant上的应用

CP的知识风暴系列:"Optional Package Versioning"机制和在applet、ant上的应用

摘要: CP的知识风暴系列:"Optional Package Versioning"机制和在applet、ant上的应用
内容:
CP的知识风暴系列之一:
java的"Optional Package Versioning"机制和其在applet、ant上的应用

翻译:cleverpig


版权声明:可以任意转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本声明
原文地址:
http://www.matrix.org.cn/resource/article/43/43734_Optional_Package_Versioni.html
关键词: optional package,app


目标:学习java的"Optional Package Versioning"机制,并在ant中加以实践。研究ant中extension和extensionSet的使用。


一、知识铺垫:
1。什么是"Optional Package Versioning"?
简单的说就是java2平台对"Optional Package"的版本识别。
从java1.3之后的java2平台增加了支持使用jar文件中的manifest属性文件描述"Optional Package"(后面称为"可选包")的扩展集合。
这样可以使applet能够描述所需要的裳“墓娣栋姹竞吞峁┥绦畔ⅰ6飧鯽pplet所使用的manifest描述了applet
运行所要的可选包的最小版本和java的Plug-in能够下载该可选包的URL。
在以下三种情况下均需要下载可选包:
1。需要的可选包没有安装在java runtime环境
2。被安装的可选包为旧版本
3。被安装的可选包并非来自制定的提供商
manifest的属性是如何描述了规范版本和提供商信息的呢?

2。下面就要介绍一下manifest文件在被安装的可选包是如何使用的:
先展示一个可选包简单的manifest文件:

Extension-Name:javax.help
Specification-Vendor:Sun Microsystems,Inc
Specification-Version:1.0
Implementation-Vendor-Id:com.sun
Implementation-Version:1.0

说明:
属性 说明
Extension-Name 扩展名:描述包含在jar文件中的可选包名字,
这个名字是对可选包的唯一标识就像package的名字一样。
Specification-Vendor 规范提供商:标识创建本可选包遵循规范的公司。
Specification-Version 规范版本号:可选包所遵循的规范的版本。
Implementation-Vendor-Id 实现提供商ID:表示生产可选包的公司的唯一标识。
Implementation-Vendor 实现提供商:生产可选包的公司名字。
这个名字仅用来接受用户反馈的目的,并且Java Plug-in并
不将其作为可选包提供商的唯一标识,而是使用Implementation-Vendor-Id
作为可选包提供商的唯一标识。
Implementation-Version 实现提供商版本:生产可选包的提供商的版本号。
每一个安装在Java runtime环境下的可选包都使用manifest属性来标识自己。当正在运行applet的Java Plug-in需要某个
可选包时,plug-in将可以访问这些manifest属性,来判断已安装的可选包的"提供商"和"版本"是否与applet所要求的对应。
以上的所有manifest属性都应该在可选包的manifest文件中。
如果plug-in发现可选包的manifest文件中缺少某个属性,则它将认为可选包与applet是不匹配的。
而applet是如何使用manifest属性描述它所要求的信息呢?

3。applet jar文件所使用的manifest属性
首先先看一个manifest文件的例子,来了解applet jar文件中的manifest结构。

Extension-List:javahelp java3d
javahelp-Extension-Name:javax.help
javahelp-Specification-Version:1.0
javahelp-Implementation-Version:1.0.3
javahelp-Implementation-Vendor-Id:com.sun
javahelp-Implementation-URL:http://java.sun.com/products/stdext/javahelp.jar
java3d-Extension-Name:javax.3d
java3d-Specification-Version:1.0
java3d-Implementation-Version:1.2.1
java3d-Implementation-Vendor-Id:com.sun
java3d-Implementation-URL:http://java.sun.com/products/stdext/java3d.jar

说明:"<"和">"表示可选文字。
属性 说明
Extension-List 扩展列表:applet所需要的可选包列表。各个可选包之间用空格分隔。
每个可选包还将有下面的一套附加属性来说明applet所需要的
可选包的版本和提供商。
-Extension-Name 扩展名:可选包的唯一标识名字。
Java Plug-in将此属性值与已经安装的可选包作比较,来确定applet
所需要的可选包是否被安装。
-Specification-Version 规范版本号:定义applet所需要的可选包规范的最小版本号。
(可选属性) Java Plug-in使用这个属性与已安装的可选包的相应属性作比较来确定已安装的可选包是否过时。
-Implementation-Version 实现版本号:定义applet所需要的被实现的可选包的最小版本号。
(可选属性) Java Plug-in使用这个属性与已安装的可选包的相应属性作比较来确定是否
需要下载applet所需要的比较新的可选包。
-Implementation-Vendor-Id 实现提供商ID:定义applet所要求的实现可选包的提供商的标识。
(可选属性) Java Plug-in使用这个属性与已安装的可选包的相应属性作比较来确定是否
需要下载applet所需要的比较新的可选包。
-Implementation-URL 实现的可选包下载URL:表示最新可选包下载URL,当applet要求的可选包没有安装,
(可选属性) Java Plug-in将使用此URL下载。

4。Java Plug-in在装载applet时如何取舍可选包?
Java Plug-in在转载applet时通常从以下步骤来取舍可选包的:
(1)如果applet要求的具有特定Extension-Name属性的可选包没有被安装,则Java Plug-in将提示用户下载此可选包。
(2)如果applet要求的具有特定Extension-Name属性的可选包已被安装,则Java Plug-in将进行以下比较:
(2-1)如果可选包的Specification-Version属性值>=applet所要求的属性值,则进行下面的比较:
(2-1-1)如果可选包和applet所要求的Implementation-Vendor-Id属性值匹配,则:
(2-1-1-1)如果可选包的Implementation-Version>=applet在manifest中所要求的,
即说明已经安装了高版本的可选包。无需任何其他操作。
(2-1-1-2)如果可选包的Implementation-Version 则Java Plug-in将提示用户下载相同提供商的高版本可选包。
(2-1-2)如果可选包和applet所要求的Implementation-Vendor-Id属性值不匹配,
则Java Plug-in将提示用户下载相应的高版本可选包。
下载的URL为applet的manifest文件中的Implementaion-URL属性值。
(2-2)如果可选包的Specification-Version属性值 (2-2-1)如果可选包的Implementation-Vendor-Id与applet的manifest中定义的属性值匹配,
则Java Plug-in将提示用户下载相同提供商的高版本可选包。
(2-2-2)如果可选包的Implementation-Vendor-Id与applet的manifest中定义的属性值不匹配,
则Java Plug-in将提示用户下载相应的高版本可选包。
下载的URL为aapplet的manifest文件中的Implementaion-URL属性值。
总之,就是只有符合applet的Specification-Version、Implementation-Vendor-Id,Implementation-Version在
applet要求的版本之上时,才可以直接使用,无需下载。
如果applet的manifest中不包含可选包的属性,则Java Plug-in将接受可选包的manifest文件中的相应属性值。

5。最后说说可选包的下载与安装:
下面是Java Plug-in下载可选包需要考虑的:
(1)下载可选包的URL是applet manifest文件的-Implementation-URL属性值,不受到被applet codebase的限制。
(2)所有下载的文件都将有DSA或者RSA证书的签名。任何一个未经签名的可选包都不能安装,而将被视为被处理过的可选包,通过applet的
类装载器装载,并享有applet的安全属性。
(3)当Java Plug-in从applet的manifest文件中所标识的URL下载可选包时,它在验证可选包的签名后检查可选包的manifest文件中是否
定义Main-Class属性。如果可选包的manifest 文件中不包含此属性,则Java Plug-in就会简单地把可选包的jar文件放入到Java runtime
环境的可选包目录(在java2 sdk中为jre/lib/ext目录,在java2 JRE为lib/ext目录)。
某些可选包的jar文件中包含它自己的安装程序,这些安装程序可以用本地代码或者java语言编写。此类安装程序一般用于如下场合:用来安装本地库
或者访问微软Windows注册表等。如果Java Plug-in发现可选包的manifest文件中包含Main-Class属性的话,它将这个Main-Class所定义的
类作为Java语言编写的安装程序,并调用此类的main()方法来进行可选包的安装;可选包也可通过在manifest文件中定义Extension-Installation
属性来达到上面的目的。这个属性指出了Java Plug-in安装可选包时所用的 本地安装程序。
(4)可选包的-Implementaion-URL属性必须指向一个jar文件。因为Java plug-in不能下载和安装".exe"或者".bin"等类型的可选包。
某些可选包提供商会因操作系统的不同而发布不同的jar文件。因此可以通过在applet的manifest文件中定义带有"$(os-name)$"结构的-Implementation-URL
属性自动根据目标操作系统类型下载不同的jar文件,例如:
javaExt-Implementation-URL:http://.../stdext/javaExt-$(os-name)$.jar
在这里,$(os-name)$的值为目标操作系统中名字为os.name的java系统属性值。

6。参考资料:
java2标准版的guide/extensions/versioning.html的Optional Package Versioning部分,或者查看在线文档http://java.sun.com/j2se/1.3/docs/guide/extensions/versioning.html。

二、ant的两个可选类型:

首先介绍两个ant的optinal type:extension、extensionset。第三部分将对其进行代码实现。

extension-扩展类型
说明:
这个工具类型即代表java2扩展机制所要使用的“Optional Package”(java2之前称为"standard Extension"),
这就像它在jar文件的manifest文件描述的作用相同;也可以代表对可选package的需求。
注意:
此类型的工作过程如“Optional Package”所描述的一样,如果需要更多的信息请你的java2标准版的guide/extensions/versioning.html
的Optional Package Versioning部分,或者查看在线文档http://java.sun.com/j2se/1.3/docs/guide/extensions/versioning.html。
用法:通常作为ExtensionSet的内嵌元素使用。
属性 说明 必需
extensionName 扩展的名字 YES
specificationVendor 规范提供商 NO
specificationVersion 扩展实现的版本,必须使用“.”分割。 NO
如1.2.3
implementationVendor 实现提供商 NO
implementationVendorId 实现提供商ID NO
implementationURL 下载扩展包的URL NO

ExtensionSet-扩展集合类型
说明:
表示多个扩展类型的集合,即多个extension的集合。
注意:
此类型工作方式在java2的"Optional Package"中有所描述。想了解详细情况可以查阅java2标准版的guide/extensions/versioning.html,
或者查看在线文档http://java.sun.com/j2se/1.3/docs/guide/extensions/versioning.html。
用法:
属性 说明
extension 定义被添加到扩展集合的扩展类型
fileset 用fileset类型来实现对扩展集合类型的扩展,
fileset中被使用的文件都是jar文件。
LibFileSet 同fileset类似,但是extensionSet的扩展信息将被LibFileSet所修改。
两个特有的属性:
includeUrl表示jar文件的manifest文件中是否包含"Implementation-URL"属性。
includeImpl表示jar文件的manifest文件中是否包含"Implemetation-*"的属性。
这两个属性的值为"true"或者"false"。

三、代码实现:

编写ant的build文件:OptionalTypes_extensionAndextensionSet.xml。
内容如下,其中任务的功能在description中有所介绍:


测试extension和extensionSet类型




extensionName="xmlbean2"
specificationVersion="1.0"
specificationVendor="Apache Software Foundation"
implementationVendorID="Apache Software Foundation"
implementationVendor="Apache Software Foundation"
implementationVersion="2.0.0"
implementationURL="http://xmlbeans.apache.org/"
/>
















四、运行结果:

在test_extensionAndextensionSet目录中生成manifest.txt文件:

Manifest-Version: 1.0
Created-By: Apache Ant Apache Ant version 1.6.5 compiled on June 2 200
5
lib0-Extension-Name: xmlbean2
lib0-Implementation-Vendor-Id: Apache Software Foundation
lib0-Specification-Version: 1.0
lib0-Implementation-URL: http://xmlbeans.apache.org/
lib0-Specification-Vendor: Apache Software Foundation
Extension-List: lib0
lib0-Implementation-Vendor: Apache Software Foundation
Optional-Extension-List:
lib0-Implementation-Version: 2.0.0


五、源代码下载:

Download File Java, java, J2SE, j2se, J2EE, j2ee, J2ME, j2me, ejb, ejb3, JBOSS, jboss, spring, hibernate, jdo, struts, webwork, ajax, AJAX, mysql, MySQL, Oracle, Weblogic, Websphere, scjp, scjd
CP的知识风暴系列之一:
java的"Optional Package Versioning"机制和其在applet、ant上的应用

翻译:cleverpig


版权声明:可以任意转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本声明
原文地址:
http://
↑返回目录
前一篇: Web应用中Java的速度真相探讨
后一篇: 在Swing中使用高级的MVC和POJOs