JNLP 下载期间出现 FileNotFoundException
FileNotFoundException during JNLP download
几周来我一直在寻找这个问题的解决方案,但没有找到任何与我的问题真正相关的东西/或者我已经尝试了所有建议的解决方案,但没有任何成功。
我有一个 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[=10=]0(Unknown Source)
at com.sun.javaws.Main.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_40
、1.8.0_65
、1.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 使用自签名证书签名。
我不知道为什么会这样。有人遇到过这样的问题吗?
终于找到问题了!
这是由 Tomcat 设置的以下 HTTP headers 引起的:
我没有在我的 Servlet 中设置这些 header,但这些似乎是之前由某些过滤器添加的。我将这些 header 值设置为 ""
(空字符串),然后 JDK 开始缓存我的文件,应用程序终于启动了 OK!
但是,如果将Cache-Control
设置为no-cache
,JDK仍然无法启动应用程序。文件保存到 System/User 临时目录,但之后它不会启动,因为临时文件已被删除。这只适用于 JDK 1.8.0_72 (BETA),所有以前的版本都失败了!
长话短说: 如果您的 JNLP 有问题,WebStart 告诉您在临时目录中找不到文件,请检查您的 HTTP 响应 Headers!
几周来我一直在寻找这个问题的解决方案,但没有找到任何与我的问题真正相关的东西/或者我已经尝试了所有建议的解决方案,但没有任何成功。
我有一个 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[=10=]0(Unknown Source)
at com.sun.javaws.Main.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_40
、1.8.0_65
、1.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 使用自签名证书签名。
我不知道为什么会这样。有人遇到过这样的问题吗?
终于找到问题了!
这是由 Tomcat 设置的以下 HTTP headers 引起的:
我没有在我的 Servlet 中设置这些 header,但这些似乎是之前由某些过滤器添加的。我将这些 header 值设置为 ""
(空字符串),然后 JDK 开始缓存我的文件,应用程序终于启动了 OK!
但是,如果将Cache-Control
设置为no-cache
,JDK仍然无法启动应用程序。文件保存到 System/User 临时目录,但之后它不会启动,因为临时文件已被删除。这只适用于 JDK 1.8.0_72 (BETA),所有以前的版本都失败了!
长话短说: 如果您的 JNLP 有问题,WebStart 告诉您在临时目录中找不到文件,请检查您的 HTTP 响应 Headers!