当安装了 64/32 位 JVM 版本时,JNLP 应用程序如何选择 JVM 的(正确的位数)版本?

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 位环境中开发 Java 应用程序,所以我在我的开发环境中维护了两个 Java 虚拟机。我开发的 JNLP 应用程序必须 运行 在 32 位环境中,因为它调用了一个需要 32 位环境的 dll。

大多数时候 JNLP 似乎 "know" 它需要 运行 在 32 位环境中,但我怀疑我只是很幸运。当我将我的 64 位 Java 升级到版本 10 时,它导致 JNLP 失败,因为 JNLP 试图在 64 位环境中 运行。当我将 64 位环境恢复到 1.8 版本时(与 32 位环境相同的版本,应用程序再次在 32 位环境中启动 运行ning。

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

有没有一种方法可以保证 JNLP 在 32 位环境中 运行 通过在环境中设置某些东西或在我构建时指定特定的 JRE 库?

Is there a way to guarantee that the JNLP will run in a 32 bit environment by setting something in the environment or specifying a particular JRE library when I do my build?

简短的回答显然是:不。


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

  • How to distinguish 32 bit from 64 bit java version in jnlp files.

您应该能够通过指定 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 是 ,因此您可能应该寻找替代方案。特别是如果您/您的客户不打算为 Oracle Java 商业支持付费。

经过广泛的实验,我发现了以下内容。

首先,修改 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,那么顺序你安装这些 jvms 很重要。为确保 JNLP 应用程序选择 32 位 jvm,您需要安装 java 第二个版本。换句话说,JNLP 显然 运行 安装了最新版本的 java 而不管 jvm 的位数,除非首先安装的 JVM 是 java 的更高版本。然后,后来的版本是其中包含 JNLP 运行 的版本。

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

由于 Webstart 和 JNLP 已被弃用,正如上面的问题回答者所建议的,是时候考虑使用 Webstart 以外的其他技术来部署 java 应用程序了。