通过 Web 启动 (jnlp) 的 JavaFX 桌面应用程序 - 不一致的行为

标签 java javafx desktop-application java-web-start jnlp

尝试通过 Java Web Start 部署我的 JavaFX 桌面应用程序时,我遇到了不一致的行为,特别是当它决定下载 jar 时。 我的代码已签名。

需要什么:

  • 100% 离线工作的桌面应用程序,但会在有互联网连接时检查更新。

  • 如果找到更新,询问用户是否要下载它。如果是,请更新并运行。如果不是,运行缓存版本。

  • 需要制作桌面图标。

目前计划发生的事情:

  • 首次运行时,Web 开始完美地下载和验证应用程序。
  • 已创建快捷方式并在 Windows 中出现在可以卸载的软件下。
  • 从 .jnlp 文件运行并连接互联网时,运行完美。
  • 当通过互联网(从未断开连接)从桌面运行时,运行完美。
  • 在没有互联网的情况下从桌面快捷方式运行时,大多数情况下都能完美运行。

计划外发生的事情:

  • 当互联网断开连接时,如果从 .jnlp 文件运行应用程序根本无法运行。控制台指示代码库不可用。根据我的说法,它应该检测到互联网丢失并从缓存中工作,但它没有。

  • 当离线运行(通过固有地运行带有 -offline 参数的 .jnlp 文件的快捷方式)至少一次,并且再次连接互联网并重新启动时,网络启动会要求用户确认软件需要现在上网。如果用户拒绝,则消息表明缺少所需的文件。程序现在将永远不会再次启动,除非重新运行 internet 并指示它可以联机。然后重新下载具有所有依赖项的整个应用程序。

  • 即使仍然处于离线状态,有时也会发生同样的情况。离线快捷方式运行一次并运行软件,然后控制台指示某些 jar 已失效。重新启动时会出现与上述相同的问题。

  • 如果第一次运行并安装并启动了软件,之后互联网很快断开连接,然后重新启动。软件不会离线运行,说明没有下载完所有资源。鉴于所有 jar 都设置为急切下载并且检查更新设置为“超时”,我认为没有理由这样做。

奇怪的是,Linux 和 Windows 之间似乎存在行为差异。虽然不完美,但它在 Linux 上似乎更加一致,离线快捷方式从不检查更新。而在 Windows 上,有时需要重新下载然后更新。

如果当前的部署不是这种不可预测的,那么当前的逻辑似乎是要更新应用程序,用户需要从 .jnlp 文件而不是快捷方式运行软件。

无论如何,抛开冗长的描述不谈,有人能在我的 .jnlp 文件中找到问题吗,如下所示?我真正想要的是在线和离线工作的快捷方式,在线时检查更新,但在没有对 jar 进行更改时不会丢失应用程序的缓存版本 - 并且不会不必要地重新下载软件。

<?xml version="1.0" encoding="utf-8"?>
<!-- JNLP File for example-->
<jnlp 
    spec="7.0+"  codebase="http://www.example.co.za/downloads/example"
    xmlns:jfx="http://javafx.com" 
    href="Example.jnlp">
    <information>
            <title>Example</title>
            <vendor>My Company</vendor>
        <homepage href="http://www.example.co.za/products" />
            <description>Example is an example application</description>
        <icon href="../shared/example_icon.png"/> 
            <icon kind="splash" href="../shared/example_splash.png" />
        <icon kind="shortcut" href="../shared/example_icon.png" />
        <shortcut online="false" install="true"> 
            <desktop/>
            <menu submenu="My Company"/>
        </shortcut>     
    <offline-allowed/>  </information> <security>  <all-permissions/> </security> <resources>
    <jfx:javafx-runtime version="8.0+" href="http://javadl.sun.com/webapps/download/GetFile/javafx-latest/windows-i586/javafx2.jnlp"/>
  </resources>
    <update check="timeout" policy="prompt-update"/>
  <resources>
    <j2se version="1.8+" java-vm-args="-Xms512m"/>
    <jar href="Example.jar" download="eager"/>
    <jar href="Dependency-1.jar" download="eager"/>
    <jar href="Dependency-2.jar" download="eager"/>
    <jar href="Dependency-3.jar" download="eager"/>
    ...

  </resources> 
<application-desc main-class="ExampleMain">
    <applet-desc  width="1024" height="768" main-class="com.javafx.main.NoJavaFXFallback"  name="Example Application" >
            <param name="requiredFXVersion" value="8.0+"/>
    </applet-desc>
    <jfx:javafx-desc  width="1024" height="768" main-class="ExampleMain"  name="Example Application" />     
<application-desc/>

</jnlp>

最佳答案

<application-desc/>应该是 </application-desc>

关于通过 Web 启动 (jnlp) 的 JavaFX 桌面应用程序 - 不一致的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28471698/

相关文章:

java - 如何在 Spring Boot 应用程序中配置 HikariCP 和 Dropwizard/Coda-Hale 指标

java - 如何在 javafx 的 imageView 中填充图像?

java - 在网络应用程序或桌面应用程序内的框架中重用 android 代码( native Java)

html - 在 Electron 应用程序中将 div 内容从浏览器窗口中移出

java - 最好在查询中使用 DISTINCT 进行过滤,或者在解析所述查询的结果时使用 java 的集合

java - 如何找出 renameTo() 失败的原因?

JavaFX WebView 不会显示

java - java for循环中的分支预测

java - JPA 桌面应用程序单个或多个 EntityManager 实例

java - 如何使用 ITextPDF 库替换 pdf 文件中的文本?