这几天一直在搞基于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