Java web start

Wesley13
• 阅读 450

这几天一直在搞基于jnlp的java程序更新。搞得是晕头转向,手忙脚乱。呵呵,楼主技术比较菜。

还好,马马虎虎算是搞出来了。

其中遇到不少问题,拿出来和大家分享分享,避免以后大家再走弯路。

概念性的东西就不做解释了。

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多了更好的用户体验,而且可以时刻保存其最新的版本等。

jnlp这个就比较好了。这个东西给楼主的感觉就像是一个快捷方式,这个快捷方式可以指向服务器端的引用。以至于以后如果有软件更新,直接让用户更新一下这个jnlp文件就可以了。jnlp文件非常之小,一般只有几KB。这样的话就大大节省时间,非常提高用户的体验。这样,只需要更新一下服务器端的最新程序,然后让jnlp文件指向这个打好的jar包或者jnlp文件就OK了。

闲话扯了不少。

下面详细说说做这个更新的时候遇到的问题。

Java web start

这个问题多半就是打包问题。打包签名的安全问题。

写好的项目需要达成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工具也可以实现签名,具体操作请自行查询。

Java web start

具体错误:

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这个静态方法初始化失败,至于为什么会这样,楼主还在研究当中。

Java web start

这是在客户那里演示的时候出现的问题,当时比较尴尬了。

看到这个error感觉很致命,程序直接崩了。回来之后测试了N遍也没能重现这个问题,于是远程到客户电脑上看到底怎么回事,也在网上查了。大体都是在说内存不够,导致程序运行不起来。顺便吐槽一下部分程序员,直接就是搬运工,楼主搜了至少10几篇文章都是一个样。。也没标注转载。

于是楼主看了下客户的电脑配置,4G内存,CPU也很空闲。楼主自身电脑也是4G内存,跑这程序刷刷的。又限入无限纠结中,到底怎么回事呢。楼主想到了配置java运行参数的几个地方。比如Xsms,Xsmx之类。先是检查了环境变量的配置。没有问题。然后是jnlp文件的配置(jnlp文件里面有关于java运行内存的配置),也是没问题。最后终于发现问题所在!

Java web start

在java的控制面板里面,有一项运行时参数,不填写或者填写的大一些,这样就可以运行了。这里限制java的运行环境。

这几个是主要问题,现在回头来看,其实也不是那么难,但在当时真是把楼主折腾的够呛。所谓不识庐山真面目,只缘身在此山中把。楼主深陷其中,一直不得所悟,呵呵。

还有一些显示不了的问题,都是一下小问题。比如把java的安全等级调低。

Java web start

在调试客户端错误时,有必要将java控制台显示出来,并打印日志等信息。

Java web start

坦言讲,楼主对于jnlp、javafx以及java web start的理解并不多么深刻,只是最近项目需要,临时研究了下。遇到一些问题和大家分享,希望能够帮助看到的人少走些弯路。如有不对,欢迎指正。QQ:70747053

点赞
收藏
评论区
推荐文章
Symbol卢 Symbol卢
2年前
聊聊js中的数组
前言Hello,大家好,我是Symbol卢,由于年前公司的业务比较紧,也有一段时间没有更新文章了(有几篇文章还没结搞),于是就是在大年初一和初二这两天写了这篇关于js数组的水文。由于内容比较多,打算分成两期进行分享(此文为第一期),如果文章中有不恰当的地方,也欢迎各位大佬(前辈)多多指教,(本人菜的抠脚,文中称为笔者),好了废话不多说,咱们直接进入正文关于数
Wesley13 Wesley13
2年前
java环境变量的配置
  刚开始学java时,遇到的第一个坑必定是java环境变量的配置,我整理了一下,将如何配置环境变量分享给大家。  为什么要配环境变量?  java程序在运行的时候,本质上是通过命令行来运行的,我们编写的java程序,首先被编译为class文件,然后将此文件放在java虚拟机中去执行。怎样编译,怎样执行,jdk已经为我们写好了(实际上就是javac
Wesley13 Wesley13
2年前
Java和PHP在Web开发方面的比较
比较PHP和JSP这两个Web开发技术,在目前的情况是其实是比较PHP和Java的Web开发。以下是我就几个主要方面进行的比较:一、语言比较  PHP是解释执行的服务器脚本语言,首先php有简单容易上手的特点。语法和c语言比较象,所以学过c语言的程序员可以很快的熟悉php的开发。而java需要先学好java的语法和熟悉一些核心的
Wesley13 Wesley13
2年前
Java微服务 vs Go微服务,究竟谁更强!?
前言Java微服务能像Go微服务一样快吗?这是我最近一直在思索地一个问题。去年8月份的theOracleGroundbreakersTour2020LATAM大会上,MarkNelson和PeterNagy就对此做过一系列基础的的测试用以比较。接下来就给大家介绍下。在程序员圈子里,普遍的看法是Java老、慢、无聊
可莉 可莉
2年前
20个非常有用的Java程序片段
    开学之后很久没有更博了,每天上课游泳打球去了…… 今天是十一小长假的第4天,闲来无事,在微博上看见转载的java开发的文章,分享给大家。1\.字符串有整型的相互转换StringaString.valueOf(2);//integertonumericstringintiInteger.pa
Wesley13 Wesley13
2年前
Mysql 乐观锁 和悲观锁
平时看博客或技术文章的时候,经常被各种锁搞得晕晕乎乎,包括在自旋锁、可重入锁、公平锁等等、乐观锁、悲观锁、行锁、表锁、意向锁、排它锁等。前段时间终于把Java多线程相关的锁有机会学习了一遍。现在开始整理mysql相关的锁概念。先从乐观锁和悲观锁开始聊聊。首先要知道,乐观锁和悲观锁不是真实存在的锁,只是两种抽象概念性的东西,就相当于Java中的接口,只
Stella981 Stella981
2年前
SpirngBoot后台使用QQ邮箱发送验证码实现全过程
SpirngBoot后台使用QQ邮箱发送验证码在学校自己搞项目的时候想多搞点功能,短信验证码又要收费,所以搞个白嫖邮箱验证哈哈哈哈而在百度查资料的时候,发现大佬们都喜欢只给一两句关键代码,这让我这种菜鸟就比较为难,所以我自己不断一点点百度并整理了这份资料,并且自己也将功能实现了,在此分享给大家,
Stella981 Stella981
2年前
Creator优化心得:减少脚本文件的大小
星期2是公众号更新的一个时间点,Shawn这几天情事太多,眼看就快要过12点了,公众号教程看来今天黄呀!但是不发晚上睡不着呀,看来我是中了得到罗胖的毒“死磕自己”,一定要把公众号给发了。还好之前留着大神Colin的一些文章,还没在公众号上推送过,我立马读了一下,任然有不少收获,现将这篇文章分享给大家,在此感谢Colin!!(https://o
Stella981 Stella981
2年前
HarmonyOS环境搭建遇到的坑,分享给大家
目录:1)Linux环境搭建(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fharmonyos.51cto.com%2Fposts%2F2248%23kyzg)2)Windows环境搭建(https://www.oschina.net/action
京东云开发者 京东云开发者
4个月前
Java模块化应用实践之精简JRE | 京东云技术团队
Java9及以后的版本引入了模块化特性,实际实践了一段时间之后发现“真香!”现在把“利用Java模块化精简JRE”的方法和经验分享给大家。