一、什麼是 Java Web Start?
Java Web Start(以下簡稱JWS)是一個軟件技術,它的獨特之處在於將您從關心客戶機是如何啓動的(從 Web 瀏覽器或是桌面)中解放出來。它包含了 applet 的可移植性、Servlet 和 JavaServer Pages (JSP)的可維護性以及象 XML 和 HTML 這樣的標記語言的簡易性。它是基於Java 的應用程序,允許從標準的 Web 服務器啓動、部署和更新功能完全的 Java 2 客戶機應用程序。在第一次啓動 JWS 時,用戶可以從 Web 下載新的客戶機應用程序;之後這些應用程序可以通過
Web 頁面的鏈接或(Windows 中的)桌面圖標或“開始”菜單初始化。應用程序在 JWS 下快速初始化,被高速緩存在客戶機,並且可以遠程的離線啓動。
二、用戶觀點的 JWS
JWS 不僅允許開發者開發可從 Web 頁面啓動和執行的應用程序(不只是 applet),還強調了無需任何用戶交互就可以爲現存的客戶機代碼提供透明更新的部署方案。
三、部署應用程序
第一步:開發你希望發佈的應用程序
第二步:把應用程序及所用到的所有資源打成一個或多個jar包
第三步:如果你的應用程序不會用到任何運行這個應用程序的機器的本地資源,那麼,你的應 用程序就可以部署了。
第四步:如果你的應用程序用到了運行這個應用程序的機器的本地資源,那麼,你的應用程序就必須先簽名然後纔可以發佈。
第五步:如何給應用程序簽名:
1:首先確保你已經完全安裝了Java2的環境,有keytool工具,它位於J2SE SDk的bin目錄下。這一般不會有問題。
2:到Dos狀態下,進入你需發佈應用程序的jar包所在的目錄,運行下面這句話
keytool -genkey -keystore myKeystore -alias jwstest
它將會提示你輸入用戶名、密碼等,不用理它,按照提示隨便輸入即可,但一定要記住密碼。運行結束它將會在當前路徑下創建名爲myKeystore的文件。
3:如果你想察看一下剛纔生成的myKeystore文件的內容,可以使用下面這句話:
keytool -list -keystore myKeystore
顯示出來應該類似如下:
Keystore type: jks
Keystore provider: SUN
Your keystore contains 1 entry:
jwstest, Tue Nov 23 19:29:32 PST 2001, keyEntry,
Certificate fingerprint (Test):
C3:A9:CD:F3:D3:AC:4D:3F:3C:5B:AF:9E:CF:0D:46:5C
4:對你需發佈應用程序的jar包進行簽名,運行下面這句話:
jarsigner -keystore myKeystore yourtest.jar jwstest
其中yourtest.jar是你的jar包名,你需要修改它,別的就不必修改了。運行時會提示你輸入密碼,就是你剛纔在生成myKeystore文件時設定的密碼。
第六步:部署應用程序的jar包:
1:在Tomcat的webapps中新建目錄JWSTest
2:在JWSTest下新建目錄apps,META-INF,WEB-INF
3:在apps下新建目錄images和lib
4:在META-INF中拷入MANIFEST.MF
5:在WEB-INF中拷入web.xml
6:把已經準備好的jar包拷入lib目錄下
四.Jsp頁面
用於Web訪問的頁面index.jsp如下:
- <%@page contentType="text/html;charset=gb2312"%>
- <html>
- <title>JWS Test</title>
- <head>
- <SCRIPT LANGUAGE="Javascript">
- function insertLink(url, name) {
- document.write("<a href=" + url + ">" + name + "</a><br><br>");
- }
- insertLink("http://你的IP:8080/ JWSTest /apps/JWSTest.jnlp"," JWSTest ");
- </SCRIPT>
- </head>
- <body>
- </body>
- </html>
在jsp中添加檢測訪問的客戶端是否已經安裝了JWS的客戶端的代碼,示例如下:
- <%@page contentType="text/html;charset=gb2312"%>
- <html>
- <title> JWS Test </title>
- <head>
- <SCRIPT LANGUAGE="Javascript">
- var javawsInstalled = 0;
- isIE = "false";
- if (navigator.mimeTypes && navigator.mimeTypes.length) {
- x = navigator.mimeTypes['application/x-java-jnlp-file'];
- if (x) javawsInstalled = 1;
- } else {
- isIE = "true";
- }
- function insertLink(url, name) {
- if (javawsInstalled) {
- document.write("<a href=" + url + ">" + name + "</a><br><br>");
- } else {
- document.write("<a href=" + url + ">"+ name +"</a><br><br>");
- }
- }
- </SCRIPT>
- <SCRIPT LANGUAGE="VBScript">
- on error resume next
- If isIE = "true" Then
- If Not(IsObject(CreateObject("JavaWebStart.IsInstalled"))) Then
- javawsInstalled = 0
- Else
- javawsInstalled = 1
- End If
- End If
- </SCRIPT>
- <SCRIPT LANGUAGE="Javascript">
- if(javawsInstalled){
- insertLink("http://你的IP:8080/ JWSTest /apps/JWSTest.jnlp"," JWSTest ");
- }else{
- //通知用戶要先安裝JWS的客戶端,你可以自己提供下載或是直接鏈接到Sun的JWS下載。
- //分爲兩種,如果客戶端已經安裝了Java運行環境,則只要下載javaws-1_0_1_01-win-int.exe即可。
- //如果客戶端沒有安裝Java運行環境,則要下載完整的javaws-1_0_1_01-win-int-rt.exe。
- }
- </SCRIPT>
- </head>
- <body>
- </body>
- </html>
五.JNLP文件
Java Network Launching Protocol (JNLP,java網絡加載協議)
JNLP是JWS的核心配置文件,有了它,才能將以上各部分聯繫起來,真正讓JWS運轉起來。JNLP文件符合標準的XML語法,實質就是一個XML文件。當然,編寫它的最好方式是對已寫好的JNLP進行改寫。JWSTest.jnlp示例如下:
- <?xml version="1.0" encoding="utf-8"?>
- <!-- JNLP File for SwingSet2 Demo Application -->
- <jnlp
- spec="1.0+"
- codebase="http://你的IP:8080/JWSTest/apps"
- href=" JWSTest.jnlp">
- <information>
- <title> JWS Test </title>
- <vendor>YOUR Name</vendor>
- <homepage href=" JWSTest.html"/>
- <description> JWS Test </description>
- <icon href="images/ JWSTest.jpg"/>
- <offline-allowed/>
- </information>
- <security>
- <all-permissions/>
- </security>
- <resources>
- <j2se version="1.3"/>
- <jar href="lib/ JWSTest.jar"/>
- </resources>
- <application-desc main-class="運行啓動的主類"/>
- </jnlp>
部分JNLP的關鍵語法
<jnlp>元素
spec:必須是1.0及以上版本,這裏用1.0+,不需修改。
codebase:資源的URL,是JNLP指向各連接的起始處,需自行修改。
Href:JNLP文件相對codebase的存放位置,和JNLP文件的全名,需自行修改。
<infomation>元素
Title:發佈的應用程序簡單標題,需自行修改。
Vendor:發行商信息,可以寫上你的大名,需自行修改。
Homepage:存放有關應用程序的相關文檔的URL,如help文件等,可有可無。
Description:對應用程序的描述,可以有多對<description></description>,可有可無。
Icon:用戶下載你的應用程序後,在JWS裏顯示的圖標的URL,應是gif或jpeg格式。需自行修改。
Offline-allowed:選擇項,允許用戶離線運行應用程序,一般都會有,不用修改。
<security>元素
選擇項,如果沒有指明<security>,默認是不允許應用程序訪問用戶的本地資源,即應用程序是沙箱運行。
如果設定爲<all-permissions/>,則表示允許應用程序訪問用戶的本地資源。一般都會設定此值。
<resource>元素
<j2se version = 指定jdk版本>
<jar href = 指定需發佈的應用程序的jar包存放的位置>
<application-desc>元素
main-class:應用程序運行啓動的主類
<argument>:應用程序運行時的參數,可以有多個,每一個參數用一對<argument>參數</argument>。
至此,你已經完全構建了運轉JWS的各部件。
六.完整發布和測試
前面已經準備好了需發佈的應用程序的jar包,也寫好了用來訪問的jsp文件和服務器端的核心jnlp文件。
第一步:在JWSTest下新建目錄jsp。把index.jsp拷入jsp目錄。
第二步:把jnlp文件直接拷入apps目錄下。
第三步:在瀏覽器裏輸入:http://localhost:8080/JWSTest/jsp/index.jsp 即可訪問到jsp頁面。頁面應出現JWSTest字樣。
第四步:點擊JWSTest,連接到apps下的JWSTest.jnlp文件,JWS啓動,開始下載你發佈的應用程序。
第五步:下載完畢,直接運行即可。以後,你也可以直接運行JWS客戶端裏已下載的應用程序。
七. 常見問題
長期使用JWS還可能遇到一些問題,在這裏列出幾個經常出現的問題,並給出相應解決方法:
問題一:JWS不能運行,JNLP文件像普通XML文件一樣顯示在Browser裏
解決辦法:請修改tomcat裏,發佈程序的路徑中的web.xml。
在其中添加<mime-type>
application/x-java-jnlp-file
</mime-type>
以支持JNLP文件。
問題二:不能下載資源或下載資源失敗
解決辦法:請卸載JWS的客戶端,並將註冊表裏有關JWS的項目都刪除,並確保program Files下的JWS目錄已被刪除,然後,重裝JWS。
問題三:下載資源中有未簽名文件
解決辦法:
1:確保所有的jar包及其他資源都進行過簽名。
2:確保整個資源中,沒有中文的命名。好像簽名工具不支持中文命名的文件名,所以未簽到名。
3:察看已經簽名的jar包中,meta-inf路徑下的jwstest.sf(jwstest是你在進行簽名時-alias後的命名)文件,他詳細的列出了所有已簽名的文件,以分析簽名失敗的原因。
輸入keystore密碼:
再次輸入新密碼:
您的名字與姓氏是什麼?
[Unknown]: Chen
您的組織單位名稱是什麼?
[Unknown]: RongWare
您的組織名稱是什麼?
[Unknown]: RW
您所在的城市或區域名稱是什麼?
[Unknown]: HangZhou
您所在的州或省份名稱是什麼?
[Unknown]: ZheJian
該單位的兩字母國家代碼是什麼
[Unknown]: CN
CN=Chen, OU=RongWare, O=RW, L=HangZhou, ST=ZheJian, C=CN 正確嗎?
[否]: Y
輸入<jwsmytest>的主密碼
(如果和 keystore 密碼相同,按回車):
再次輸入新密碼:
C:\a>keytool -list -keystore mykey
輸入keystore密碼:
Keystore 類型: JKS
Keystore 提供者: SUN
您的 keystore 包含 1 輸入
jwsmytest, 2009-11-27, PrivateKeyEnt
認證指紋 (MD5): A8:58:00:19:A8:D6:D7:93:1B:8A:CA:32:C4:F4:18:76
C:\a>jarsigner -keystore mykey s.jar jwsmytest
輸入密鑰庫的口令短語:
輸入 jwsmytest 的密鑰口令:
警告:
簽名者證書將在六個月內過期。
(1)keytool -genkey -keystore Mykey.store -alias Mykey
該命令用於產生一個密鑰庫,執行完畢後應該在當前目錄中生成一個密鑰庫文件(Mykey.store)
(2)keytool -export -keystore Mykey.store -alias Mykey -file Mykey.cert
此命令運過來產生簽名時所需要的用到的證書。
(3)jarsigner -keystore MyKey.store App.jar Mykey
此命令用於對jar文件進行簽名。