1. 程式人生 > >[轉載] 使用 Java Web Start 部署 SWT 應用程式

[轉載] 使用 Java Web Start 部署 SWT 應用程式

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 所示,該應用程式是一個簡單的跨平臺的檔案檢視器,它使使用者能夠瀏覽自己硬碟上的檔案和資料夾。

為演示 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 上。讓我們從安裝、構建和執行該示例應用程式開始。

安裝該檔案檢視器應用程式
要安裝檔案檢視器應用程式,請完成以下步驟:

  1. 通過參考資料中的連結,下載原始碼軟體包。
  2. fileviewer.zip 檔案解壓縮至臨時目錄。

安全性和程式碼簽名
與 AWT 和 JFC 不同,SWT 與作業系統的本機視窗環境緊密整合在一起。SWT 使用系統庫來管理自己的與平臺無關的 API 和底層作業系統之間的整合。預設情況下,執行在 Java Web Start 下的應用程式執行在受限的沙箱內。這個環境控制著對資源(譬如工作站的檔案系統、系統庫和其它資源)的訪問。由於 SWT 需要在預設的沙箱之外執行來裝入系統庫,因此用 Java Web Start 部署的所有 JAR 檔案必須經過數字簽名。因為我們不準備將該應用程式部署給廣大的使用者,所以建立了一個自簽名的測試證書。

如果您準備將 SWT 應用程式放入生產環境,那麼我們強烈建議您從認證中心(如 Thawte 或 VeriSign)獲取一個證書。

建立自簽名的證書
要建立自簽名的測試證書,請完成以下步驟:

  1. 在將原始碼解壓縮的目錄中執行以下命令:keytool -genkey -keystore keystore -alias myself

    系統會提示您提供關於新金鑰的細節,包括密碼、姓名以及位置等。為了使用已提供的 Ant 構建過程,請確保將密碼設定為“password”。如果不想使用硬編碼密碼“password”,那麼請編輯 build.xml 檔案中的“sign-jars”目標檔案。簽名每個 JAR 檔案的實際過程在 Ant 構建期間完成。

  2. 為驗證是否正確建立了 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

構建檔案檢視器應用程式
要構建檔案檢視器應用程式,請完成以下步驟:

  1. 為了清理環境,在將原始碼解壓縮的目錄中執行下面這個命令:ant clean
  2. 執行下面這條命令來啟動構建過程: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 下執行的該應用程式。

部署和測試檔案檢視器應用程式
要將該應用程式部署到 Tomcat 4,請完成以下步驟:

  1. dist 目錄中的 fileviewer.war 檔案複製到 Tomcat 4 下的 webapps 目錄中。
  2. 執行該指令碼以啟動 Tomcat 4。
  3. 開啟 Web 瀏覽器,並輸入下面這個 URL,然後單擊“Launch Application”連結:http://localhost:8080/fileviewer/index.html

    單擊該連結之後,應該會看到下面這幅影象(圖 3),此時應用程式的 JAR 檔案將會下載至工作站:

  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 檔案中的一些重要部分:

  1. 因為 SWT 應用程式在執行時需要裝入系統庫,所以它需要能夠完全訪問使用者的工作站。第 10 行到第 12 行顯示了應用程式如何請求對客戶機環境的完全訪問權。為了授予 Java Web Start 這個級別的訪問許可權,應用程式的所有 JAR 檔案都必須經過數字簽名。
  2. 正如第 16 行所示,我們需要宣告一個 nativelib 標記來告訴 Java Web Start 這個 JAR 檔案包含本機庫。在我們的示例檔案檢視器應用程式中,這個 JAR 檔案包含一個 Windows DLL 和一系列用於 Linux 的 SO 檔案。
  3. 第 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 分發的。