使用Maven在OSX上出现SWT错误
我做了一个示例应用程序,我想使用maven在osx下测试swt。 我已经阅读了数百篇文章并在主线程上创建了显示,但应用程序抛出相同的exception。
你能检查我的pom文件和我的示例应用程序吗?
的pom.xml
4.0.0 asdf.abcd b 0.0.1-SNAPSHOT example org.eclipse.swt org.eclipse.swt.cocoa.macosx.x86_64 4.3 org.eclipse.jface jface 3.9.1 org.codehaus.mojo exec-maven-plugin 1.2.1 java -d64 -XstartOnFirstThread -classpath standalone.App true org.apache.maven.plugins maven-jar-plugin standalone.App
例外:
###Thread name: standalone.App.main() Thread[standalone.App.main(),5,standalone.App] <-- debug message ***WARNING: Display must be created on main thread due to Cocoa restrictions. [WARNING] java.lang.reflect.InvocationTargetException at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:606) at org.codehaus.mojo.exec.ExecJavaMojo$1.run(ExecJavaMojo.java:297) at java.lang.Thread.run(Thread.java:744) 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.(Unknown Source) at org.eclipse.swt.widgets.Display.(Unknown Source) at org.eclipse.swt.widgets.Display.(Unknown Source) at org.eclipse.swt.widgets.Display.getDefault(Unknown Source) at standalone.App.main(App.java:66) ... 6 more
感谢您的想法和时间!
您正在使用
,它在运行Maven的同一JVM中运行您的应用程序。这意味着您的应用程序启动时无法传递JVM参数,因为未创建新的JVM。
你有两个选择:
1.将 JVM参数传递给运行Maven的JVM(因此也最终运行您的应用程序)。 在Mac上,这是通过设置MAVEN_OPTS
环境变量来完成的:
export MAVEN_OPTS="-XstartOnFirstThread` (then run Maven)
在这种情况下,您可以从
部分删除所有
,因为它们是不必要的并且不起作用。 您还可以删除
。
2.使用
,它将java
作为常规shell命令运行,您可以传递所需的所有JVM配置参数:
exec
在这种情况下,您确实需要
中的所有内容以及实际的主类,因为它只是作为shell命令运行的JVM的另一个参数。 您还可以以稍微简单的方式添加类路径:
java -XstartOnFirstThread -classpath standalone.App
第二个选项通常更强大,因为在运行应用程序之前,您不必处理Maven对JVM执行奇怪的操作。
在MAc OS X上运行SWT应用程序时,需要指定-XstartOnFirstThread
选项。