1

假设您有一个多组件 Java Web Start 应用程序,它由一个引用您的主应用程序 JAR 的 JNLP 和多个其他 JNLP 作为component-desc.

出于某种原因,从 1.7.0_21 版本(Java SE 7 Update 21)开始,Web Start 似乎会提示用户对所有这些(主 JAR - 或主 JNLP - 以及作为component-desc条目列出的所有 JNLP)的安装请求,而以前版本的 Web Start 似乎只提示用户安装主要组件(包含“主要”JAR 的顶级 JNLP)。

可以想象,这是一个严重的问题,因为高度模块化的应用程序或依赖 3rd 方组件并链接到他们自己的 JNLP 的应用程序最终会导致用户的启动过程非常不友好,可能会要求他们点击很多在能够启动他们的应用程序之前的对话框。

这是为什么?

4

1 回答 1

3

我直接发布了我自己的答案,因为经过数周想知道为什么会发生这种情况后,我们终于弄清楚了引发这种行为的一件事。请随时发布您自己的答案以添加到讨论中。

根本原因

从 Java SE 7 Update 21 开始,Web Start 启动器在启动 JNLP 时将在其主机名中使用大写和小写字母来处理不同的远程服务器。

因此,使用以下替代拼写启动 JNLP 将触发不同的行为:

  • [EVIL]使用大写将触发问题中提到的行为(例如http://MYDOMAIN.COM/webapp/webstart.jnlp

  • [GOOD]使用小写字母将按预期和预期工作(例如http://maydomain.com/webapp/webstart.jnlp

注意: 1.7.0_21 的发行说明没有解释这背后的原因。

解决方案

在链接将通过 Web Start 通过 JNLP 协议加载的资源时,不要使用大写字符。

如果您的系统使用大写主机名(出于任何原因,这可能不是一个有效的主机名 - 请参阅下面的下一节),那么在调用 Web Start 启动器或构建它将用于启动的 URL 之前将它们转换为小写。

主机名不区分大小写

需要注意的是,RFC952因此假设主机名(强调我的)

“名称”(网络、主机、网关或域名)是由字母 (AZ)、数字 (0-9)、减号 (-) 和句点 (.) 组成的最多 24 个字符的文本字符串。 请注意,仅当它们用于分隔“域名样式名称”的组成部分时才允许使用句点。(有关背景信息,请参阅 RFC-921,“域名系统实施时间表”)。不允许将空格或空格字符作为名称的一部分。不区分大小写。 第一个字符必须是字母字符。最后一个字符不能是减号或句点。用作网关的主机应将“-GATEWAY”或“-GW”作为其名称的一部分。不作为 Internet 网关的主机不应使用“-GATEWAY”和“-GW”作为其名称的一部分。如果主机是 DoD 主机,则作为 TAC 的主机应将“-TAC”作为其主机名的最后一部分。不允许使用单个字符的名称或昵称。

如果您的系统出于某种原因需要大写字符,则说明它做错了;不幸的是,从 1.7.0_21 开始,Web Start 也是如此。


请注意,我目前还没有看到并且不知道 Oracle 数据库中的错误报告,并且此问题的信号在网上似乎相当低,因此其他情况可能会触发此行为。我还没有制定出一个简单的测试用例。

于 2013-08-12T15:25:11.590 回答