Java Web Start应用程序无法从快捷方式更新

我使用Java Web Start部署了一个Java(FX)桌面应用程序。 更新工作正常,但只有当我手动运行下载的JNLP时,它们才能从安装到桌面和菜单的快捷方式中运行。

这是我的JNLP:

   Companyapp Media Citizens Companyapp Presentation Desktop                                      

以防万一,这是我的程序中安装快捷方式的部分:

 // install shortcuts try { IntegrationService is = null; try { is = (IntegrationService) ServiceManager.lookup("javax.jnlp.IntegrationService"); } catch (UnavailableServiceException use) { throw new ApplicationError(use.getLocalizedMessage()); } if (!is.hasDesktopShortcut()) { if (!is.requestShortcut(true, true, "Companyapp")) { throw new ApplicationError("Integration failed."); } } else { //initialController.dialog("Shortcuts exist", "Go away!", null); } } catch (ApplicationError e) { initialController.dialog("Failed to integrate a shortcut on your computer.\nCause: " + e.getLocalizedMessage(), "I understand", null); } 

更新1

我删除了 ,现在它从快捷方式更新,但我无法启动应用程序脱机。 显然我应该能够? 它给了我这个错误:

在此处输入图像描述

公平地说,我确实尝试在启动时连接到服务器,但这不会导致此错误:它有2秒的超时,看起来像这样:

 try { isOffline = !(InetAddress.getByName(Config.domain + "." + Config.serverDomain).isReachable(2000)); } catch (IOException e) { e.printStackTrace(); } 

无论如何,我的代码没有在错误中被引用,所以我想如果我没有我根本无法在线下运行应用程序? 这是真的? 如果是的话,这对于使用JWS进行部署来说是一个巨大的问题,我可能只是完全放弃了……


更新2

我想我可能会这样: http : //bugs.sun.com/bugdatabase/view_bug.do ? bug_id=7121086任何人都知道一个解决方法?

在它说的错误

获取用作扩展名的每个jnlp的rif。 意思是混合在一起。 在这种情况下工作

所以我应该将JavaFX作为jar混合到我的JNLP中?

我设法在不删除情况下解决了问题,这里是JNLP:

    Companyapp Media Citizens Companyapp Presentation Desktop                                     

要确保服务器正确处理更新,请为Apache安装mod_expires并将此.htaccess放在JNLP和JAR所在的文件夹中:

 DirectoryIndex index.html AddType application/x-java-jnlp-file .jnlp AddType application/x-java-archive .jar AddType application/x-java-archive-diff .jardiff  ExpiresActive On ExpiresDefault "modification"  

是什么导致它无法正常工作?更新的jnlp是什么让它起作用?

问题出在JNLP标记中:

快捷方式容器具有以下属性:online =“false”。

这会导致配置桌面快捷方式,以便它使用-offline参数运行javaws,以便它与缓存的jnlp一起运行。

当您更正服务器上的jnlp时,问题仍然存在,因为本地缓存仍然使用缓存的jnlp。

最好的解决方案是指示用户再次从浏览器启动应用程序,因为这将导致javaws将客户端上的快捷方式更新为正确的参数设置 – 假设您已在服务器上修复了jnlp。

实际上没有理由指定这个属性,因为默认值是“true”,这会导致预期的行为,但是网络上有jnlp标记,它将其设置为false。 此外,几乎没有关于此属性的文档,这使问题变得更糟。

从JNLP文件中删除

如果指定了offline-allowed,则可以通过Java Application Cache Viewer离线启动应用程序,并可以创建启动应用程序脱机的快​​捷方式。

如果应用程序脱机启动,则不会检查更新,API调用BasicService.isOffline()将返回true。

offline-allowed元素还控制Java Web Start检查应用程序更新的方式。 如果未指定元素 – 即,应用程序需要在线运行 – Java Web Start将始终在启动应用程序之前检查更新的版本。 如果找到更新,将下载并启动新应用程序。 因此,保证用户始终运行最新版本的应用程序。 但是,该应用程序必须在线运行。

如果指定了offline-allowed,则Java Web Start还将检查是否有可用的更新。 但是,如果已经下载了应用程序,则检查将在几秒钟后超时,在这种情况下,将启动缓存的应用程序。 如果服务器连接速度相当快,通常会运行最新版本的应用程序,但不能保证。 但是,该应用程序可以脱机运行。

资料来源: http : //docs.oracle.com/javase/1.5.0/docs/guide/javaws/developersguide/syntax.html

即使按照所有建议,这个问题仍然存在(在Windows上使用Java 8运行时)。

我通过确保为JNLP文件提供服务的Web服务器添加Last-Modified标头来解决这个问题。 (我使用了一个嵌入式Jetty实例,显然Jetty的ResourceHandler没有这样做)。 我还为jnlp添加了过去的失效日期,但我不确定是否有必要。

我的旧答案可能会帮助一些:我也将更新标记放在安全标记之后,如此建议JNLP即使存在update =“always”policy =“always”也不会更新

这样做之后,这个问题暂时似乎暂时消失了。

我有这个问题只是因为我没有让应用程序打开时间足以完成更新。

如果您有这个选项:在JNLP中更新check =“background” ,请在关闭应用程序之前等待一段时间,以便完成更新(在后台运行)。