<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    TWaver - 專注UI技術

    http://twaver.servasoft.com/
    posts - 171, comments - 191, trackbacks - 0, articles - 2
      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

    Java Web Start實踐:動態生成JNLP

    Posted on 2012-05-21 10:56 TWaver 閱讀(2686) 評論(1)  編輯  收藏
         Java很早就推出了Java Web Start(簡稱JWS)技術。這一技術的初衷很好:希望將桌面程序和Web頁面之間搭起一個無縫的橋梁。雖然Applet技術已經存在了十多年,但是它日趨老邁衰落,所以JWS也就應運而生了。 但是JWS并未順利實現它的初衷。從Java的幾次大改版都可以看到,JWS的bug多多,漏洞頻頻,Sun和Oracle不得不頻繁的進行打補丁修復。可以看看Java 5和6每次大小版本升級變化中,有多少是和Java Web Start有關的。難怪很多人都這樣感嘆:“哥再也不用Java Web Start部署應用了!”其實也未必,隨著Java的不斷完善,我們只要了解更多的技巧,就可以有效的消除一些JWS潛在的問題,并順利的應用在企業應用中。 以2BizBox ERP項目為例,本文介紹如何在企業應用中利用動態生成JNLP文件的技術來實現應用的快速部署。
          大家知道,2BizBox ERP作為一個免費的高質量ERP軟件,有成千上萬的用戶。就我們開發團隊負責維護的服務器,就有近千臺。每臺服務器都是一家企業,每家企業又有幾十上百的客戶端。如果采用下載客戶端安裝程序進行安裝的方式來維護諸多的客戶端,無疑是巨大的工作量,用戶和我們開發團隊都不會輕松方便。為了解決這一問題,采用JWS無疑是必然的選擇。
          為了讓客戶端自動啟動下載和安裝程序,我們在企業的2BizBox ERP服務器上部署以下JNLP文件內容:
     1 
     2<?xml version="1.0" encoding="utf-8"?>
     3 <jnlp spec="1.0+" codebase="http://**.**.**.**/webstart/">
     4         <information>
     5                 <title>2BizBox</title>
     6                 <vendor>Serva Software</vendor>
     7                 <homepage />
     8                 <description>2BizBox ERP 3</description>
     9                 <offline-allowed/>
    10         </information>
    11         <security>
    12                 <all-permissions/>
    13         </security>
    14         <update check="always" policy="always"/>
    15         <resources>
    16                 <j2se />
    17                 <jar href="2bizbox.jar />
    18                 <jar href="lib1.jar />
    19                 <jar href="lib2.jar />
    20                 <jar href="lib3.jar />
    21                 <jar href="lib4.jar />
    22                 <!-- more jar.   -->
    23         </resources>
    24         <application-desc main-class="com.serva.bb2.gui.Main">
    25                 <argument>**.**.**.**</argument>
    26         </application-desc>
    27 </jnlp>

          上面的JNLP文件定義了2BizBox ERP客戶端啟動所需要的jar包以及下載位置、jre版本等。
         
          在實際應用中,效果良好。但是由于JNLP和JWS本身的bug,在某些情況下,后臺jar程序更新升級后,用戶側啟動jnlp并不能獲得更新,需要強行清空JWS緩存才行,這肯定不是一般用戶懂得的。還有一種情況,就是由于ERP本身的jar包發生了變化(例如發生了增減),此時相當于jnlp文件的內容發生了變化。這時候,要求用戶一側機器必須意識到jnlp的變化并先將jnlp進行更新。在很多java版本中(例如jre6的早期版本——例如jre6 update20之前),由于潛在的一些bug等原因,都不能順利的進行更新,導致程序啟動失敗。
         
          如何解決這一情況呢?采用動態jnlp是一個有效的方法。
         
          動態jnlp的思路是:在服務器的后端,通過jsp或servlet來動態的生成一個jnlp文件,而不是放置一個靜態的固定不變的jnlp文件。這樣,jnlp文件內容就可以通過后臺應用的邏輯進行動態生成創建:需要什么jar包、需要什么jre版本等等。
          以jsp為例。在這個jsp中,首先要注意的幾個技術點是:要設置本頁面不要被瀏覽器緩存,放置jnlp內容變化無法及時被更新;其次要設置mime類型讓瀏覽器認為它是一個jnlp文件,以便下載執行而不是直接在瀏覽器中顯示出來。通過設置response即可達到這些目的:

    1 response.setHeader("Pragma", "no-cache");
    2 response.setHeader("Expires", "0");
    3 response.setHeader("Content-Disposition", "filename=\"bb.jnlp\";");
    4 response.setContentType("application/x-java-jnlp-file");
     
         其中,禁止瀏覽器和webstart緩存jnlp內容,通過設置:response.setHeader("Pragma", "no-cache");和response.setHeader("Expires", "0");
         設置文件類型,并給定一個動態的文件名。這個通過這個進行:response.setHeader("Content-Disposition", "filename=\"bb.jnlp\";");response.setContentType("application/x-java-jnlp-file");
         
         一個需要注意的問題是,在動態生成jnlp文件時,要注意jnlp文件中的href標簽不要進行設置。為什么呢?看一下jnlp的格式文檔是這樣說的: http://lopica.sourceforge.net/ref.html#jnlp

    The jnlp file's one and only root.

    Attributes
    spec=version , optional
    Specifies what versions of the jnlp spec a jnlp file works with. The default value is 1.0+. Thus, you can typically leave it out.
    version=version , optional
    Specifies the version of the application as well as the version of the jnlp file itself.
    codebase=url , optional
    Specifies the codebase for the application. Codebase is also used as base URL for all relative URLs in href attributes.
    href=url , optional
    Contains the location of the jnlp file as a URL. If you leave out the href attribute, Web Start will disable the update check on your JNLP file, and Web Start will not treat each new JNLP file as an application update - only updated jar files will. Leaving out href usually makes only sense if your jnlp file is created dynamically (that is, throug a cgi-script, for example) and if your jnlp file's arguments or properties change from request to request (user to user).
    Note, that Java Web Start needs href to list your app in the Web Start Application Manager.

          可見在動態生成jnlp時候就不要設置href了,這樣就可以保證每次瀏覽器會重新下載jnlp文件內容,否則可能會被緩存,無法及時更新程序。

          另外一個技巧是:jnlp文件中的jar包,可以進行動態檢查文件jar包并動態生成。這樣,如果以后程序的jar文件有增減,就不必修改jnlp文件了。方法也很簡單:檢查當前web在服務器的絕對路徑,并list所有的jar文件,然后在jnlp生成時候輸出即可:

     1 
     2 <%
     3 String urlString=request.getRequestURL().toString();
     4 URL url=new URL(urlString);
     5 String host=url.getHost();
     6 String path = request.getSession().getServletContext().getRealPath("/");
     7 path=path.replace("\\.\\", "\\");
     8 File file=new File(path);
     9 String[] files = file.list();
    10 ArrayList jarNames=new ArrayList();
    11 for(int i=0;i<files.length;i++){
    12 String fileName=files[i];
    13 if(fileName.toLowerCase().endsWith(".jar")){
    14 jarNames.add(fileName);
    15 }
    16 }
    17 %>
    18 
          然后在jar的部分這樣列出:

     1         <resources>
     2                 <j2se />
     3 <%
     4 for(int i=0;i<jarNames.size();i++){
     5 out.write("\n");
     6 out.write("<jar href=\""+jarNames.get(i).toString()+"\"/>");
     7 }
     8 %>
     9         </resources>
    10 
          最后,如果需要在jnlp中指定當前服務器的ip地址或主機地址,也可以通過動態生成。例如jnlp文件中的codebase,就是如此。另外,2BizBox ERP還需要在主函數中給出當前服務器的ip地址。而對于上千家的2BizBox服務器,每個jnlp要手工維護ip地址,是不可想象的。這里通過動態生成,就永遠的解決了這個問題:

    1 String urlString=request.getRequestURL().toString();
    2 URL url=new URL(urlString);
    3 String host=url.getHost();

          然后在jnlp中:

    1 <jnlp spec="1.0+" codebase="http://<%=host%>/webstart/">
    2 
    3         <application-desc main-class="com.serva.bb2.gui.Main">
    4                 <argument><%=host%></argument>
    5         </application-desc>
         
         這樣,通過jsp動態生成jnlp的方案就完成了。它在2BizBox ERP中應用良好,方便的讓上千家2BizBox ERP的云主機用戶快速得到程序更新,而簡化了程序的維護方式。

    評論

    # re: Java Web Start實踐:動態生成JNLP  回復  更多評論   

    2012-05-28 16:16 by SAA認證
    動態的東東還是不錯的

    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: 国产精品亚洲综合五月天| 91精品国产亚洲爽啪在线观看| 亚洲制服丝袜第一页| 最近2019免费中文字幕6| 久久亚洲中文字幕精品有坂深雪 | 亚洲s码欧洲m码吹潮| 青青草a免费线观a| 亚洲一卡2卡3卡4卡国产网站| 免费福利视频导航| 亚洲成人高清在线观看| 久视频精品免费观看99| 日本在线看片免费人成视频1000| 亚洲黄色网址大全| 99爱免费观看视频在线| 久久精品a亚洲国产v高清不卡| 中文字幕免费观看| va天堂va亚洲va影视中文字幕 | 亚洲成AV人综合在线观看| 欧洲乱码伦视频免费国产| 亚洲精品乱码久久久久久蜜桃| 搜日本一区二区三区免费高清视频 | 永久在线观看免费视频| 久久精品国产精品亚洲精品| 97公开免费视频| 在线a亚洲老鸭窝天堂av高清| 免费99热在线观看| 中国一级特黄高清免费的大片中国一级黄色片 | 亚洲熟妇无码八V在线播放| 日韩免费福利视频| 久久精品无码专区免费| 亚洲国产精品久久久久婷婷软件 | 亚洲福利在线视频| 999在线视频精品免费播放观看| 亚洲国产成人久久综合| 国产精品V亚洲精品V日韩精品 | 亚洲AV永久青草无码精品| www.999精品视频观看免费| 青青视频免费在线| 亚洲人成在线播放网站岛国| 大地资源在线观看免费高清| eeuss草民免费|