SWT 概述
现在把标准窗口小部件工具箱(SWT)引入开发社区是最恰当不过了。虽然到目前为止,Sun 的 Java 基础类(Java Foundation Classes,JFC)一直能让客户机端应用程序的开发人员感到满意,但仍然有许多开发人员出于各种原因不愿使用 SWT。对于许多开发人员和架构设计师来说,能够开发象传统本机桌面应用程序那样以可视化方式显示、操作和执行的客户机端 Java 应用程序的梦想似乎还很遥远。
然而到了 2001 年年中,Eclipse 项目突然出现在这幅开发“视野”之中。最初,人们认为 Eclipse 项目只是 Java 的开放源码集成开发环境(IDE);但是该项目涉及的范围更广。在开发 Eclipse 期间,SWT 工具箱诞生了。SWT 工具箱类似于 JFC 和其“堂兄弟”抽象窗口工具箱(Abstract Window Toolkit,AWT),它向开发人员提供了一组窗口小部件。然而,SWT 与其它工具箱之间的主要区别在于 SWT 使用操作系统的底层 GUI 窗口小部件。这种方法向 Java 开发人员提供了跨平台的 API 来实现“外观”象本机桌面应用程序的解决方案。
Java Web Start 概述
如果没有这些合适的工具,不论用什么语言,传统桌面应用程序的部署和维护对于开发人员都可能是主要的头疼问题。即使是最有效的支持部门,一想到发布新版本的软件时必须检查更新每台工作站,也不能不让他们感到头痛。为了方便 Java 开发人员的分发和维护需求,Sun Microsystems 几年前引入了 Java Web Start。这一技术很大程度上简化了最终用户工作站上 Java 应用程序的部署、维护和更新。
将 Web 浏览器用作启动应用程序的最初工具,Java Web Start 是一个在本地安装的帮助应用程序,它包含在 Sun 的 Java 运行时环境中。每当用户访问 Java 网络启动协议(Java Network Launching Protocol,JNLP)文件时,都自动将该应用程序下载到用户的工作站,然后该应用程序开始运行。整个过程几乎不需要与最终用户进行交互,这大大简化了分发应用程序的工作。请参考位于本文末尾的参考资料以获取更多关于 Java Web Start 的信息。
文件查看器应用程序
在我们了解如何用 Java Web Start 部署 SWT 应用程序的实现细节之前,让我们先看一下将要部署的应用程序。本文所包含的这个应用程序是由 Eclipse 项目提供的一个示例应用程序。正如图 1 所示,该应用程序是一个简单的跨平台的文件查看器,它使用户能够浏览自己硬盘上的文件和文件夹。
图 1. 运行在 Windows XP 上的文件查看器
为演示 SWT 和 Java Web Start 的跨平台能力,已经将所包含的这个独立的示例应用程序打包,以便在 Microsoft Windows 和 Red Hat Linux 上运行。
环境需求
在本文末尾可以下载这篇文档中所使用的代码。为了用 Java Web Start 完整地测试这个文件查看器应用程序,您的环境必须符合以下最低要求(请参阅参考资料中的下载链接):
Microsoft Windows XP 或 Red Hat Linux 8 操作系统
安装了 Java 2 SDK 标准版 1.4 或更高版本
安装了 Apache Ant 1.5.3 或更高版本
安装了 Jakarta Tomcat 4.1.24 或更高版本
虽然一直留心使 Ant 构建脚本可以跨平台使用,但是我们只在 Microsoft Windows XP 和 Red Hat Linux 8 操作系统上测试和验证了文件查看器应用程序。此外,这里假定 Tomcat 运行在您本地工作站上,并且运行在端口 8080 上。让我们从安装、构建和运行该示例应用程序开始。
安装该文件查看器应用程序
要安装文件查看器应用程序,请完成以下步骤:
通过参考资料中的链接,下载源代码软件包。
将 fileviewer.zip 文件解压缩至临时目录。
安全性和代码签名
与 AWT 和 JFC 不同,SWT 与操作系统的本机窗口环境紧密集成在一起。SWT 使用系统库来管理自己的与平台无关的 API 和底层操作系统之间的集成。缺省情况下,运行在 Java Web Start 下的应用程序运行在受限的沙箱内。这个环境控制着对资源(譬如工作站的文件系统、系统库和其它资源)的访问。由于 SWT 需要在缺省的沙箱之外运行来装入系统库,因此用 Java Web Start 部署的所有 JAR 文件必须经过数字签名。因为我们不准备将该应用程序部署给广大的用户,所以创建了一个自签名的测试证书。
如果您准备将 SWT 应用程序放入生产环境,那么我们强烈建议您从认证中心(如 Thawte 或 VeriSign)获取一个证书。
创建自签名的证书
要创建自签名的测试证书,请完成以下步骤:
在将源代码解压缩的目录中执行以下命令:keytool -genkey -keystore keystore -alias myself。
系统会提示您提供关于新密钥的细节,包括密码、姓名以及位置等。为了使用已提供的 Ant 构建过程,请确保将密码设置为“password”。如果不想使用硬编码密码“password”,那么请编辑 build.xml 文件中的“sign-jars”目标文件。签名每个 JAR 文件的实际过程在 Ant 构建期间完成。
为验证是否正确创建了 keystore,在将源代码解压缩的目录中执行以下命令:keytool -list-keystore keystore
输出结果将显示类似于下面的内容:
Keystore type: jks
Keystore provider: SUN
Your keystore contains 1 entry
myself, Jun 3, 2003, keyEntry,
Certificate fingerprint (MD5):B8:C4:48:ED:68:E8:FE:47:83:78:F5:14:4E:28:5C:80
构建文件查看器应用程序
要构建文件查看器应用程序,请完成以下步骤:
为了清理环境,在将源代码解压缩的目录中执行下面这个命令:ant clean
执行下面这条命令来启动构建过程:ant
如果您的环境满足需求并且配置正确,那么您应当会看到类似于下面这样的内容:
Buildfile: build.xml
init:
compile-common:
compile-module:
[echo] Compiling ...
package-common:
package-swtlib:
sign-jars:
[echo] Signing JARS...
[signjar] Signing Jar : D:\FileViewer\dist\swt-lib.jar
[signjar] Signing Jar : D:\FileViewer\dist\fileviewer.jar
[copy] Copying 1 file to D:\FileViewer\dist
[signjar] Signing Jar : D:\FileViewer\dist\swt-win32.jar
package-web:
[war] Building war: D:\FileViewer\dist\fileviewer.war
default:
BUILD SUCCESSFUL
Total time: 6 seconds
运行文件查看器应用程序
在用 Java Web Start 部署文件查看器应用程序之前,让我们尝试在本地执行该应用程序。为了启动该应用程序,在将源代码解压缩的目录中执行下面这条命令:ant run
执行这个 Ant 脚本之后,应该会出现文件查看器应用程序。图 2 显示了在 Red Hat Linux 8 下运行的该应用程序。
图 2. 在 Red Hat Linux 8 上运行的文件查看器
部署和测试文件查看器应用程序
要将该应用程序部署到 Tomcat 4,请完成以下步骤:
将 dist 目录中的 fileviewer.war 文件复制到 Tomcat 4 下的 webapps 目录中。
执行该脚本以启动 Tomcat 4。
打开 Web 浏览器,并输入下面这个 URL,然后单击“Launch Application”链接:http://localhost:8080/fileviewer/index.html
单击该链接之后,应该会看到下面这幅图像(图 3),此时应用程序的 JAR 文件将会下载至工作站:
图 3. 文件查看器
在第一次下载该应用程序时,会看到下面这个对话框,如图 4 所示:
图 4. 安全性警告
单击“Start”以启动文件查看器应用程序。
实现 JNLP 文件
既然我们已经了解了如何用 Sun 的 Java Web Start 构建、分发和部署 SWT 应用程序,那么就让我们重新研究一下如何实现 JNLP 文件。通过 Java Community Process(JCP)管理 Java 网络启动协议规范。由于本文的目的在于介绍用 Java Web Start 来部署 SWT 应用程序的一些具体细节,因此并没有提供太多这方面的背景信息。关于更多有关 Java Web Start 方面的信息和背景知识,请参考参考资料中列出的 Steve Kim 的文章“Java Web Start”。
清单 1 说明了在 SWT 应用程序的 JNLP 文件中所使用的各种标记。
清单 1. index.jnlp 文件
1 <?xmlversion="1.0" encoding="utf-8"?>
2 <jnlp spec="1.0+"codebase="http://localhost:8080/fileviewer"href="index.jnlp">
3 <information>
4 <title>File Viewer</title>
5 <vendor>IBM developerWorks</vendor>
6 <homepage href="index.html"/>
7 <description>File Viewer</description>
8 <description kind="short">FileViewer</description>
9 </information>
10 <security>
11 <all-permissions/>
12 </security>
13 <resources>
14 <j2se version="1.4"/>
15 <jar href="fileviewer.jar"/>
16 <nativelib href="swt-lib.jar"/>
17 </resources>
18 <resources os="Windows">
19 <jar href="swt-win32.jar"/>
20 </resources>
21 <resources os="Linux">
22 <jar href="swt-linux.jar"/>
23 </resources>
24 <application-descmain-class="org.eclipse.swt.examples.fileviewer.FileViewer"/>
25 </jnlp>
让我们仔细检查一下这个 XML 文件中的一些重要部分:
因为 SWT 应用程序在执行时需要装入系统库,所以它需要能够完全访问用户的工作站。第 10 行到第 12 行显示了应用程序如何请求对客户机环境的完全访问权。为了授予 Java Web Start 这个级别的访问权限,应用程序的所有 JAR 文件都必须经过数字签名。
正如第 16 行所示,我们需要声明一个 nativelib 标记来告诉 Java Web Start 这个 JAR 文件包含本机库。在我们的示例文件查看器应用程序中,这个 JAR 文件包含一个 Windows DLL 和一系列用于 Linux 的 SO 文件。
第 18 行到第 23 行为每个操作系统装入相应的 SWT JAR 文件。“resources”标记使您能够保护资源,从而只有特定的操作系统和体系结构能够使用该资源。os 属性指定了应当考虑使用资源元素的操作系统。这个值基于最终用户的 os.name Java 系统特性。虽然在这个示例中没有用到这个值,但也可以使用 arch 属性进一步限制对 Java 库的访问。arch 属性基于最终用户的 os.arch Java 系统特性。
更多有关 JNLP 文件的各种元素和格式的信息,请参考下面的参考资料。
结束语
SWT 用户界面工具箱和 Java Web Start 的结合向开发人员提供了一套很棒的工具,可以用这套工具来创建和部署高度交互的客户机端 Java 应用程序。这个示例文件查看器应用程序提供了一个构建和打包框架,您可以用它来创建自己的独立 SWT 应用程序,这些应用程序是通过 Java Web Start 分发的。