【问题标题】:When both 64/32-bit JVM versions are installed, how does a JNLP application pick the (correct bit-ness) version of the JVM?当安装了 64/32 位 JVM 版本时,JNLP 应用程序如何选择 JVM 的(正确位数)版本?
【发布时间】:2018-10-08 19:59:42
【问题描述】:

因为我在 64 位和 32 位环境中都开发 Java 应用程序,所以我在我的开发环境中维护这两个 Java VM。我开发的一个 JNLP 应用程序必须在 32 位环境中运行,因为它调用了一个需要 32 位环境的 dll。

在大多数情况下,JNLP 似乎确实“知道”它需要在 32 位环境中运行,但我怀疑我只是走运了。当我将我的 64 位 Java 升级到版本 10 时,它导致 JNLP 失败,因为 JNLP 试图在 64 位环境中运行。当我将64位环境恢复到1.8版本(和32位环境相同的版本,应用又开始在32位环境下运行了。

但是它怎么知道要这样做呢?如果 Java 版本相同,JNLP 应用程序是否有一些属性导致它默认为 32 位环境?

有没有办法通过在环境中设置某些内容或在构建时指定特定的 JRE 库来保证 JNLP 将在 32 位环境中运行?

【问题讨论】:

    标签: java 64-bit 32bit-64bit jnlp


    【解决方案1】:

    有没有办法通过在环境中设置某些内容或在构建时指定特定的 JRE 库来保证 JNLP 将在 32 位环境中运行?

    简短的回答显然是:不。


    以下解释了您指定要在 JNLP 规范文件中使用的版本的方式:

    您应该能够通过指定 32 位架构的资源来强制选择 32 位 JVM;例如

      <resources os="Linux" arch="x86">
        <nativelib href="lwjgl-x86-linux.jar"/>
      </resources>
      <resources os="Linux" arch="i386">
        <nativelib href="lwjgl-x86-linux.jar"/>
      </resources>
    

    (出于开发/测试目的,您可以使用省略 64 位资源的开发 JNLP 文件...)

    但是,正如您所发现的,如果 JNLP 客户端将使用 64 位 JVM(如果可用),这将无济于事……然后抱怨缺少 64 位资源。

    可以修改 JNLP 客户端/启动器做出选择的方式。但是,这取决于您使用的启动器;例如这可能取决于您使用的 Java 插件,以及您是否可以将其配置为使用特定的 JRE。

    事实证明,一些 JNLP 客户端决定使用 32 位还是 64 位 JRE 的方式存在已知错误/不一致。

    但是,JNLP 和 JavaWebstart 是 deprecated in Java 9 onwards,因此您可能应该寻找替代方案。特别是如果您/您的客户不打算为 Oracle Java 商业支持付费。

    【讨论】:

    • 不幸的是,它现在抛出一个错误。我输入了以下内容:
    • 我得到这个错误:没有为这个平台指定应用程序资源。请联系应用程序供应商以确保这是受支持的平台
    • 好的。因此,这不会导致 JNLP 客户端选择特定的 JRE。在这种情况下,唯一的选择是配置您平台的 JNLP 客户端……如果可能的话。 (这实际上是有道理的。如果 JNLP 规范文件可能导致使用不同的 JRE ......在用户不知情的情况下,这是一个潜在的安全问题。)
    • 显然,这是一个已知的错误。至少迟到 1.7(尽管我正在运行 1.8)。 bugs.openjdk.java.net/browse/JDK-8029922
    【解决方案2】:

    经过大量实验,我发现如下。

    首先,修改 JNLP 安装的 XML 中的 Resources 元素以接受特定架构(例如 x86)似乎不起作用,实际上会引发错误。

    其次,安装任何大于 1.8 的 jvm 都会导致 JNLP 使用该 JVM。由于 Oracle 不支持 1.8 之后的 32 位 JVM,这意味着 JNLP 应用程序将在 64 位环境中运行。显然,JNLP 将在可用的最新版本上运行。至少 Java 在我的机器上的行为似乎表明了这一点。

    第三,如此处所述,bugs.openjdk.java.net/browse/JDK-8029922,如果您在同一台机器上同时运行 32 位和 64 位 jvm,那么安装这些 jvm 的顺序很重要。为确保 JNLP 应用程序选择 32 位 jvm,您需要安装该版本的 java 第二个。换句话说,无论 jvm 的位数如何,JNLP 显然都会运行安装的最后一个版本的 java,除非首先安装的 JVM 是更高版本的 java。然后,以后的版本是运行 JNLP 的版本。

    由于 Oracle 在 1.8 版本之后似乎不再支持 32 位版本的 java,这意味着如果您需要 JNLP 在 32 位环境中运行,您必须安装 java 版本 1.8 或更早版本才能实现。

    由于 Webstart 和 JNLP 已被弃用,正如上面的问题回答者所建议的那样,是时候考虑部署 Webstart 以外的 Java 应用程序的不同技术了。

    【讨论】:

      猜你喜欢
      • 2011-04-25
      • 2016-03-07
      • 1970-01-01
      • 2012-03-19
      • 2011-05-23
      • 1970-01-01
      • 2011-07-03
      • 2011-06-02
      • 2011-06-26
      相关资源
      最近更新 更多