SWT-basiertes, plattformübergreifendes JAR ordnungsgemäß auf einem Mac ausführen
Habe ich die Arbeit an einer SWT-basierte Projekt soll bereitgestellt werden als Java-Web-Start, und so auf mehreren Plattformen.
So weit ich es geschafft haben, zur Bewältigung der Export problem, dass sich aufgrund der system-spezifischen Bibliotheken SWT abhängt (siehe entsprechenden thread). Die resultierende jar-scheint zu funktionieren beginnen, gut auf 32/64-bit-linux und 64-bit-windows, aber die Ausführung kann nicht auf einem Mac mit der folgenden Ausgabe:
$ 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
Habe ich überprüft eine Reihe von relevanten threads: (Kann nicht SWT Display, über Mac OS XProbleme Mit SWT unter Mac) sowie die UI-Thread-Eintrag auf der SWT-FAQ und tutorials wie Bringen Sie Ihre Java-Anwendung auf dem Mac und Die Bereitstellung von SWT-Anwendungen auf Mac OSX.
Es ist mein Verständnis, dass das problem stammt vom thread-handling unter Mac OSX, und ich sollte versuchen, implementieren Sie das JVM-argument -XstartOnFirstThread
in der Ausführung. Ist das richtig?
Unter der Annahme, dass mein Verständnis des Problems ist korrekt, ich bin ein bisschen verwirrt, als diese software soll cross-Plattform und deren Ausführung auf javaws. Brauche ich zum erstellen einer info.plist
Datei, wenn ja, wo in dem Paket und wie, ansonsten, wie kann ich "bedingt" pass das argument JVM zum Zeitpunkt der Ausführung?
Vielen Dank im Voraus,
InformationsquelleAutor der Frage posdef | 2010-10-20
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ja, Sie werden definitiv brauchen
-XstartOnFirstThread
damit dies funktioniert auf Mac OS X. Da es ein VM-parameter können Sie nur angeben, die beim Start der Anwendung, also der Erkennung der OS aus Sie den code und setzen Sie es, wenn es Mac OS X ist nicht möglich. Die Lösung auf der Eclipse-Website schafft eine richtige Mac-OS-X - Meine Anwendung.appdie Plattform-spezifische und wieder nicht machbar in deinem Fall.Jedoch, ich habe gerade versucht mit einer Eclipse-RCP-Anwendung auf Windows XP mit der
-XstartOnFirstThread
argument angegeben ist, und es nicht beschweren. Dies bedeutet, dass Sie dieses argument angeben, in Ihre JNLP-Datei und vermutlich wird es ignoriert werden, auf allen anderen Plattformen abgeholt und auf Mac OS X.UPDATE: Wenn aus irgendeinem Grund
-XstartOnFirstThread
verursacht Probleme auf jeder Plattform, oder wollen Sie einfach nur Das Richtige Tunist eine weitere mögliche Lösung. Sie konnte erkennen des Benutzers OS im browser — unter der Annahme, dass die Anwendung gestartet wird von einer web-Seite, und geben Sie einen anderen JNLP für Mac OS X und andere Plattformen.UPDATE 2: Wie schon in den Kommentaren, es ist eine tutorial auf die Bereitstellung von SWT-Anwendungen mit Java Web Start. Ich habe einfach gestartet die JNLP-auf Mac OS X (10.6.x), und es funktionierte. Blick auf die Beispiel JNPL ich Folgendes gefunden:
Hinweis: die
<extension href="swt.jnlp"/>
Linie gegen das Ende, Hinweis auf die Plattform-spezifische SWT JNLP-Datei (einige Teile hier weggelassen):Dort ist es gegen Ende der Datei: die Mac-OS-X-spezifischen
-XstartOnFirstThread
argument.InformationsquelleAutor der Antwort Zsolt Török
SWT (wie jede andere UI-framework) hat den "UI-thread". Das ist in der Regel der Haupt-thread (also die, die ausgeführt
main(String[] args)
. Alle Anrufe auf UI-Methoden geschehen muss in diesem thread.Wenn Sie aufrufen müssen, eine UI-Methode von einem nicht-UI-thread, müssen Sie wickeln Sie es:
Wenn Sie brauchen, um auf das Ergebnis zu warten, können Sie
syncExec()
InformationsquelleAutor der Antwort Aaron Digulla