在我的公司,我们使用Java Web Start将客户端软件分发给客户 . 他们使用不同的Windows版本:XP,Vista和7 .
我们在过去通过JWS部署了一个版本最少的版本 . 我们的最新版本包括几个文件更改,一些 jar 不见了,其他的出现了,等等 .
我们发现Windows XP计算机上的升级失败,因为JWS仍然试图查找在Web服务器上不再可用的jar文件 . 我已经检查了我的HTTP服务器日志,并且在应用程序启动期间永远不会从XP机器上访问JNLP文件 . 如果我在Vista或Windows 7上尝试相同的一切正常,JWS将获取JNLP描述符并在更新可用时下载差异 . 因此,在XP机器上,只有已知的jar文件才会更新,如果JWS没有从缓存的JNLP文件集中找到某些内容,则会抛出错误 .
我编写了一个手动生成JNLP文件的servlet . 我在我的servlet代码中使用以下头配置 .
response.setDateHeader("Last-Modified", lastModification);
// IE won't download JNLP file if Cache-Control header presents
//response.setHeader("Cache-Control", "no-cache, must-revalidate");
response.setHeader("Expires", "Mon, 26 Jul 1990 05:00:00 GMT");
这使得JNLP文件总是过时的,这应该在每次客户端通过JWS启动时触发重新检查文件 . 我甚至可以在XP上的缓存查看器中看到这个日期:
我've found a never resolving problem about this on Oracle'的bug报告网站:Bug ID: 6189106刚刚在Windows XP上测试了与Java7相同但这个问题仍然存在 . 但仅限于XP,因为部署缓存中的空格字符不是实际的解决方案,因为用户几乎不能写入其配置文件以外的位置 .
因为这个bug存在了这么长时间,我想应该有某种解决方法 . 我不想每次都告诉客户清除Java缓存并从Web重新安装应用程序 . 我们希望将来更快的发布周期,这将使其更加恶化 . 我希望有人对此有个好主意 . :|
2 回答
问题出在java webstart的cachedir的路径上 . 如果它包含空格(在XP中就是这种情况),则路径以错误的格式传递给javaws,这将阻止对jnlp文件的更新检查 .
在deployment.properties文件中更改此路径,如下所示:
deployment.user.cachedir = C \:\ your \ path - 此路径不应包含空格 .
附:之前清理java缓存 .
补充:问题似乎是在更新21之后出现的 .
我想出了各种各样的hacky解决方案:
在JNLP文件中放置一个版本号,将其作为参数传递给main方法(例如
<argument>1.0</argument>
) . 或者,您可以传递显式时间戳 .检查a)
java.version
或javawebstart.version
系统属性,以查看您的应用是否在1.6.0_22和1.7.0_2(含)之间的任何内容上运行; b)检查deployment.user.cachedir
系统属性,看它是否有空格 . 如果a)和b)都不是真的,那么继续执行下面的步骤可能没有意义,因为Java Web Start本应检查JNLP文件以进行更新 .启动时,在显示任何表单之前,将JNLP文件下载到内存中(例如,使用
new URL(jnlpUrlString).openStream()
等) . 我将JNLP文件的URL作为参数从JNLP文件本身传递到我的应用程序中,就像版本号一样 .检查JNLP文件以查看它是否包含传递给main方法的版本号(例如,对
"<argument>" + versionNumberPassedIntoMainMethod + "</argument>"
进行简单的字符串搜索) . 如果是,则're good, as you'重新运行最新版本 . 如果没有,继续:将JNLP文件保存在临时目录中(例如,使用
File.createTempFile(...)
) .让系统从临时目录中打开JNLP文件,例如如果你的目标是Java 1.6,请使用
java.awt.Desktop.getDesktop().open(jnlpFile)
.System.exit(0)
关闭应用程序的过时版本,让更新后的版本接管 .我还存储并检查注册表中的最后下载日期(使用
java.util.prefs.Preferences
)以防止多次下载或短时间重新打开 . 我的想法是减少我的代码中的错误的机会导致一些非常令人讨厌的事情,如无限循环的open-check-reopen-check-reopen-check等 . 我下载JNLP文件时超时,所以连接速度慢' t防止应用程序打开太久 . 但这些只是可选的额外内容 .由于我的应用程序使用
<security><all-permissions/><security/>
运行,因此下载JNLP文件,将其保存到计算机并使用默认程序打开它没有任何问题 . 有可能使用javax.jnlp库为每个步骤找到变通方法你没有确定这个也不太确定 .总的来说,这种方法似乎运作良好 . 但是我仍然希望有一天像这样的Java Web Start漏洞已成为过去,因为这种hacky废话真的不应该是必要的 .