0

我有一个使用 Eclipse 编写的 Java WebStart (javaws) 应用程序。我已经导出并签署了所有 jar,编写了 .jnlp 文件等等。

以下是为简洁起见删除了一些操作系统资源的缩写 jnlp 文件:

<?xml version="1.0" encoding="utf-8"?>
<jnlp spec="1.5+"
    codebase="http://www.foobarx.com/"
    href="fhr.jnlp">
    <information>
        <title>Foo Bar</title>
        <vendor>foobarx.com</vendor>
        <homepage href="http://www.foobarx.com" />
        <description>Java App</description>
        <icon href="daffodils.jpg" kind="splash"/>
    </information>

    <security>
        <all-permissions />
    </security>

    <resources>
        <jar href="fhr.jar" />
    </resources>

    <resources os="Windows" arch="x86_64">
        <jar href="swt-4.2.2-win32-win32-x86_64.jar" />
    </resources>

    <resources os="Windows" arch="x86">
        <nativelib href="swt-4.2.2-win32-win32-x86.jar" />
    </resources>

    <resources os="Linux" arch="amd64">
        <nativelib href="swt-4.2-gtk-linux-x86_64.jar" />
    </resources>

    <application-desc main-class="com.foobarx.client.FBXApplication" />
</jnlp>

我可以在 Linux 或 Windows XP 32 位中从我的浏览器加载该应用程序,并且它可以完美运行。但是当我尝试从 Windows 7 64 位加载应用程序时,出现以下错误:

java.lang.NoClassDefFoundError: org/eclipse/swt/events/DisposeListener

在 64 位 Windows 7 机器上运行 32 位 JVM,因为浏览器是 32 位的,显然这就是它的完成方式。

当我在 Win7/64 上运行它时,Java 找不到 SWT 方法,尽管它确实加载了正确的 SWT 库文件,我已经验证了这一点。

manifest文件是Eclipse生成的,基本上是空的。我尝试通过键入一个点在类路径中添加当前工作目录,但这并没有改变任何东西。

综上所述,我有一个托管在远程服务器上的 Java Webstart 应用程序。我可以从 Linux 或 Windows XP 32 位浏览器中启动它。如果我尝试使用 32 位 JVM 从 Firefox 或 IE 的 Windows 7 Pro 64 位启动它,我会收到 NoClassDefFound 错误。有问题的类是 SWT 库中的一个类。

问题:

有没有人遇到过这种特定类型的部署问题,或者知道下一步该去哪里?

任何/所有帮助表示赞赏。

4

2 回答 2

1

这个问题可能是由不正确/不完整的清单文件引起的吗?

我认为它是由清单中提到的 SWT jar 引起的。清单的 Class-Path 中提到的任何内容都将提供给每个应用程序,无论是 32/64 位。

提供 2 个 jar 会混淆类加载器,它可能会尝试从包含它的类路径上的第一个 Jar 加载方法。

resource而是在 JNLP 中由体系结构描述的部分中引用 SWT Jars 。这样,每个架构将只提供它实际需要的 jars(它们将被添加到运行时类路径中)。

于 2013-09-02T14:42:22.363 回答
0

jnlp 文件将特定于操作系统的资源信息存储在资源标记中,如下所示:

<resources os="Windows" arch="x86_64">
    <jar href="swt-4.2.2-win32-win32-x86_64.jar" />
</resources>

os 和 arch 属性一起告诉 javaws 哪些文件包含特定于其平台的资源。在我原来的 jnlp 文件中,指向 os-specfic 资源的 href 位于名为“nativelib”的标记中。这适用于除 Windows 64 位之外的所有平台。当我将标签的名称更改为“jar”而不是“nativelib”时,它适用于 Win64。我还不确定什么是正确的方法。为了安全起见,我可以在所有平台上同时使用“nativelib”和“jar”。

于 2013-09-03T20:43:54.477 回答