Swing应用程序在Apple Java更新1.6.0_51之后停滞不前

时间:2013-06-20 09:52:32

标签: java macos swing locking java-web-start

我们有一个Java Swing客户端应用程序。它作为Java Web Start applet和install4j安装程序安装 自Apple发布最新的Java 6升级版以来,我们的应用程序在安装程序和Web Start版本上都显示Login Dialog后立即卡住。我们禁用了对话框,应用程序在启动后仍然卡住了。我们还试图使用不同的外观和感觉,因为有一些报道说这解决了这个问题,但没有帮助。
我们目前怀疑这是这个版本的JRE中某种与Swing相关的错误 我们在Oracle的1.7.0_25 JRE上没有这个问题。

我们知道此次更新导致了很多问题,是否有人找到了解决此问题的方法?

以下是EDT线程堆栈跟踪的最后一部分:

"AWT-EventQueue-1" prio=8 tid=000000002a1abc00 nid=0xb1d3f000 in Object.wait() [00000000b1d3d000]
   java.lang.Thread.State: WAITING (on object monitor)
    at java.lang.Object.wait(Native Method)
    at java.lang.Object.wait(Object.java:485)
    at java.awt.EventQueue.getNextEvent(EventQueue.java:558)
    - locked <000000000686af80> (a java.awt.EventQueue)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:263)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:211)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:205)
    at java.awt.Dialog$1.run(Dialog.java:1049)
    at java.awt.Dialog$3.run(Dialog.java:1101)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.awt.Dialog.show(Dialog.java:1099)
    at java.awt.Component.show(Component.java:1615)
    at java.awt.Component.setVisible(Component.java:1567)
    at java.awt.Window.setVisible(Window.java:843)
    at java.awt.Dialog.setVisible(Dialog.java:984)

链接到Apple的最新更新信息:
http://support.apple.com/kb/HT5797

根据发行说明:

  

Java 1.6.0_45中存在多个漏洞,这是最严重的漏洞   这可能允许不受信任的Java applet执行任意代码   在Java沙箱之外。访问包含恶意内容的网页   精心设计的不受信任的Java applet可能导致任意代码执行   具有当前用户的权限。这些问题得到了解决   通过更新到Java版本1.6.0_51

5 个答案:

答案 0 :(得分:2)

我注意到1.6.0_51jnlp中出现了jnlp缺少的依赖项。在以前的版本中,错误是不明显的,可能是由于延迟加载。作为一个具体示例, demo的本地副本的jfreechart-1.0.14.jar包含众所周知的依赖项jcommon-1.0.17.jarjavaws 。由于缺少iText-2.1.5.jarcommons-math-2.2.jar GUI指出了一个例外。在另一种情况下,丢失的1.6.0_51无声地失败。如果没有详细了解{{1}}中修复的漏洞,更严格的依赖性检查可能是一个合理的假设。

答案 1 :(得分:2)

Apple发布了这些更新的修订版本已解决此问题: http://support.apple.com/kb/DL1572(10.7,10.8 +) http://support.apple.com/kb/DL1573(仅限10.6)

答案 2 :(得分:1)

我在https://stackoverflow.com/a/17226346/2507292回答了这个问题。 简短的形式是你必须将你的调用包装到UIManager.setLookAndFeel,以便它在Swing线程中运行。必须在该线程中运行所有未在其JavaDoc中标记为“线程安全”的Swing方法。如果您不这样做,以前的Java版本似乎没有破坏,并且在程序开始时设置外观时很容易不去考虑它。可能还有其他一些方法也更加严格,但这就是让我们感到困惑的方法。

答案 3 :(得分:1)

我的经历似乎与Mike C的观点一致;但是我发现任何对UIManager的引用似乎打破了应用程序。具体来说,向UIManager添加任何属性(由Quaqua用来配置各种选项)都会破坏它,就像通过UIManager设置任何外观一样。

(来源:我是Buddi的作者(http://buddi.digitalcave.ca),今天我开始从报告此问题的用户那里获得多个错误报告。通过添加一个标志来可选地禁用对UIManager的所有引用,我有它再次发挥作用,虽然失去了所有漂亮的Mac外观。希望Apple能尽快解决这个问题......)

编辑:谢谢Sidney,这个建议奏效了。非常感谢!

答案 4 :(得分:0)

在我们的案例中,我们能够通过删除这条线将我们的应用程序恢复到工作状态:

UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());