我们有一个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
答案 0 :(得分:2)
我注意到1.6.0_51
在jnlp
中出现了jnlp
缺少的依赖项。在以前的版本中,错误是不明显的,可能是由于延迟加载。作为一个具体示例,jfreechart java-web-start demo的本地副本的jfreechart-1.0.14.jar
包含众所周知的依赖项jcommon-1.0.17.jar
和javaws
。由于缺少iText-2.1.5.jar
,commons-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());