使用腳本文件(jnlp)來發(fā)布Java程序
本文為原創(chuàng),如需轉(zhuǎn)載,請(qǐng)注明作者和出處,謝謝!
發(fā)布Java程序(桌面程序)最直接的方法就是將jar文件打包交給用戶。不過有時(shí)jar文件很多,也很大。為了方便,sun提供了另外一種方式來通過網(wǎng)絡(luò)發(fā)布Java程序。這就是jnlp文件。可能很多讀者曾經(jīng)下載過很多jnlp文件,運(yùn)行后會(huì)自動(dòng)從指定的網(wǎng)站下載相應(yīng)的文件。
實(shí)際上,jnlp文件就是一個(gè)xml格式的腳本文件。假設(shè)我們有一個(gè)test.jar文件需要安裝(該文件是一個(gè)基于SWT的桌面程序),那么要使用jnlp文件發(fā)布test.jar需要如下幾步:
一、為test.jar文件簽名
從網(wǎng)絡(luò)上下載就意味著風(fēng)險(xiǎn)大大增加,因此,要想通過jnlp從網(wǎng)絡(luò)上下載jar文件,并運(yùn)行,就需要對(duì)該文件進(jìn)行簽名。如果不簽名,java程序?qū)⑦\(yùn)行在sandbox中,也就是說無法訪問本地資源,由于test.jar是swt程序,需要訪問本地的dll(windows)或.so(linux)庫,所以必須要對(duì)test.jar進(jìn)行文件簽名。
簽名需要一個(gè)證書,如果沒有證書,可以使用如下的命令生成一個(gè)證書
在執(zhí)行上面的命令后,會(huì)在當(dāng)前目錄下生成一個(gè)nokiaguy.keystore文件。然后將test.jar復(fù)制到當(dāng)前目錄下。現(xiàn)在當(dāng)前目錄有兩個(gè)文件:nokiaguy.keystore和test.jar。最后使用如下的命令對(duì)test.jar簽名:
在執(zhí)行完上面的命令后,我們會(huì)發(fā)現(xiàn)test.jar文件的尺寸變大了。
二、建立虛擬目錄
下面就是在自己的機(jī)器上或服務(wù)器建立一個(gè)可訪問的虛擬目錄。本文使用了IIS建立一個(gè)虛擬目錄,可通過http://200.200.200.200/key訪問該目錄,在該目錄下只有一個(gè)test.jar文件(經(jīng)過簽名后的jar文件)。
三、編寫jnlp文件
在任意目錄下建立一個(gè)test.jnlp文件,并輸入如下內(nèi)容:
其中<jnlp>根元素通過codebase指定了虛擬目錄的url。通過<jar>元素指定了要下載的test.jar文件。如果存在多個(gè)jar文件,可以有多個(gè)<jar>元素。<jar>元素的href屬性指定要下載的jar文件,該文件路徑是相對(duì)于codebase屬性值的。如果要考慮不同的操作系統(tǒng),可以將多個(gè)<resources>元素,如下面的代碼所示:
要注意,必須使課堂<application-desc>元素指定要運(yùn)行的主窗口的類名(帶包名),由于本文使用的test.jar文件中主窗口類沒有名,類名為CustomMain,因此,只main-class屬性值為CustomMain。
運(yùn)行test.jnlp,一開始會(huì)顯示如圖1所示的歡迎界面。
如果這時(shí)服務(wù)端更新的test.jar,test.jnlp會(huì)自動(dòng)檢測程序文件的更新時(shí)間,如果服務(wù)端程序更新,則會(huì)重新下載該程序,并運(yùn)行。因此,使用jnlp文件也可以實(shí)現(xiàn)實(shí)時(shí)更新程序的功能。有些象微軟的smartclient。在更新服務(wù)端程序時(shí),千萬別忘了對(duì)程序進(jìn)行簽名啊,如果不簽名,在運(yùn)行jnlp文件時(shí)就會(huì)出現(xiàn)如圖3所示的異常信息。
最后提一下,jnlp也是需要使用jre的哦,在使用jnlp之前,別忘了安裝jre啊!
新浪微博:http://t.sina.com.cn/androidguy 昵稱:李寧_Lining
發(fā)布Java程序(桌面程序)最直接的方法就是將jar文件打包交給用戶。不過有時(shí)jar文件很多,也很大。為了方便,sun提供了另外一種方式來通過網(wǎng)絡(luò)發(fā)布Java程序。這就是jnlp文件。可能很多讀者曾經(jīng)下載過很多jnlp文件,運(yùn)行后會(huì)自動(dòng)從指定的網(wǎng)站下載相應(yīng)的文件。
實(shí)際上,jnlp文件就是一個(gè)xml格式的腳本文件。假設(shè)我們有一個(gè)test.jar文件需要安裝(該文件是一個(gè)基于SWT的桌面程序),那么要使用jnlp文件發(fā)布test.jar需要如下幾步:
一、為test.jar文件簽名
從網(wǎng)絡(luò)上下載就意味著風(fēng)險(xiǎn)大大增加,因此,要想通過jnlp從網(wǎng)絡(luò)上下載jar文件,并運(yùn)行,就需要對(duì)該文件進(jìn)行簽名。如果不簽名,java程序?qū)⑦\(yùn)行在sandbox中,也就是說無法訪問本地資源,由于test.jar是swt程序,需要訪問本地的dll(windows)或.so(linux)庫,所以必須要對(duì)test.jar進(jìn)行文件簽名。
簽名需要一個(gè)證書,如果沒有證書,可以使用如下的命令生成一個(gè)證書
keytool -genkey -alias nokiaguy -validity 12345 -keypass nokiaguypass -storepass nokiaguypass
-keystore nokiaguy.keystore -dname "CN=nokiaguy, OU=nokiaguy, O=D, L=CA, S=CA, C=CN"
-keystore nokiaguy.keystore -dname "CN=nokiaguy, OU=nokiaguy, O=D, L=CA, S=CA, C=CN"
在執(zhí)行上面的命令后,會(huì)在當(dāng)前目錄下生成一個(gè)nokiaguy.keystore文件。然后將test.jar復(fù)制到當(dāng)前目錄下。現(xiàn)在當(dāng)前目錄有兩個(gè)文件:nokiaguy.keystore和test.jar。最后使用如下的命令對(duì)test.jar簽名:
jarsigner -keystore nokiaguy.keystore -storepass nokiaguypass -keypass nokiaguypass test.jar nokiaguy
在執(zhí)行完上面的命令后,我們會(huì)發(fā)現(xiàn)test.jar文件的尺寸變大了。
二、建立虛擬目錄
下面就是在自己的機(jī)器上或服務(wù)器建立一個(gè)可訪問的虛擬目錄。本文使用了IIS建立一個(gè)虛擬目錄,可通過http://200.200.200.200/key訪問該目錄,在該目錄下只有一個(gè)test.jar文件(經(jīng)過簽名后的jar文件)。
三、編寫jnlp文件
在任意目錄下建立一個(gè)test.jnlp文件,并輸入如下內(nèi)容:
<?xml version="1.0" encoding="utf-8"?>
<jnlp spec="1.0+" codebase="http://200.200.200.200/key">
<information>
<title>CustomSWT</title>
<vendor>nokiaguy.blogjava.net</vendor
<homepage href="index.html"/>
</information>
<security>
<all-permissions/>
</security>
<resources>
<j2se version="1.6.0"/>
<jar href="test.jar"/>
</resources>
<application-desc main-class="CustomMain"/>
</jnlp>
<jnlp spec="1.0+" codebase="http://200.200.200.200/key">
<information>
<title>CustomSWT</title>
<vendor>nokiaguy.blogjava.net</vendor
<homepage href="index.html"/>
</information>
<security>
<all-permissions/>
</security>
<resources>
<j2se version="1.6.0"/>
<jar href="test.jar"/>
</resources>
<application-desc main-class="CustomMain"/>
</jnlp>
其中<jnlp>根元素通過codebase指定了虛擬目錄的url。通過<jar>元素指定了要下載的test.jar文件。如果存在多個(gè)jar文件,可以有多個(gè)<jar>元素。<jar>元素的href屬性指定要下載的jar文件,該文件路徑是相對(duì)于codebase屬性值的。如果要考慮不同的操作系統(tǒng),可以將多個(gè)<resources>元素,如下面的代碼所示:
<resources os="Windows">
<jar href="win32/swt.jar"/>
<nativelib href="win32/swt-native-lib-win32.jar"/>
</resources>
<resources os="Linux">
<jar href="linux/swt.jar"/>
<jar href="linux/swt-pi.jar"/>
<nativelib href="linux/swt-native-lib-linux.jar"/>
</resources>
<jar href="win32/swt.jar"/>
<nativelib href="win32/swt-native-lib-win32.jar"/>
</resources>
<resources os="Linux">
<jar href="linux/swt.jar"/>
<jar href="linux/swt-pi.jar"/>
<nativelib href="linux/swt-native-lib-linux.jar"/>
</resources>
要注意,必須使課堂<application-desc>元素指定要運(yùn)行的主窗口的類名(帶包名),由于本文使用的test.jar文件中主窗口類沒有名,類名為CustomMain,因此,只main-class屬性值為CustomMain。
運(yùn)行test.jnlp,一開始會(huì)顯示如圖1所示的歡迎界面。

圖1
然后會(huì)出現(xiàn)如圖2所示的界面。
圖2
不過讀者不要擔(dān)心,這不是錯(cuò)誤,而是說我們使用的證書并不是Sun支持的(而是我們自己生成的),因此,會(huì)出現(xiàn)這個(gè)證書提示(如果使用Sun支持的證書就不會(huì)出現(xiàn)這個(gè)異常,但要花錢的哦!)。選中“始終信任此發(fā)行者的內(nèi)容”復(fù)選框,單擊“運(yùn)行”按鈕,就會(huì)下載test.jar文件,并運(yùn)行程序。再次運(yùn)行test.jnlp文件,就會(huì)直接運(yùn)行程序了(不會(huì)再出現(xiàn)圖2的對(duì)話框)。如果這時(shí)服務(wù)端更新的test.jar,test.jnlp會(huì)自動(dòng)檢測程序文件的更新時(shí)間,如果服務(wù)端程序更新,則會(huì)重新下載該程序,并運(yùn)行。因此,使用jnlp文件也可以實(shí)現(xiàn)實(shí)時(shí)更新程序的功能。有些象微軟的smartclient。在更新服務(wù)端程序時(shí),千萬別忘了對(duì)程序進(jìn)行簽名啊,如果不簽名,在運(yùn)行jnlp文件時(shí)就會(huì)出現(xiàn)如圖3所示的異常信息。

圖3
實(shí)際上,jnlp文件默認(rèn)情況下將test.jar文件下載到C:\Documents and Settings\Administrator\Application Data\Sun\Java\Deployment\cache目錄中。但文件名并不是test.jar,讀者可以在該目錄中查找所有的文件,并找與test.jar文件的大小一樣的文件即可(一共也沒多少文件,很好找)。如文件名為27a940d-69feaa17。如果服務(wù)端和客戶端cache中的程序一樣新或沒有客戶端的新,則jnlp會(huì)直接運(yùn)行客戶端cache中的程序。最后提一下,jnlp也是需要使用jre的哦,在使用jnlp之前,別忘了安裝jre啊!
《Android開發(fā)完全講義(第2版)》(本書版權(quán)已輸出到臺(tái)灣)
http://product.dangdang.com/product.aspx?product_id=22741502
《Android高薪之路:Android程序員面試寶典 》http://book.360buy.com/10970314.html
新浪微博:http://t.sina.com.cn/androidguy 昵稱:李寧_Lining
posted on 2009-05-22 15:38 銀河使者 閱讀(5880) 評(píng)論(4) 編輯 收藏 所屬分類: 原創(chuàng) 、安全 、程序發(fā)布