【问题标题】:Applet served by Java Web Start, resources requested to WEB Server before look in the JAR filesJava Web Start 服务的 Applet,在查看 JAR 文件之前向 WEB 服务器请求资源
【发布时间】:2011-01-21 09:49:10
【问题描述】:

我是新来的,对于我的英语不好,我深表歉意。

我对 Java Web Start 技术提供的 Applet 类有一点问题。我有一些 Web Start 正确下载的依赖于平台的 JAR 文件,但是当我通过 ClassLoader 对象的 getResourceAsStream(String fileName) 方法获取内容时,首先向 WEB 服务器发出 fileName 的 GET 请求,然后收到 404 Not Found响应,资源从 JAR 文件中正确加载。问题是我在JAR中有很多文件,所以我在WEB服务器上有很多不必要的负载,因此我必须等待很长时间才能使用Applet。

在谷歌上搜索我发现了一些讨论,据说添加参数codebase_lookup 和值false,但这并没有解决问题。 This page,与 codebase_lookup 参数相关,表示 Applet 的默认行为是从 JAR 文件加载资源,然后从 Applet 代码库加载资源,在我的情况下,行为是相反的。

我还在.jnlp 文件中为每个JAR 资源添加了eager="true" 属性,但行为始终相同。 Applet 是使用 NetBeans 开发和构建的,生成的 html 和 jnlp 文件如下。

launch.html

<applet width="300" height="300">
        <param name="jnlp_href" value="launch.jnlp"/>
        <param name="codebase_lookup" value="false"/>
</applet>


launch.jnlp

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<jnlp codebase="http://192.168.23.4/contact" href="launch.jnlp" spec="1.0+">
<information>
    <title>ContactNR</title>
    <vendor>Roberto Santini</vendor>
    <homepage href=""/>
    <description>ContactNR</description>
    <description kind="short">ContactNR</description>
</information>
<resources>
<j2se version="1.5+"/>
<jar eager="true" href="ContactNR.jar" main="true"/>
<jar eager="true" href="lib/VDK.jar"/>
<security>
    <all-permissions/>
</security>
</resources>
<resources arch="amd64" os="Linux">
    <jar eager="true" href="lib/liblinux64.jar"/>
</resources>
<resources arch="x86_64" os="Linux">
    <jar eager="true" href="lib/liblinux64.jar"/>
</resources>
<resources arch="x86" os="Linux">
    <jar eager="true" href="lib/liblinux.jar"/>
</resources>
<resources arch="i386" os="Linux">
    <jar eager="true" href="lib/liblinux.jar"/>
</resources>
<resources os="Windows">
    <jar eager="true" href="lib/libwin.jar"/>
</resources>
<resources os="MacOs">
    <jar eager="true" href="lib/libmac.jar"/>
</resources>
<applet-desc height="300" main-class="com.netresults.voip.ContactNR" name="ContactNR" width="300">
    <param name="codebase_lookup" value="false"/>
</applet-desc>
</jnlp>

有人可以帮助我吗? 非常感谢,

罗伯托。

【问题讨论】:

  • 哪个 Java 版本,哪个浏览器? codebase_lookup=false 在 IE7 / Java 插件 2 上为我工作
  • 如果您打开 Java 控制台并将日志级别设置为最高级别(在控制台窗口中按“5”),您将看到触发 404 的 URL。这应该有助于弄清楚是什么正在发出无效请求。根据我的经验,这通常是由 log4j 和 commons 日志记录框架扫描配置文件的类路径引起的。
  • 上面显示的 JNLP 文件是格式错误的 XML。 尝试验证不工作的应用程序。在 JaNeLA (pscode.org/janela) 中避免 GI/GO 因素。
  • 这可能与问题有关:stackoverflow.com/questions/5770807/…

标签: java jar applet classloader java-web-start


【解决方案1】:

我通过向 JAR 文件添加索引解决了这个问题。 构建 jar 后,运行命令:

JAR -i <path/to/jar-file>

它必须作为独立于实际 JAR-ing 的步骤运行。

说明: 当启动进程在 META-INF 中遇到 INDEX.LIST 时,它会信任它,并且不会去服务器上查找文件。

【讨论】:

【解决方案2】:

我最近在 log4j 通过 GET 查询丢失的资源时遇到了类似的问题。在您的情况下,也许基于 Web 的类路径仍然比捆绑的 jar 具有一定的优先级? 好吧,您可以尝试将所有罐子打包成一个。这当然会使构建复杂化,但您可以手动尝试一次以查看问题是否消失。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-25
    • 1970-01-01
    • 2012-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多