无法在Windows 64位上部署SWT WebStart应用程序

时间:2013-09-02 14:24:20

标签: java windows eclipse swt java-web-start

我有一个使用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库文件。

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

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

问题:

是否有人遇到过这种特定类型的部署问题,或者想知道接下来要去哪看?

任何/所有帮助表示感谢。

2 个答案:

答案 0 :(得分:1)

  

此问题可能是由于错误/不完整的清单文件引起的吗?

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

提供2个jar会让类加载器感到困惑,它可能会尝试从包含它的类路径的第一个Jar加载方法。

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

答案 1 :(得分: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”。