假设您有一个多组件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)。
你可以想象,这是一个严重的问题,因为一个重度模块化的应用程序或依赖第三方组件并链接到他们自己的JNLP的人将最终得到一个非常不友好的启动过程,可能会被要求点击通过大量的对话,然后才能启动他们的应用程序。
为什么?
答案 0 :(得分:3)
我直接发布了自己的答案,因为经过数周的疑惑,为什么会发生这种情况,我们终于找到了引发这种行为的一件事。请随时发表您自己的答案以添加到讨论中。
从Java SE 7 Update 21开始,启动JNLP时,Web Start启动程序将在主机名中使用大写和小写字母处理不同的远程服务器。
因此,使用以下备用拼写启动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假设主机名因此(强调我的):
“名称”(网络名称,主机名,网关名称或域名名称)是文本字符串 从字母表(A-Z),数字(0-9),减去24个字符 sign( - )和period(。)。请注意,只有在允许的时间段内才允许使用 它们用于划分“域样式名称”的组件。 (看到 RFC-921,“域名系统实施时间表”,用于 背景)。不允许空格或空格字符作为a的一部分 名称。 大小写之间没有区别。第一个 字符必须是字母字符。最后一个角色一定不是 减号或期间。作为GATEWAY的主机应该有 “-GATEWAY”或“-GW”作为其名称的一部分。不服务的主机 互联网网关不应使用“-GATEWAY”和“-GW”作为其中一部分 他们的名字。作为TAC的主机应该具有“-TAC”作为最后一个 部分主机名,如果是DoD主机。单个字符名称 或者不允许使用昵称。
如果您的系统出于某种原因需要大写字符,那么它就会出错;不幸的是,截至1.7.0_21,就像Web Start一样。
请注意,我目前还没有看到并且不知道Oracle数据库中的错误报告,并且此问题的信号在线看起来相当低,因此其他条件可能会触发此行为。我还没有找到一个简单的测试用例。