因为我在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位环境中运行?
答案 0 :(得分:1)
有没有办法通过在环境中设置内容或在构建时指定特定的JRE库来保证JNLP在32位环境中运行?
简短的答案显然是:否。
以下说明指定在JNLP规范文件中使用的版本的方式:
您应该能够通过仅指定32位架构的资源来强制选择32位JVM; e.g。
<resources os="Linux" arch="x86">
<nativelib href="lwjgl-x86-linux.jar"/>
</resources>
<resources os="Linux" arch="i386">
<nativelib href="lwjgl-x86-linux.jar"/>
</resources>
(出于开发/测试的目的,您可以使用开发JNLP文件,而不会遗漏64位资源......)
但是,正如您所发现的那样,如果JNLP客户端将使用64位JVM(如果可用),则无效...然后会抱怨缺少64位资源。
可以修改JNLP客户端/启动器做出选择的方式。但是,这取决于您使用的发射器;例如它可能取决于您使用的Java插件,以及您是否可以将其配置为使用特定的JRE。
事实证明,某些JNLP客户端决定是使用32位还是64位JRE的方式存在已知的错误/不一致。
但是,JNLP和JavaWebstart是deprecated in Java 9 onwards,所以你应该寻找替代方案。特别是如果您/您的客户不打算为Oracle Java商业支持付费。
答案 1 :(得分:0)
经过广泛的实验,我发现了以下内容。
首先,修改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 second。换句话说,无论jvm的位数如何,JNLP都可以运行最后一个版本的java,除非首先安装JVM,否则它是java的更高版本。然后,后来的版本是JNLP运行的版本。
由于Oracle在版本1.8之后似乎不再支持32位版本的Java,因此暗示如果您需要在32位环境中运行JNLP,则必须安装Java版本1.8或更早版本才能实现此目的。
由于Webstart和JNLP已弃用,正如上面的问题回答者所说,是时候考虑使用不同的技术来部署除Webstart之外的Java应用程序了。