Java web start--基于jnlp的软件更新

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

相关文章
相关标签/搜索