隨筆 - 312, 文章 - 14, 評論 - 1393, 引用 - 0

          導航

          <2009年5月>
          262728293012
          3456789
          10111213141516
          17181920212223
          24252627282930
          31123456

          公告

          關注我的新浪微博

          我的著作









          常用鏈接

          留言簿(126)

          我參與的團隊

          隨筆分類(818)

          隨筆檔案(310)

          文章分類(1)

          文章檔案(8)

          相冊

          ADSL、3G查詢

          CSDN

          eclipse

          ibm

          Java EE

          Linux

          Web

          云服務

          代理網站

          關注的網站

          協議

          喜歡的Blog

          國內廣告平臺

          圖書出版

          在線培訓

          開發工具

          微博客戶端

          手機鈴聲

          操作系統

          • ReactOS
          • 一個與windowXP/2003兼容的操作系統

          數學

          文件格式

          源碼資源

          移動(Mobile)

          編程語言

          英語學習

          最新隨筆

          搜索

          •  

          積分與排名

          • 積分 - 1972960
          • 排名 - 6

          最新評論

          閱讀排行榜

          評論排行榜

          使用腳本文件(jnlp)來發布Java程序

          本文為原創,如需轉載,請注明作者和出處,謝謝!

              發布Java程序(桌面程序)最直接的方法就是將jar文件打包交給用戶。不過有時jar文件很多,也很大。為了方便,sun提供了另外一種方式來通過網絡發布Java程序。這就是jnlp文件??赡芎芏嘧x者曾經下載過很多jnlp文件,運行后會自動從指定的網站下載相應的文件。
              實際上,jnlp文件就是一個xml格式的腳本文件。假設我們有一個test.jar文件需要安裝(該文件是一個基于SWT的桌面程序),那么要使用jnlp文件發布test.jar需要如下幾步:

          一、為test.jar文件簽名
              從網絡上下載就意味著風險大大增加,因此,要想通過jnlp從網絡上下載jar文件,并運行,就需要對該文件進行簽名。如果不簽名,java程序將運行在sandbox中,也就是說無法訪問本地資源,由于test.jar是swt程序,需要訪問本地的dll(windows)或.so(linux)庫,所以必須要對test.jar進行文件簽名。
              簽名需要一個證書,如果沒有證書,可以使用如下的命令生成一個證書

          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"

              在執行上面的命令后,會在當前目錄下生成一個nokiaguy.keystore文件。然后將test.jar復制到當前目錄下?,F在當前目錄有兩個文件:nokiaguy.keystore和test.jar。最后使用如下的命令對test.jar簽名:

          jarsigner -keystore nokiaguy.keystore -storepass nokiaguypass -keypass nokiaguypass test.jar nokiaguy

              在執行完上面的命令后,我們會發現test.jar文件的尺寸變大了。

          二、建立虛擬目錄

              下面就是在自己的機器上或服務器建立一個可訪問的虛擬目錄。本文使用了IIS建立一個虛擬目錄,可通過http://200.200.200.200/key訪問該目錄,在該目錄下只有一個test.jar文件(經過簽名后的jar文件)。

          三、編寫jnlp文件
              在任意目錄下建立一個test.jnlp文件,并輸入如下內容:

          <?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>根元素通過codebase指定了虛擬目錄的url。通過<jar>元素指定了要下載的test.jar文件。如果存在多個jar文件,可以有多個<jar>元素。<jar>元素的href屬性指定要下載的jar文件,該文件路徑是相對于codebase屬性值的。如果要考慮不同的操作系統,可以將多個<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>

              要注意,必須使課堂<application-desc>元素指定要運行的主窗口的類名(帶包名),由于本文使用的test.jar文件中主窗口類沒有名,類名為CustomMain,因此,只main-class屬性值為CustomMain。

              運行test.jnlp,一開始會顯示如圖1所示的歡迎界面。

          圖1
              然后會出現如圖2所示的界面。
          圖2
              不過讀者不要擔心,這不是錯誤,而是說我們使用的證書并不是Sun支持的(而是我們自己生成的),因此,會出現這個證書提示(如果使用Sun支持的證書就不會出現這個異常,但要花錢的哦?。_x中“始終信任此發行者的內容”復選框,單擊“運行”按鈕,就會下載test.jar文件,并運行程序。再次運行test.jnlp文件,就會直接運行程序了(不會再出現圖2的對話框)。
              如果這時服務端更新的test.jar,test.jnlp會自動檢測程序文件的更新時間,如果服務端程序更新,則會重新下載該程序,并運行。因此,使用jnlp文件也可以實現實時更新程序的功能。有些象微軟的smartclient。在更新服務端程序時,千萬別忘了對程序進行簽名啊,如果不簽名,在運行jnlp文件時就會出現如圖3所示的異常信息。
          圖3
              實際上,jnlp文件默認情況下將test.jar文件下載到C:\Documents and Settings\Administrator\Application Data\Sun\Java\Deployment\cache目錄中。但文件名并不是test.jar,讀者可以在該目錄中查找所有的文件,并找與test.jar文件的大小一樣的文件即可(一共也沒多少文件,很好找)。如文件名為27a940d-69feaa17。如果服務端和客戶端cache中的程序一樣新或沒有客戶端的新,則jnlp會直接運行客戶端cache中的程序。
              最后提一下,jnlp也是需要使用jre的哦,在使用jnlp之前,別忘了安裝jre啊!





          Android開發完全講義(第2版)(本書版權已輸出到臺灣)

          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 銀河使者 閱讀(5879) 評論(4)  編輯  收藏 所屬分類: 原創 、安全 、程序發布

          評論

          # re: 使用腳本文件(jnlp)來發布Java程序[未登錄]  回復  更多評論   

          還是exe4j+Inno Setup 和install4j更好用
          都可以把程序打包成一個安裝程序并且把JRE也打包 用戶只需雙擊鼠標,瞇著眼睛點下一步直到安裝完成就可以使用。。不許要擁護做任何多余的操作,傻瓜式的使用是用戶更方便。
          2009-05-27 04:27 | 小毅

          # re: 使用腳本文件(jnlp)來發布Java程序  回復  更多評論   

          @小毅
          這個方法不光是安裝程序哦。還有一個實時更新的功能,如果服務端的程序更新的,就不用每個客戶端再次分發一遍安裝程序了,只需要再運行jnlp文件就可以直接下載了。哈哈
          2009-05-27 08:08 | 銀河使者

          # re: 使用腳本文件(jnlp)來發布Java程序[未登錄]  回復  更多評論   

          如果服務端的程序更新的,就不用每個客戶端再次分發一遍安裝程序了,只需要再運行jnlp文件就可以直接下載了。

          呵呵 這功能不錯。
          你的博客寫的很棒,敢肯定絕對是位牛人,而且還樂于分享、謙和、認真的朋友,支持你哈 ~0。0~。
          2009-09-21 17:30 | 小毅

          # re: 使用腳本文件(jnlp)來發布Java程序  回復  更多評論   

          樓主:
          想向你請教一個問題,如果我發布的java客戶端要讀取配置文件要怎么弄啊,
          比如說:我的客戶端里面有*.jar,*.property文件,jar文件可以通過<jar>標簽配置下載,那property文件要怎么配置啊。用java web start 發布后要怎么取得property文件啊
          2011-11-24 09:46 | 艾波
          主站蜘蛛池模板: 中宁县| 东乌| 奉新县| 石渠县| 四会市| 舞阳县| 黑龙江省| 汶川县| 沙雅县| 镇沅| 桓台县| 即墨市| 响水县| 万盛区| 荆州市| 丁青县| 灵宝市| 永定县| 浦江县| 兴隆县| 辉南县| 吉木萨尔县| 丽水市| 宁强县| 寿光市| 阿坝| 酒泉市| 枝江市| 杭锦旗| 青川县| 延吉市| 洛川县| 安溪县| 晋宁县| 沈阳市| 德格县| 蒲城县| 汽车| 辽阳县| 阜南县| 太仆寺旗|