這幾天一直在搞基於jnlp的java程序更新。搞得是暈頭轉向,手忙腳亂。呵呵,樓主技術比較菜。java
還好,馬馬虎虎算是搞出來了。程序員
其中遇到很多問題,拿出來和你們分享分享,避免之後你們再走彎路。web
概念性的東西就不作解釋了。
瀏覽器
Java web start 百度百科給的很好。
緩存
http://baike.baidu.com/link?url=otZSDvcLB1unGU5xMU_Zwzi75Ia-ykut5xIVGb5F0Z1YWp4mSCmFNZcdi4OreWclx8aZ1v1mAfxft9JEG0OjJ_安全
jnlp 百度百科給的也很好,呵呵。你們能夠看下他的定義。服務器
http://baike.baidu.com/link?url=CFeRYNKm2eMu24Lsi5stTfxKbCaV33GCQsq84FNIsqmi0D4aEhDTmk5URi341pHz架構
樓主理解的Java web start其實就是應用程序部署到瀏覽器裏面,看似是B/S程序,實際上是C/S架構(可能理解不對,歡迎指正)。固然Java web start也能夠拿出來單獨運行。主要就是方面。比傳統C/S少了不少安裝步驟,比傳統B/S多了更好的用戶體驗,並且能夠時刻保存其最新的版本等。app
jnlp這個就比較好了。這個東西給樓主的感受就像是一個快捷方式,這個快捷方式能夠指向服務器端的引用。以致於之後若是有軟件更新,直接讓用戶更新一下這個jnlp文件就能夠了。jnlp文件很是之小,通常只有幾KB。這樣的話就大大節省時間,很是提升用戶的體驗。這樣,只須要更新一下服務器端的最新程序,而後讓jnlp文件指向這個打好的jar包或者jnlp文件就OK了。maven
閒話扯了很多。
下面詳細說說作這個更新的時候遇到的問題。
1.
這個問題多半就是打包問題。打包簽名的安全問題。
寫好的項目須要達成jar包和jnlp文件。
樓主打包使用的是ant打包,沒有使用現下比較流行的maven。至於爲何,樓主只能說,領導的世界咱們不懂。
客戶端使用的javafx,須要將客戶端打成jar包。相似applet,使用javafx部署這種客戶端,由於java的安全策略,java應用程序環境的安全策略,它是由一個Policy對象來表達。
咱們須要手動的改一下Java\jre7\lib\security\java.policy文件。我在最後添加了一行permission java.security.AllPermission; 這就是給客戶機全部的權限。這樣一來,客戶端程序就有權限來操做本地的權限。
再有就是須要對客戶端程序的jar包進行數字簽名。
數字簽名:採用加密技術來實現對簽名者身份的認證和數據的完整性。簡單的說就是你簽字的文件別人知道是你籤的,而且知 道這個文件是否被修改過。
ant有signjar,使用這個標籤給jar包進行簽名。java自帶的keytool.exe工具也能夠實現簽名,具體操做請自行查詢。
2.
具體錯誤:
java.lang.ExceptionInInitializerError at javax.swing.filechooser.FileSystemView.getFileSystemView(Unknown Source) at com.platform.ui.update.DownloadFileController.init(DownloadFileController.java:166) at com.platform.ui.update.DownLoadFileView.buildInit(DownLoadFileView.java:41) at com.platform.ui.update.MainUpdate.start(MainUpdate.java:17) at com.sun.javafx.applet.FXApplet2$1.run(FXApplet2.java:132) at com.sun.javafx.application.PlatformImpl$4$1.run(PlatformImpl.java:179) at com.sun.javafx.application.PlatformImpl$4$1.run(PlatformImpl.java:176) at java.security.AccessController.doPrivileged(Native Method) at com.sun.javafx.application.PlatformImpl$4.run(PlatformImpl.java:176) at com.sun.glass.ui.win.WinApplication._runLoop(Native Method) at com.sun.glass.ui.win.WinApplication.access$100(WinApplication.java:29) at com.sun.glass.ui.win.WinApplication$3$1.run(WinApplication.java:73) at java.lang.Thread.run(Unknown Source) Caused by: java.lang.NullPointerException at javax.swing.SwingUtilities.appContextGet(Unknown Source) at javax.swing.UIManager.getLAFState(Unknown Source) at javax.swing.UIManager.maybeInitialize(Unknown Source) at javax.swing.UIManager.getDefaults(Unknown Source) at javax.swing.UIManager.getString(Unknown Source) at javax.swing.filechooser.WindowsFileSystemView.<clinit>(Unknown Source) ... 13 more Exception in runnable java.lang.RuntimeException: java.lang.ExceptionInInitializerError at com.sun.javafx.applet.FXApplet2$1.run(FXApplet2.java:148) at com.sun.javafx.application.PlatformImpl$4$1.run(PlatformImpl.java:179) at com.sun.javafx.application.PlatformImpl$4$1.run(PlatformImpl.java:176) at java.security.AccessController.doPrivileged(Native Method) at com.sun.javafx.application.PlatformImpl$4.run(PlatformImpl.java:176) at com.sun.glass.ui.win.WinApplication._runLoop(Native Method) at com.sun.glass.ui.win.WinApplication.access$100(WinApplication.java:29) at com.sun.glass.ui.win.WinApplication$3$1.run(WinApplication.java:73) at java.lang.Thread.run(Unknown Source) Caused by: java.lang.ExceptionInInitializerError at javax.swing.filechooser.FileSystemView.getFileSystemView(Unknown Source) at com.platform.ui.update.DownloadFileController.init(DownloadFileController.java:166) at com.platform.ui.update.DownLoadFileView.buildInit(DownLoadFileView.java:41) at com.platform.ui.update.MainUpdate.start(MainUpdate.java:17) at com.sun.javafx.applet.FXApplet2$1.run(FXApplet2.java:132) ... 8 more Caused by: java.lang.NullPointerException at javax.swing.SwingUtilities.appContextGet(Unknown Source) at javax.swing.UIManager.getLAFState(Unknown Source) at javax.swing.UIManager.maybeInitialize(Unknown Source) at javax.swing.UIManager.getDefaults(Unknown Source) at javax.swing.UIManager.getString(Unknown Source) at javax.swing.filechooser.WindowsFileSystemView.<clinit>(Unknown Source) ... 13 more
這種異常通常都是因爲靜態變量初始化失敗形成,樓主在調用
FileSystemView.getFileSystemView
上面這行代碼,調用這個靜態方法的時候,程序初始化失敗了。這個問題是在測試的時候出如今一個同事的電腦上,因而想到可能不是程序的問題,而是本地電腦環境的問題。因而想到了緩存,若是有緩存存在也可能會致使靜態變量初始化失敗的狀況,清了緩存以後仍是不能夠,這個問題糾結納悶了很久。最後發現是jre版本的問題。當時開發的時候都統一了版本,這種狀況比較糾結,呵呵。能夠確定的是,版本不同致使getFileSystemView這個靜態方法初始化失敗,至於爲何會這樣,樓主還在研究當中。
3.
這是在客戶那裏演示的時候出現的問題,當時比較尷尬了。
看到這個error感受很致命,程序直接崩了。回來以後測試了N遍也沒能重現這個問題,因而遠程到客戶電腦上看到底怎麼回事,也在網上查了。大致都是在說內存不夠,致使程序運行不起來。順便吐槽一下部分程序員,直接就是搬運工,樓主搜了至少10幾篇文章都是一個樣。。也沒標註轉載。
因而樓主看了下客戶的電腦配置,4G內存,CPU也很空閒。樓主自身電腦也是4G內存,跑這程序刷刷的。又限入無限糾結中,到底怎麼回事呢。樓主想到了配置java運行參數的幾個地方。好比Xsms,Xsmx之類。先是檢查了環境變量的配置。沒有問題。而後是jnlp文件的配置(jnlp文件裏面有關於java運行內存的配置),也是沒問題。最後終於發現問題所在!
在java的控制面板裏面,有一項運行時參數,不填寫或者填寫的大一些,這樣就能夠運行了。這裏限制java的運行環境。
這幾個是主要問題,如今回頭來看,其實也不是那麼難,但在當時真是把樓主折騰的夠嗆。所謂不識廬山真面目,只緣身在此山中把。樓主深陷其中,一直不得所悟,呵呵。
還有一些顯示不了的問題,都是一下小問題。好比把java的安全等級調低。
在調試客戶端錯誤時,有必要將java控制檯顯示出來,並打印日誌等信息。
坦言講,樓主對於jnlp、javafx以及java web start的理解並很少麼深入,只是最近項目須要,臨時研究了下。遇到一些問題和你們分享,但願可以幫助看到的人少走些彎路。若有不對,歡迎指正。QQ:70747053