instalar - java para mac sierra
Ejecutar correctamente un tarro multiplataforma basado en SWT en una Mac (2)
Sí, definitivamente necesitará -XstartOnFirstThread
para que esto funcione en Mac OS X. Ya que es un parámetro de VM, solo puede especificarlo al iniciar su aplicación, por lo que detectar el sistema operativo de su código y configurarlo si es Mac OS X no es posible. La solución en el sitio de Eclipse crea una aplicación correcta de Mac OS X My Application.app , que es específica de la plataforma y, de nuevo, no es factible en su caso.
Sin embargo, acabo de intentar ejecutar una aplicación Eclipse RCP en Windows XP con el argumento -XstartOnFirstThread
especificado, y no se quejó en absoluto. Esto significa que puede especificar este argumento en su archivo JNLP y presumiblemente se ignorará en todas las demás plataformas y se seleccionará en Mac OS X.
ACTUALIZACIÓN: Si, por algún motivo, -XstartOnFirstThread
causa problemas en cualquier plataforma, o simplemente quiere hacer lo correcto , existe otra solución posible. Puede detectar el sistema operativo del usuario en el navegador, suponiendo que la aplicación se inicie desde una página web, y proporcionar un JNLP diferente para Mac OS X y otras plataformas.
ACTUALIZACIÓN 2: Como se señaló en los comentarios, hay un tutorial sobre la implementación de aplicaciones SWT con Java Web Start . Simplemente lancé el JNLP en Mac OS X (10.6.x), y funcionó. Mirando el ejemplo JNPL encontré lo siguiente:
<?xml version="1.0" encoding="utf-8"?>
<jnlp spec="1.0+"
codebase="http://www.eclipse.org/swt/jws/"
href="controlexample.jnlp">
<information>
<title>Control Example</title>
<vendor>eclipse.org</vendor>
<homepage href="http://www.eclipse.org/swt/jws/" />
<description>A demonstration of SWT Widgets</description>
<description>Control Example</description>
</information>
<security>
<all-permissions />
</security>
<resources>
<extension href="swt.jnlp"/>
<jar href="controlexample.jar" />
</resources>
<application-desc main-class="org.eclipse.swt.examples.controlexample.ControlExample" />
</jnlp>
Observe la línea <extension href="swt.jnlp"/>
hacia el final, que apunta al archivo SWT JNLP específico de la plataforma (algunas partes se omiten aquí):
<?xml version="1.0" encoding="utf-8"?>
<jnlp spec="1.0+"
codebase="http://www.eclipse.org/swt/jws/"
href="swt.jnlp">
<information>
<title>SWT</title>
<vendor>eclipse.org</vendor>
<homepage href="http://www.eclipse.org/swt/jws/" />
<description>SWT</description>
</information>
<security>
<all-permissions />
</security>
<resources os="Windows" arch="x86">
<j2se version="1.4+" />
<jar href="swt-win32-windows-x86.jar" />
</resources>
...
<resources os="Mac/ OS/ X">
<j2se version="1.5*" java-vm-args="-XstartOnFirstThread"/>
<jar href="swt-carbon-osx-universal.jar" />
</resources>
<component-desc/>
</jnlp>
Ahí está hacia el final del archivo: el argumento -XstartOnFirstThread
específico de Mac OS X.
He estado trabajando en un proyecto basado en SWT que está destinado a ser implementado como Java Web Start, y por lo tanto, ser usado en múltiples plataformas.
Hasta ahora, he logrado abordar el problema de exportación que surge debido a las bibliotecas específicas del sistema de las que depende SWT (consulte el thread correspondiente). El contenedor resultante parece funcionar bien en Linux de 32/64 bits y en ventanas de 64 bits, sin embargo, la ejecución falla en una Mac con la siguiente salida:
$ 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
He comprobado una serie de subprocesos relevantes: ( No se puede obtener SWT Display en Mac OS X , Problemas con SWT en Mac ), así como la entrada de UI Thread en las Preguntas frecuentes y tutoriales de SWT , como Traer su aplicación Java a Mac e Implementación Aplicaciones SWT en Mac OSX .
Tengo entendido que el problema se origina en el manejo de subprocesos en Mac OSX, y debo intentar implementar el argumento JVM -XstartOnFirstThread
en la ejecución. ¿Es esto correcto?
Suponiendo que mi comprensión del problema es precisa, estoy un poco confundido ya que este software está diseñado para ser multiplataforma y ejecutarse en javaws. ¿Necesito crear un archivo info.plist
Si es así, ¿dónde está en el paquete y cómo? De lo contrario, ¿cómo puedo pasar "condicionalmente" ese argumento a JVM en el momento de la ejecución?
Gracias por adelantado,
SWT (como cualquier otro marco de UI) tiene un "subproceso de interfaz de usuario". Ese suele ser el hilo principal (es decir, el que ejecutó main(String[] args)
. Todas las llamadas a los métodos de UI deben ocurrir en este hilo.
Si necesita llamar a un método de UI desde un subproceso que no es UI, debe envolverlo:
Display.getDefault().asyncExec( new Runnable() {
public void run() {
//ui call here
}
} );
Si necesita esperar el resultado, puede usar syncExec()