JNLP下载过程中出现FileNotFoundException

3

我已经寻找了数周的解决方案,但没有找到任何与我的问题相关的东西/或者我已经尝试了所有建议的解决方案,但都没有成功。

我有一个JNLP文件,它被javaws正确地下载(我想),但在启动之前,它抱怨在/tmp目录中找不到一些文件。确切的错误消息是:

CouldNotLoadArgumentException[ Could not load file/URL specified: /tmp/tmp_cache8259898691262575141.tmp]
at com.sun.javaws.Main.launchApp(Unknown Source)
at com.sun.javaws.Main.continueInSecureThread(Unknown Source)
at com.sun.javaws.Main.access$000(Unknown Source)
at com.sun.javaws.Main$1.run(Unknown Source)
at java.lang.Thread.run(Thread.java:745)
Caused by: java.io.FileNotFoundException: /tmp/tmp_cache8259898691262575141.tmp (Nincs ilyen fájl vagy könyvtár)
    at java.io.FileInputStream.open0(Native Method)
    at java.io.FileInputStream.open(FileInputStream.java:195)
    at java.io.FileInputStream.<init>(FileInputStream.java:138)
    at java.io.FileInputStream.<init>(FileInputStream.java:93)
    at com.sun.javaws.jnl.LaunchDescFactory.buildDescriptor(Unknown Source)
    ... 5 more

我检查了/tmp文件夹,当然存在并且可写。有趣的是,在下载期间tmp_cacheNNNNNN.tmp 文件也在那里出现了!它们会随着下载进度一次一个地出现。但是,当下载完成时,某个东西(javaws?)会将其全部删除,然后开始抱怨找不到它们。
我已经打开了JNLP缓存(打算在本地缓存),我尝试了JRE 1.8.0_401.8.0_651.8.0_66,所有版本都有相同的结果。在Windows和Linux都是相同的,都会抱怨在临时文件夹中缺少文件。 我最后成功启动的JRE是1.8.0_25,似乎可以与1.8.0_72(测试版)配合使用。但是下载的JAR文件仍未被缓存! (如果我打开jcontrol应用程序并查看缓存,JAR文件不在那里,而我也不知道为什么)。
我的JNLP如下所示:
<?xml version="1.0" encoding="utf-8"?>

<jnlp spec="7.0+"
      codebase="http://localhost:8080/jbaf-server/jnlp/swing-client"
      href="http://localhost:8080/jbaf-server/clientDownload/client.jnlp" >
    <information>
        <title>Swing Client</title>
        <vendor>www.xy.z</vendor>
        <description>Swing Client</description>
        <description kind="short">Swing Client</description>
        <homepage href="www.xy.z"></homepage>

        <icon href="images/jnlp-icon.png"/>
        <icon kind="splash" href="images/jnlp-splash.png"/>

        <offline-allowed/>

    </information>
    <security>
        <all-permissions/>
    </security>
    <resources>
        <j2se version="1.8+" initial-heap-size="256m" max-heap-size="1024m"/>


    <property name="jnlp.versionEnabled" value="true" />
    <jar href="jbaf-swing-client.jar" version="0.3.0" main="true"/>
.... (lots of jar files)
    <jar href="spring-expression.jar" version="4.2.3.RELEASE"/>
    <jar href="spring-tx.jar" version="4.2.3.RELEASE"/>
    <jar href="commons-codec.jar" version="1.10"/>


    </resources>
    <application-desc main-class="org.jbaf.swingclient.Main">
        <argument>http://localhost:8080/jbaf-server</argument>
        <argument>false</argument>
    </application-desc>
</jnlp>

JAR文件使用自签名证书进行签名。

我不知道为什么会出现这种情况。有人遇到过这样的问题吗?


你看过这些日志了吗? - assylias
是的,我尝试过了,但由于此错误发生在下载阶段,因此没有日志,Java控制台尚未打开,尽管我将跟踪级别设置为ALL,也没有生成日志文件。下载进度到达末尾,然后立即出现错误对话框“无法启动应用程序”,其中包含上面给出的堆栈跟踪信息。 - user1536873
好的,我成功打开了跟踪功能。但是我没有发现任何错误。javaws下载文件,然后在/tmp目录中使用下载的jnlp文件参数生成一个新的JRE进程。然后javaws退出,但是新的JRE找不到文件。似乎在退出时javaws删除了临时文件,因为它标记了用“deleteOnExit”创建的文件。似乎JVM在启动新的JVM之前就退出了。使用1.8.0_72(BETA!)不会发生这种情况,似乎它在退出之前等待足够长的时间。即使我使用-import开关启动javaws,它也不保存到缓存。 - user1536873
如果它在一个版本上能够正常工作但在另一个版本上出现问题,您可能需要在OpenJDK上报告错误。 - assylias
可能与此相关:https://bugs.openjdk.java.net/browse/JDK-8069161 - Java 8中的回溯目标为更新72,这与您的观察相符:https://bugs.openjdk.java.net/browse/JDK-8140130。 - assylias
1
谢谢提供这些链接,但它们与缓存性能慢有关。使用JDK 1.8.0_72(BETA)版本,应用程序从缓存启动的速度比以前的版本(包括最新的正式发布u66)快得多。 - user1536873
1个回答

3

终于我成功找到了问题所在!

问题是由Tomcat设置的以下HTTP头引起的:

我没有在Servlets中设置这些头信息,但似乎之前添加了一些过滤器以致于它们被设置。我将这些头信息的值设置为空字符串"",JDK开始缓存我的文件,应用程序最终成功启动!

然而,如果您将Cache-Control设置为no-cache,JDK仍然无法启动应用程序。文件会保存到系统/用户临时目录,但之后不会启动,因为临时文件已被删除。这只适用于JDK 1.8.0_72(BETA),所有先前版本都失败了!

长话短说:如果您在JNLP中遇到问题,WebStart告诉您找不到临时目录中的文件,请检查您的HTTP响应头!


你为什么将它设置为空字符串?这是通过试错发现的吗?(如果这些标题为空,是否有定义行为应该发生什么?) - StackzOfZtuff
我将其设置为空字符串,因为在此之前容器或某些过滤器已经设置了HTTP头部,无法将其删除。 - user1536873

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接