当前页面位置: » 丰搜网 » 文档中心 » 详细内容
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>-extension-name 扩展名:可选包的唯一标识名字。
java plug-in将此属性值与已经安装的可选包作比较,来确定
applet 所需要的可选包是否被安装。
<extension>-specification-version 规范版本号:定义
applet所需要的可选包规范的最小版本号。
(可选属性)
java plug-in使用这个属性与已安装的可选包的相应属性作比较来确定已安装的可选包是否过时。
<extension>-implementation-version 实现版本号:定义
applet所需要的被实现的可选包的最小版本号。
(可选属性)
java plug-in使用这个属性与已安装的可选包的相应属性作比较来确定是否
需要下载
applet所需要的比较新的可选包。
<extension>-implementation-vendor-id 实现提供商id:定义
applet所要求的实现可选包的提供商的标识。
(可选属性)
java plug-in使用这个属性与已安装的可选包的相应属性作比较来确定是否
需要下载
applet所需要的比较新的可选包。
<extension>-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<
applet在manifest中所要求的,
则
java plug-in将提示用户下载相同提供商的高版本可选包。
(2-1-2)如果可选包和
applet所要求的implementation-vendor-id属性值不匹配,
则
java plug-in将提示用户下载相应的高版本可选包。
下载的url为
applet的manifest文件中的implementaion-url属性值。
(2-2)如果可选包的specification-version属性值<
applet所要求的属性值,则进行下面的比较:
(2-2-1)如果可选包的implementation-vendor-id与
applet的manifest中定义的属性值匹配,
则
java plug-in将提示用户下载相同提供商的高版本可选包。
(2-2-2)如果可选包的implementation-vendor-id与
applet的manifest中定义的属性值不匹配,
则
java plug-in将提示用户下载相应的高版本可选包。
下载的url为a
applet的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文件的<extension>-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)可选包的<extension>-implementaion-url属性必须指向一个jar文件。因为
java plug-in不能下载和安装".exe"或者".bin"等类型的可选包。
某些可选包提供商会因
操作系统的不同而发布不同的jar文件。因此可以通过在
applet的manifest文件中定义带有"$(os-name)$"结构的<extension>-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中有所介绍:
<project name="extension" default="end" basedir=".">
<description>测试extension和extensionset类型</description>
<property name="src.dir" value="${basedir}\test_extensionandextensionset"/>
<target name="extensionwithurl" description="使用jarlib-manifest任务根据extensionset定义的jar和扩展信息生成manifest文件">
<extension id="xmlbean"
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/"
/>
<libfileset id="libfiles" includeurl="true" includeimpl="true" dir="${src.dir}">
<include name="*.jar"/>
</libfileset>
<extensionset id="exset">
<libfileset refid="libfiles"/>
<extension refid="xmlbean"/>
</extensionset>
<jarlib-manifest destfile="${src.dir}\manifest.txt">
<depends refid="exset"/>
</jarlib-manifest>
</target>
<target name="end" depends="extensionwithurl"/>
</project>
四、运行结果:在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
五、源代码下载:[下载文件]