【发布时间】:2010-10-20 09:21:07
【问题描述】:
我一直在从事一个基于 SWT 的项目,该项目旨在部署为 Java Web Start,因此可以在多个平台上使用。
到目前为止,我已经设法解决了由于 SWT 依赖的系统特定库而出现的导出问题(请参阅相关的 thread)。生成的 jar 在 32/64 位 linux 和 64 位 Windows 上似乎可以正常工作,但是在 Mac 上执行失败,输出如下:
$ java -jar dist/test.jar
Adding { file:/Volumes/LaCie/ChiBE_Local/swt/swt-cocoa-macosx-x86_64-3.6.1.jar } to the classpath
***WARNING: Display must be created on main thread due to Cocoa restrictions.
Exception in thread "main" java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader.main(JarRsrcLoader.java:58)
Caused by: java.lang.ExceptionInInitializerError
at org.eclipse.gef.tools.MarqueeSelectionTool.<init>(MarqueeSelectionTool.java:99)
at org.gvt.MarqueeZoomTool.<init>(MarqueeZoomTool.java:16)
at org.gvt.action.MarqueeZoomToolAction$1.<init>(MarqueeZoomToolAction.java:28)
at org.gvt.action.MarqueeZoomToolAction.createTool(MarqueeZoomToolAction.java:28)
at org.gvt.action.AbstractGEFToolAction.<init>(AbstractGEFToolAction.java:24)
at org.gvt.action.MarqueeZoomToolAction.<init>(MarqueeZoomToolAction.java:20)
at org.gvt.TopMenuBar.createBarMenu(TopMenuBar.java:113)
at org.gvt.ChisioMain.createMenuManager(ChisioMain.java:617)
at org.eclipse.jface.window.ApplicationWindow.addMenuBar(ApplicationWindow.java:235)
at org.gvt.ChisioMain.main(ChisioMain.java:149)
at org.gvt.RuntimeMain.main(RuntimeMain.java:14)
... 5 more
Caused by: org.eclipse.swt.SWTException: Invalid thread access
at org.eclipse.swt.SWT.error(Unknown Source)
at org.eclipse.swt.SWT.error(Unknown Source)
at org.eclipse.swt.SWT.error(Unknown Source)
at org.eclipse.swt.widgets.Display.error(Unknown Source)
at org.eclipse.swt.widgets.Display.createDisplay(Unknown Source)
at org.eclipse.swt.widgets.Display.create(Unknown Source)
at org.eclipse.swt.graphics.Device.<init>(Unknown Source)
at org.eclipse.swt.widgets.Display.<init>(Unknown Source)
at org.eclipse.swt.widgets.Display.<init>(Unknown Source)
at org.eclipse.swt.widgets.Display.getDefault(Unknown Source)
at org.eclipse.swt.widgets.Display$1.run(Unknown Source)
at org.eclipse.swt.graphics.Device.getDevice(Unknown Source)
at org.eclipse.swt.graphics.Resource.<init>(Unknown Source)
at org.eclipse.swt.graphics.Cursor.<init>(Unknown Source)
at org.eclipse.draw2d.Cursors.<clinit>(Cursors.java:170)
... 16 more
我检查了一些相关线程:(Can't get SWT Display on Mac OS X, Problems With SWT on Mac) 以及UI Thread entry on the SWT FAQ 以及Bringing your Java App to Mac 和Deploying SWT applications on Mac OSX 等教程。
据我了解,问题源于 Mac OSX 上的线程处理,我应该尝试在执行时实现 JVM 参数 -XstartOnFirstThread。是这样吗?
假设我对问题的理解是准确的,我有点困惑,因为该软件旨在跨平台并在 javaws 上运行。我是否需要创建一个info.plist 文件,如果需要,在包中的哪个位置以及如何创建,否则我如何在执行时“有条件地”将该参数传递给 JVM?
提前致谢,
【问题讨论】:
-
对于它的价值,我已经改进了错误消息:bugs.eclipse.org/bugs/show_bug.cgi?id=470174 ***警告:由于 Cocoa 限制,必须在主线程上创建显示。使用 vmarg -XstartOnFirstThread
标签: java macos cross-platform swt