使用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 

感谢您的想法和时间!

您正在使用java ,它在运行Maven的同一JVM中运行您的应用程序。这意味着您的应用程序启动时无法传递JVM参数,因为未创建新的JVM。

你有两个选择:

1.将 JVM参数传递给运行Maven的JVM(因此也最终运行您的应用程序)。 在Mac上,这是通过设置MAVEN_OPTS环境变量来完成的:

 export MAVEN_OPTS="-XstartOnFirstThread` (then run Maven) 

在这种情况下,您可以从部分删除所有 ,因为它们是不必要的并且不起作用。 您还可以删除

2.使用exec ,它将java作为常规shell命令运行,您可以传递所需的所有JVM配置参数:

  exec  

在这种情况下,您确实需要中的所有内容以及实际的主类,因为它只是作为shell命令运行的JVM的另一个参数。 您还可以以稍微简单的方式添加类路径:

 java  -XstartOnFirstThread -classpath  standalone.App  

第二个选项通常更强大,因为在运行应用程序之前,您不必处理Maven对JVM执行奇怪的操作。

在MAc OS X上运行SWT应用程序时,需要指定-XstartOnFirstThread选项。