<name></name>Steven Kim
软件工程师, Tivoli-IBM
2001 年 9 月 11 日
<abstract-extended></abstract-extended>Java Web Start 是帮助客户机端应用程序开发的一个新技术,它的独特之处在于将您从关心客户机是如何启动的(从 Web 浏览器或是桌面)中解放出来。另外,该技术提供了一个使 Web 服务器能独立的分发和更新客户机代码的集合部署方案。软件工程师 Steve Kim 介绍了该新技术(该技术预定将集成进Java 1.4 的最终发行版),并从开发者和用户的角度进行了描述。您可以在 讨论论坛与作者和其他读者分享您对这篇文章的看法。
在现今的不断发展的软件业市场,用户强烈要求客户机应用程序不但能运行在台式机环境,还能运行在因特网。用户希望他们从基于 Web 的应用程序获得与从台式机获得的相同的功能和支持,而且最好是用瘦客户机接口打包。目前,最通用的解决方案是开发两个独立的 Java 应用程序:一个作为台式机应用程序执行,另一个模仿台式机应用程序的多数功能,但是通过 Web 访问。这对开发者是个负担,开发者要写两个独立的在不同的执行环境执行相同的功能的应用程序,然而对软件公司也是个财政负担,软件公司被迫为两个独立的应用程序提供支持。为缓解该问题,Sun Microsystems 引进了 Java Web Start,它是个使 Java 应用程序可以从台式机或 Web 页面启动的客户机端技术。这消除了为 Web 应用程序开发 Java 支持的需要,而且还提供了一个有效方式来升级、维护和管理任何通用的 Web 服务器都支持的客户端的 Java 应用程序。
什么是 Java Web Start?
Java Web Start 是一个软件技术,它包含了 applet 的可移植性、Servlet 和 JavaServer Pages (JSP)的可维护性以及象 XML 和 HTML 这样的标记语言的简易性。它是基于 Java 的应用程序,允许从标准的 Web 服务器启动、部署和更新功能完全的 Java 2 客户机应用程序。在第一次启动 Java Web Start 时,用户可以从 Web 下载新的客户机应用程序;之后这些应用程序可以通过 Web 页面的链接或(Windows 中的)桌面图标或“开始”菜单初始化。应用程序在 Java Web Start 下快速初始化,被高速缓存在客户机,并且可以远程的离线启动。另外,因为 Java Web Start 是从 Java 2 技术建立起来的,所以它继承了 Java 平台的完整的安全性体系结构。
由于 Java Web Start 自身是一个 Java 应用程序,所以该软件是平台独立的,并且支持 Java 2 平台的任何客户机系统都支持该软件。当客户机应用程序启动时,Java Web Start 自动执行更新,在从原来的高速缓存(倘若存在高速缓存)装入应用程序的同时,从 Web 下载最新的代码。Java Web Start 还提供了一个 Java 应用程序管理器(Java Application Manager)实用程序,既提供了多种选项,如清除下载的应用程序的高速缓存、指定多种 JRE 的使用、设置 HTTP 代理,还允许最终用户组织他们的 Java 应用程序。
Java Web Start 对 Java 插件
Java Web Start 和 Java 插件的一个共同作用是:允许 Java 程序从任何地方、在任何平台安全运行。两种 Java 技术都提供了可以启动和执行 Java 程序的“沙箱(sandbox)”安全环境,还具有高速缓存应用程序和指定使用的 JRE 的能力。Java Web Start 和 Java 插件的根本不同是 Java 插件限于在 Web 浏览器环境中运行的 Java applet。Java 插件严重的依赖于 Web 浏览器的 JRE,并且如果没有浏览器就不能运行。另一方面,Java Web Start 可以在 Web 页面单击链接或是单击 Java 应用程序管理器来启动 Java 应用程序。在 Windows 操作系统中,用户可以从开始菜单或是只要双击桌面图标来启动应用程序。如果浏览器窗口被关闭,从 Web 浏览器启动的客户机应用程序不会受到影响。
尽管 Java Web Start 确实支持 Java applet,而且确实包含内置的 Appletviewer,但这个技术的最初目的是启动和部署 Java 客户机应用程序。某些约束,如 applet 的策略文件不受支持。
用户观点的 Java Web Start
Java Web Start 不仅允许开发者开发可从 Web 页面启动和执行的应用程序(不只是 applet),还强调了无需任何用户交互就可以为现存的客户机代码提供透明更新的部署方案。为帮助您理解这个过程、帮助您决定是否为与 Java Web Start 的兼容性而开发自己的应用程序,我们将从用户的观点来看这个产品。我将从两个基本的用户场景(安装 Java Web Start 和从使用 Java Web Start 的 Web 下载和启动应用程序)的基本解释开始。
首次安装 Java Web Start
Java 插件无需用户在客户机安装任何的应用程序,与 Java 插件不同,Java Web Start 必须要安装在每台用于从 Web 来启动 Java 应用程序的客户机。当用户试图用 Java Web Start 启动一个基于 Web 的应用程序时,Web 浏览器将启动 Java Web Start 从而开始下载适当的文件。
如果 Java Web Start 安装在本地机的话,那么需要的应用程序将正常的启动和进行。另一方面,如果 Java Web Start 还没安装,用户将被提示要下载该程序。一旦用户同意下载 Java Web Start 并且已经下载了该文件,用户就必须运行程序来安装 Java Web Start,如图 1 所示。
在安装过程中,Java Web Start 安装程序将判断在客户机上是否安装了 Java 2 环境。如果未安装,将出现一个安装对话框,如图 2 所示。
图 2. Java Web Start 搜索 Java 2 环境
一旦装好了 Java Web Start,就必须关闭所有的打开的 Web 浏览器。新的 MIME 标记(带有 jnlp 扩展名)是为 Web 浏览器定义的,用于 Web 浏览器启动自身(Web 服务器)和 Java Web Start 之间的联系。(JNLP 是 Java Network Launching Protocol 的首字母缩略字。JNLP 文件确定哪些 JAR 文件和资源有助于客户端的 Java 应用程序。)一旦 Web 浏览器被关闭并重新启动,用户可以再次单击相同的链接来启动所要的应用程序。Web 浏览器然后将与 Java Web Start 联系,并且应用程序将开始启动过程。
“Developer's Guide for Java Web Start” (请参阅 参考资料)包含能够查出本地是否安装了 Java Web Start 的 JavaScript 和 Visual Basic 脚本。
用 Java Web Start 启动应用程序
当用户首次单击一个链接来启动一个客户端的 Java 应用程序时,发生下面的过程:
- Web 浏览器被指示运行 Java Web Start。
- Java Web Start 以启动闪屏开始
- 然后 Java Web Start 与指定的 Web 服务器联系,并且确定是否为所要的 Java 应用程序下载了所有的文件。
- 把适当的文件下载到本地机。
- Java Web Start 运行下载的应用程序。
在整个安装和启动过程中,Java Web Start 与 Java Web Start 应用程序管理器一起提供了一个外观和感觉一致的界面,同时还向用户提供了反馈。图 3 表示了当 Java Web Start 首次试图启动一个客户机 Java 应用程序时出现的窗口。
图 3. Java Web Start 下载客户机 JAR 文件
Java Web Start 把一个应用程序下载到了本地机之后,客户机程序就被执行了。将来,当程序再次从 Java Web Start 启动时,Java Web Start 将试图判定客户机是否有应用程序的最新版本。在此过程中,用户将可以看到一个与图 4 所示的相似的窗口。
图 4. Java Web Start 检查应用程序的版本
从用户的观点来看,该窗口提供了该 Java 应用程序是在启动过程还是在更新过程的可视化反馈。另外,进度条和文本反馈不仅通知用户每个过程所需的时间,还让用户可以了解更新或启动什么时候将完成。这也许是该产品的最有用的特性之一,它可以确保在应用程序的启动过程的每一步都通知了用户正在发生什么。
图形用户界面(GUI)
应用程序管理器的 GUI (图形用户界面)提供了一个简单的却合理的界面,该界面允许用户在启动应用程序时可以指定多种的选项。每次启动应用程序管理器时,出现一个闪屏,如图 5 所示。
图 5. 应用程序管理器闪屏
一旦闪屏消失,应用程序管理器的主窗口就显示出来,如图 6 所示。
图 6. 应用程序管理器的主窗口
在 Applications 框中,可以看到和启动所有的从 Java Web Start 启动的应用程序。在下面的框中,提供了关于选中的 Java 应用程序的附加信息(在图 6 中,即为 Draw 4),如供应商、可以获得关于该应用程序的更多信息的主页以及程序的描述。这条信息是直接从该应用程序的 JNLP 文件(稍后有更多关于 JNLP 的介绍)派生的。
在 File Preferences,有让用户调整和校准的多种设置。尽管大多数设置已经由 Java Web Start 自动配置了,但仍然允许用户覆盖不同的设置,如代理设置,如下面的图 7 所示。
图 7. 应用程序管理器的 Preferences 选项卡
用户还可以指定当启动应用程序时使用 JRE 的什么版本,如图 8 所示。
图 8. 指定 JRE
本质上,应用程序管理器的目的在于为管理所有的遵照 Java Web Start 指导方针和策略的应用程序提供了一个统一的实用程序。另外,应用程序管理器允许有经验的用户配置一些应用程序设置。这样免除了一些开发者将在其它方面需要做的工作,比如写脚本或批处理文件来启动或配置应用程序。要注意应用程序管理器仅对为 Java 2 平台编写的而且与 Java Web Start 兼容的应用程序有用,注意到这一点是很重要的。实用程序不能查出驻留在本地机的其它 Java 应用程序。
要考虑的问题
当选择是否为与 Java Web Start 兼容而开发应用程序时,明智的做法是对用户体验做全面考虑。
- Java Web Start 必须安装在每台从 Web 或从 Java 应用程序管理器启动客户机 Java 应用程序的机器上。所以,虽然客户机 Java 应用程序可以从 Web 页面启动,但如果最初没有 Java Web Start 安装在本地机上的话,该应用程序本身是不能启动的;这样 Web 浏览器仅提供启动程序的方便的链接 ― 不多不少。
- Java Web Start 仅对正确打包的并且依照 Java Web Start 指导方针的应用程序有用。另外,需要 Web 服务器,而且 Web 服务器必须正确的配置来解释 所有的JNLP 和 MIME 标记。所以,除非下载的或是从 Web 启动的所有的客户机 Java 应用程序满足了这些要求,每个客户机 Java 应用程序才能从 Java Web Start 被启动和被管理的。
- 在用户中也许有点关于 Java Web Start 和 Java 插件的应用程序与 applet 间的不同之处的困惑。用户可能理解或还不理解为什么 Java Web Start 能管理和启动许多的客户机 Java 应用程序,却不能与以 Java 插件运行的 Java Applets 建立任何连接,尽管事实是任一程序都可以从 Web 浏览器启动。
- 对于被要求去为仅仅一个客户机应用程序而下载 Java Web Start 的用户来说,可能又认为对一个客户机 Java 应用程序的执行来说,Java Web Start 应用程序管理器的特性很累赘,安装过程“麻烦”太多。
- Java Web Start 仅能用于为 Java 2 平台编写的客户机 Java 应用程序。
- 当前,Java Web Start 可在 Windows 95/98/NT/2000、Linux 和 Solaris 操作系统上执行。
为 Java Web Start 做开发
从开发的观点,您应该能象为常规的客户端应用程序一样能为与 Java Web Start 的兼容性编写和设计代码。您应该相对的不用担心更新现存的客户机代码所需的打包问题和变通技术。下面是您在开发和部署 Java Web Start 的客户端 Java 应用程序时需要依照的一些简单的规则:
- 应用程序可以作为针对 Java 2 平台的独立的应用程序正常的编写。
- 如果您的应用程序需要访问本地系统,那么 JAR 文件中的每个条目都必须被签名。
- 应用程序的所有的文件必须保存在一个 JAR 文件集中,该文件集包含如图像和声音文件等资源。
- 装入资源(如图像)的任何访问都必须使用有类装载器的
getResource
方法。请参阅下面的使用getResource
方法示例的清单 1。
|
更新应用程序代码
从 Web 服务器首次下载一个应用程序时,应用程序的所有的相关的 JAR 文件被下载到了本地机。Java Web Start 将自动决定该把这些文件下载到何处,这是因为缺省的安全性协议(如本地磁盘存取)在起作用。下面将进一步讨论安全性。
从应用程序开发和维护的观点来看,Java Web Start 使更新应用程序代码很容易。因为下载的应用程序的所有文件必须包含在客户机的 JAR 文件集中,您只需更新存储在 Web 服务器的 JAR 文件集。Java Web Start 将根据下面将讨论的版本编号方案来决定当应用程序最初被启动时需要下载和更新客户机的哪些文件和资源。每次用户启动一个应用程序时,Java Web Start 将与包含 JAR 文件集的 Web 服务器连接,并将下载适当的文件。注意客户机可以下载的资源仅为 JAR 文件、图像和 JNLP 文件。
Java Web Start 使用 HTTP 请求来从 Web 服务器获得资源文件,并且允许客户机端 Java 应用程序从代理服务器或防火墙后执行。最初,Java Web Start 将既使用通用的代理自动配置脚本也试着检测本地机的缺省 Web 浏览器中定义的代理设置。如果需要附加信息,可用应用程序管理器使用 Preferences 部分来指定端口和代理。
Java Web Start 的核心:JNLP
为使 Java 应用程序能用 Java Web Start 执行,您必须为应用程序创建一个 Java 网络语言协议(Java Networking Language Protocol,JNLP)文件。JNLP 是一个为应用程序提供基本的元素和描述的 XML 文件。JNLP 符合规范号为 JSR 000056(请参阅 参考资料)的 Java Community Process (JCP)。
JNLP 文件的目的如下:
- 指定从 Web 服务器下载的 JAR 文件
- 提供其它的可能的包需要
- 指定系统属性
- 考虑到任何必要的运行时参数
- 指定使用哪个版本的 Java 2 平台
JNLP 文件的一个示例
JNLP 文件以一种与 Web 浏览器相似的方式(仅用 URL 而不是特定的文件名)来获得并定位文件。清单 2 表示了 JNLP 文件的一个示例。
|
清单 2 的注释
接下来对 JNLP 文件的示例的评述也许在您创建自己的文件时对您有所帮助:
- 第一行,您可以看到文件的编码是 UTF-8 字符编码。所以,当编辑 JNLP 文件时,最终文件要用与 JDK 一起提供的 native2ascii工具转换来确保文件的编码正确。
-
jnlp codebase
属性用于在 JNLP 文件中指定所有的相关 URL。href
属性设置(要求的)是为了让应用程序并入 Java Web Start 应用程序管理器。 - information 标记(如 title、vendor 等)用于提供来自 Java Web Start 应用程序管理器的关于应用程序的附加信息。
homepage ref
属性是专门用于指向 Web URL 从而用户可以去提供了关于应用程序的更多的信息的 Web 页面。最有趣的 information 标记是offline-allowed
属性;该属性决定了客户机 Java 应用程序是否能离线启动。当离线运行客户机 Java 应用程序时,Java Web Start 将继续判定来自 Web 服务器的最新的文件;在多数情况下,这个方案将引起快速的超时(因为位置被指定要离线启动),并且应用程序从本地高速缓存启动。 - resource 标记考虑到 JNLP 文件指定应用程序使用哪些 JAR 文件和如何下载 JAR 文件;即,是急切的还是不紧不慢的。这个特性在当用户要下载大量的文件而对用户来说不是所有的文件都是客户机执行所需要的时是非常有帮助的。缺省的,多数资源是急切的下载的,在这样情况下,JAR 文件和资源在应用程序启动前被下载。不紧不慢的下载的资源只有当 Java 虚拟机(JVM)触发从应用程序载入资源或文件时才被下载。不紧不慢的下载资源的一个示例是客户机的帮助文件;考虑到了客户机的更快的启动和执行,只有在用户实际上向客户机请求帮助文件时,才会下载这些文件。然而,一旦用户请求了一个帮助文件,在请求过程中适当的 JAR 就会被下载,并伴有一个通知用户大致的下载时间的窗口。
- JNLP 文件中最后一个有趣的标记是
security
属性。缺省的,任何从 Java Web Start 客户机启动的 Java 应用程序在一个安全的、受限制的环境执行,该环境中不允许进行本地文件访问、与其它计算机的网络连接等等。然而,对于要对客户机和网络可以完全访问的特性丰富的客户机来说,all-permissions
值是用于给予客户机完全访问的权限的。为具有对本地机的完全访问,Java 应用程序所使用和装入的所有 JAR 文件和资源必须被数字签名。安全性将在下面将进一步讨论。
JNLP 和 WAR 文件
为与应用程序相关的 JNLP 文件和 JAR 文件提供更加方便有效的打包方案,Java Web Start 使 Web 压缩文件(WAR)的分发成为可能。WAR 文件是一个目录结构,它包含了一个与 JNLP 文件和 JAR 文件一起打包的 servlet,从而使整个包能够方便的在 Web 服务器上部署。该 servlet 自身被打包在 jnlp-servlet.jar 文件里,包里还有 JnlpDownloadServlet
类作为主要的执行 Java 类,这个类将负责不同的任务,如:
- 生成 JARDiff 文件
- 根据 WAR 文件中的每个文件或每个目录进行版本编号
- 支持 JNLP 文件中定义的下载协议
- 自动安装 URL 到 JNLP 文件,从而免除对开发者要进行硬编码 URL 的要求。
为了从 Java Web Start 启动应用程序,把应用程序和 WAR 文件打包在一起并非必需。然而,WAR 文件的加入可以改善存储在 Web 服务器的文件的管理和升级。WAR 文件的主题对于本文的范围来讲实在是太冗长了。请参阅 参考资料来获得与附加信息的联系。
Java Web Start 中的版本变化
到目前为止,我们已经讨论了想要实施 Java Web Start 的开发者和用户所需的整体的部署和管理技术。在我们深入前,我要概括一下到目前为止我所讲到的部署的步骤。
- 应用程序所用的文件存储在 JAR 文件。
- 必须创建一个 JNLP 来通知 Java Web Start 应用程序使用哪些 JAR 文件、如何下载必要的文件等。
- 一个标准的 Web 服务器被配置来接受被 Java Web Start 理解的 MIME 类型。
- JAR 文件放在了 Web 服务器上。
- 用户需要下载和安装 Java Web Start(仅一次)。
- 用户首次运行应用程序;JAR 文件被下载并执行。
- 用户可以再次运行应用程序,从 Java Web Start 应用程序管理器或 Web 页面启动。Java Web Start 将下载需要更新的全部文件,并且然后将启动应用程序。
从技术角度来说,这个总结可能会引发问题:Java Web Startf 是如何决定哪些文件是有必要更新的呢?答案很简单:JNLP 文件。一个有版本标识的唯一的 URL与每个 JNLP 文件中定义的资源相关联。如清单 3 所示。
清单 3.JNLP文件中的一个基于版本的 JAR 文件的示例
|
当启动了一个应用程序时,Java Web Start 检查 JNLP 文件并创建一个有 URL 和版本标识的 HTTP GET
请求。如果没有 version 属性,那么 Java Web Start 就只是创建一个 JAR 文件的 HTTP GET
请求。Java Web Start 检查 Web 服务器的响应状态代码和 MIME 类型来决定此 JAR 文件是否有更新的版本。
JNLP 文件还允许使用 JARDiff
实用程序来递增的更新 JAR 文件。 JARDiff
实用程序能只下载 JAR 文件中的特定文件(不是整个 JAR 文件本身),这样使下载更快。请参阅 参考资料来获得关于决定 JNLP 文件配置的更多信息。
安全性
也许在决定是否为了与 Java Web Start 兼容而开发应用程序时,需要考虑的最重要的问题就是安全性。Java Web Start 允许客户端 Java 应用程序访问各种本地机资源,如文件访问、剪贴板访问等。源自 Java 2 平台,该产品继承了该平台的安全性体系结构。如前面提到的,在 JNLP 文件中定义的 security 属性决定了当应用程序通过 Java Web Start 启动时所能有的安全性级别。缺省的,使用受限环境,为应用程序授权对网络和本地机的有限的访问。如同使用 applet 沙箱(sandbox),这样可以保证恶意的应用程序不能造成任何破坏。
Java Web Start 的安全性的另一重要元素是数字签名的使用。当启动或更新一个应用程序时,它的 JAR 文件被下载到客户机。Java Web Start 用那些文件中的数字编码来判定在对文件初始签名之后,是否有 JAR 文件已经被修改或改变。如果有不一致的或是文件尚未被签名,应用程序就不能从 Java Web Start 启动。正确签名的应用程序可以访问本地机。
用户授权安全性
当运行要对本地机无限制访问的应用程序时,用户最初将看到一个对话框,该对话框说明了应用程序的出处或供应商,并且允许用户给应用程序授予额外的权限。此外,当应用程序要求使用本地机的资源并且还没有被签名的 JAR 文件时,Java Web Start 将允许用户通过一个 Security Advisory 对话框显式的授予应用程序访问权限。例如,如果客户机 Java 应用程序需要能把信息粘贴到 Windows 操作系统剪贴板工具,将出现一个与图 9 相似的对话框。
图 9. 应用程序试图访问剪贴板的 Security Advisory 对话框
当应用程序试图访问客户机的本地资源(如文件系统)时,将出现另外的对话框窗口,如图 10 所示。
图 10. 应用程序试图访问文件系统时的 Security Advisory 对话框
用户可以在以下方面授予应用程序对本地机的访问权限:
- 在本地机存储应用程序的当前状态
- 查看本地文件的内容
- 保存文件到本地机
- 本地机打开文件
- 在本地机对随机存取文件读/写
- 从本地机打印
JNLP API 库中的很多的类允许开发者在不可靠的环境使用系统的资源,由用户来负责决定操作是否是允许的。
结论
Java Web Start 提供一个创造性的解决方案来开发和部署客户机端的 Java 应用程序。呈现给用户启动、更新和管理 Java 应用程序的很多种的选项。Java 开发者获得了设计软件的自由,无须过多的关注代码的修订、更新和分布。尽管这是个新技术,但 Java Web Start 是定义工业标准的一个尝试。偕同已被证明的 Java 2 安全性体系结构中的基础,Java Web Start 有潜力为从 Web 或桌面启动和部署的 Java 应用程序建立一个通用的、一致的协议。
- 您可以参阅本文在 developerWorks 全球站点上的 英文原文.
- 请参加关于本文的 讨论论坛。
- 下载 Java Web Start并查看关于它的用法的 演示。
- Sun 的“ Developer's Guide for Java Web Start” 提供了关于 Java Web Start 的技术细节,并且 FAQ提供了许多常见问题的解答。
- 这些 Sun 的出版物提供了关于 Java Web Start 的当前的和预期的影响的详述。
- 下载 clientApp.jnlp 源代码。
- 参阅 Rene Schmidt 的 JNLP Specification 指南来更多的了解关于这门语言的技术方面,包括安全性协议和 API。
- JNLP 在 Java Community Process被开发。
- 参阅 Joseph Sinclair 的“ Revisiting Java technology on the client” 文章来获得使用客户机端 Java 语言的另一个观点(developerWorks,2001 年 3 月)。
- 为更好的理解 Java 和 Web 应用程序,参阅 Grady Booch 的“ Thearchitecture of Web applications” 文章(IBM PartnerWorld for Developers )。
- 来自 JavaOne 2001 的 John Zukowski 的报告,“ Java 1.4, the next wave”,讨论了 Java 1.4 的未来,Java 1.4 在下一个 JDK 的发行版将包含 Java Web Start (developerWorks,2001 年 6 月)。
- Bryan Blackwell 的文章,“ Performanceconcerns for an ASP-enabled application” 可能有助于您判定 Web 工作性能对于您的瘦客户机应用程序来说是否是个问题( IBM PartnerWorld for Developers )。
关于作者 Steve Kim 拥有北卡罗来纳州立大学的“计算机科学”的学士学位,他还把科学与技术作为第二专业。他是 Tivoli-IBM 的 Sun Java 认证程序员,在北卡罗来纳的 Research Triangle Park 从事关于客户机端应用程序的开发。您可以用 kimst@us.ibm.com与 Steve 联系。 |