选择显示字体大小

cp的知识风暴系列:"optional package versioning"机制和在applet、ant上的应用

cp的知识风暴系列之一:
java的"optional package versioning"机制和其在appletant上的应用

翻译: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属性来标识自己。当正在运行appletjava 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

        说明:&quot;<&quot;和&quot;>&quot;表示可选文字。
                属性                                                                                说明        
                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为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文件的<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不能下载和安装&quot;.exe&quot;或者&quot;.bin&quot;等类型的可选包。
                某些可选包提供商会因操作系统的不同而发布不同的jar文件。因此可以通过在applet的manifest文件中定义带有&quot;$(os-name)$&quot;结构的<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扩展机制所要使用的&ldquo;optional package&rdquo;(java2之前称为&quot;standard extension&quot;),
                这就像它在jar文件的manifest文件描述的作用相同;也可以代表对可选package的需求。
        注意:
                此类型的工作过程如&ldquo;optional package&rdquo;所描述的一样,如果需要更多的信息请你的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                        扩展实现的版本,必须使用&ldquo;.&rdquo;分割。                        no
                                                                                如1.2.3
                implementationvendor                        实现提供商                                                        no
                implementationvendorid                        实现提供商id                                                        no
                implementationurl                                下载扩展包的url                                                no

extensionset-扩展集合类型
        说明:
                表示多个扩展类型的集合,即多个extension的集合。
        注意:
                此类型工作方式在java2的&quot;optional package&quot;中有所描述。想了解详细情况可以查阅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文件中是否包含&quot;implementation-url&quot;属性。
                                                                                        includeimpl表示jar文件的manifest文件中是否包含&quot;implemetation-*&quot;的属性。
                                                                                        这两个属性的值为&quot;true&quot;或者&quot;false&quot;。

三、代码实现:

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

<project name=&quot;extension&quot; default=&quot;end&quot; basedir=&quot;.&quot;>
        <description>测试extension和extensionset类型</description>
        
        <property name=&quot;src.dir&quot; value=&quot;${basedir}\test_extensionandextensionset&quot;/>
        
        <target name=&quot;extensionwithurl&quot; description=&quot;使用jarlib-manifest任务根据extensionset定义的jar和扩展信息生成manifest文件&quot;>
                <extension id=&quot;xmlbean&quot;
                        extensionname=&quot;xmlbean2&quot;
                        specificationversion=&quot;1.0&quot;
                        specificationvendor=&quot;apache software foundation&quot;
                        implementationvendorid=&quot;apache software foundation&quot;
                        implementationvendor=&quot;apache software foundation&quot;
                        implementationversion=&quot;2.0.0&quot;
                        implementationurl=&quot;http://xmlbeans.apache.org/&quot;
                />
                <libfileset id=&quot;libfiles&quot; includeurl=&quot;true&quot; includeimpl=&quot;true&quot; dir=&quot;${src.dir}&quot;>
                        <include name=&quot;*.jar&quot;/>
                </libfileset>
                <extensionset id=&quot;exset&quot;>
                        <libfileset refid=&quot;libfiles&quot;/>
                        <extension refid=&quot;xmlbean&quot;/>
                </extensionset>        
                <jarlib-manifest destfile=&quot;${src.dir}\manifest.txt&quot;>
                        <depends refid=&quot;exset&quot;/>
                </jarlib-manifest>
        </target>
        
        <target name=&quot;end&quot; depends=&quot;extensionwithurl&quot;/>
</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


五、源代码下载:

[下载文件]


 


关键字 本文所属关键字

相关 与本文相关文章

分类 所有文章关键字导航

源码编程相关

Java   Asp   PHP   .Net   XML   C/C++   CGI   VB   Jsp   J2ee   J2se   J2me   EJB   Servlet   Tomcat   Resin   Struts   Weblogic   Eclipse   ANT   GUI   JMS   Web servise   IDEA   Webphere   Hibernate   Spring   Jboss   Applet   Swing   Socket   Javamail   Perl   Ajax   P2P   安全   模式   框架   测试   开源   游戏

SQL数据库相关

My-SQL   Ms-SQL   Access   DB2   Oracle   Sybase   SQLserver   索引   存储过程   加密   数据库   分页   视图  

手机无线相关

3G   Wap   CDMA   GRPS   GSM   IVR   彩信   短信   无线   增值业务

网页设计制作相关

HTML   CSS   网页配色   网页特效   Javascript   VBscript   Dreamweaver   Frontpage   JS   Web   网站设计

网站建设推广相关

建站经验   网站优化   网站排名   推广   Alexa

操作系统/服务器相关

Windows XP   Windows 2000   Windows 2003   Windows Me   Windows 9.x   Linux   UNIX   注册表   操作系统   服务器   应用服务器

图形图像多媒体相关

Photoshop   Fireworks   Flash   Coreldraw   Illustrator   Freehand   Photoimpact   多媒体   图形图像

标准 网站致力的规范

Valid CSS!

无不良内容,无不良广告,无恶意代码

Valid XHTML 1.0 Transitional

creativecommons