title: Launching SWT on Mac using Java Web Start
body: <p>Goal: Launch SWT Web Start application on Mac using Java 7</p>
  
  <p>In order to run an SWT RCP application on Mac OS X, it is well documented that it is necessary to include <a href="https://stackoverflow.com/questions/12937762/invalid-thread-access-even-with-xstartonfirstthread-in-vm-args">-XstartOnFirstThread</a> as part of the Java Virtual Machine arguments. </p>
  
  <p>Unfortunately, Java Web Start seems to be deleting this argument. Looking at Java Web Start’s detailed tracing logs:</p>
  
  <pre><code>temp: returning LaunchDesc from XMLFormat.parse():
  
  &lt;jnlp spec="1.0+" codebase=“..." href=“..."&gt;
    &lt;information&gt; ...
  
    &lt;resources&gt;
      &lt;java java-vm-args="-XstartOnFirstThread -Xms1024m" version="1.6+"/&gt; ...
  </code></pre>
  
  <p>So Web Start is successfully receiving the XstartOnFirstThread parameter.</p>
  
  <p>and later</p>
  
  <pre><code>basic: Launching new JRE version: JREInfo for index 0:
      platform is: 1.7
      product is: 1.7.0_60
      location is: http://java.sun.com/products/autodl/j2se
      path is: /Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Home/bin/java
      args is: 
      native platform is: Mac OS X, x86_64 [ x86_64, 64bit ]
      JavaFX runtime is: JavaFX 2.2.60 found at /Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Home/
      enabled is: true
      registered is: true
      system is: true
  
  basic:   jvmParams: [JVMParameters: isSecure: false, args: -XstartOnFirstThread -Xms1024m ...]
  basic: cmd 0 : /Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Home/bin/java
  basic: cmd 1 : -Xms1024m
  ...
  basic: cmd 12 : -Xbootclasspath/a:/Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Home/lib/javaws.jar:/Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Home/lib/deploy.jar:/Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Home/lib/plugin.jar
  basic: cmd 13 : -classpath
  basic: cmd 14 : /Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Home/lib/deploy.jar
  basic: cmd 15 : -Djnlpx.vmargs="-Xms1024m ..."
  basic: cmd 16 : -Xdock:icon=/Users/kutnic/Library/Application Support/Oracle/Java/Deployment/cache/6.0/8/b871708-57c4f462.icns
  ...
  basic: cmd 18 : -Djnlpx.jvm=/Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Home/bin/java
  basic: cmd 19 : -Djnlpx.splashport=-1
  basic: cmd 20 : -Djnlpx.home=/Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Home/bin
  basic: cmd 21 : -Djnlpx.remove=false
  basic: cmd 22 : -Djnlpx.offline=false
  basic: cmd 23 : -Djnlpx.relaunch=true
  basic: cmd 24 : -Djnlpx.session.data=/var/folders/bg/v8l2x6vn7xj1swx_0ksv7rcddzd2cb/T/session4911958714097309497
  basic: cmd 25 : -Djnlpx.heapsize=NULL,NULL
  basic: cmd 26 : -Djava.security.policy=file:/Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Home/lib/security/javaws.policy
  basic: cmd 27 : -DtrustProxy=true
  basic: cmd 28 : -Xverify:remote
  basic: cmd 29 : -Dsun.awt.warmup=true
  basic: cmd 30 : com.sun.javaws.Main
  ...
  </code></pre>
  
  <p>Similarly, elsewhere in the log:</p>
  
  <pre><code>  Selected JVMParam: [JVMParameters: isSecure: false, args: -XstartOnFirstThread -Xms1024m -Djnlp.serverIP=... -Djnlp.eclipse.product=... -Djnlp.debugLevel=1]
    Running  JVMParam: [JVMParameters: isSecure: true, args: "-Xms1024m -Djnlp.serverIP=... -Djnlp.eclipse.product=... -Djnlp.debugLevel=1"]
  </code></pre>
  
  <p>Notice that startOnFirstThread is correctly identified, but then not passed along in the next processing stage. Perhaps it's not recognized as 'isSecure: true'?</p>
  
  <p>... and in the end I get the dreaded:</p>
  
  <pre><code>OS X Detected...
  ***WARNING: Display must be created on main thread due to Cocoa restrictions.
  org.eclipse.swt.SWTException: Invalid thread access
          at org.eclipse.swt.SWT.error(SWT.java:4361)
  </code></pre>
  
  <p>Web Start correctly parses -XstartOnFirstThread and -Xms1024m but only chooses to pass on -Xms1024m and NOT -XstartOnFirstThread. </p>
  
  <p>In the same vein, if I execute <code>ps aux | grep ms1024m</code> for the few seconds that Web Start begins to load the application, I get:</p>
  
  <pre><code>/Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Home/bin/java -Xms1024m
  -D... -Djnlp.osgi.instance.area=@none -Djnlp.osgi.configuration.area=@none -Djnlp.eclipse.product=... -Djnlp.javaws.cfg.jauthenticator=true -Djnlp.java.util.Arrays.useLegacyMergeSort=true -Djnlp.debugLevel=1 -Xbootclasspath/a:/Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Home/lib/javaws.jar:/Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Home/lib/deploy.jar:/Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Home/lib/plugin.jar
  -classpath /Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Home/lib/deploy.jar
  -Djnlpx.vmargs="-Xms1024m -Djnlp.serverIP=... -Djnlp.osgi.instance.area=@none -Djnlp.osgi.configuration.area=@none -Djnlp.eclipse.product=... -Djnlp.javaws.cfg.jauthenticator=true -Djnlp.java.util.Arrays.useLegacyMergeSort=true -Djnlp.debugLevel=1" -Xdock:icon=/Users/.../Library/Application Support/Oracle/Java/Deployment/cache/6.0/8/b871708-6a8509fb.icns
  -Xdock:name=... -Djnlpx.jvm=/Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Home/bin/java
  -Djnlpx.splashport=-1 -Djnlpx.home=/Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Home/bin
  -Djnlpx.remove=false -Djnlpx.offline=false -Djnlpx.relaunch=true -Djnlpx.session.data=/var/folders/bg/v8l2x6vn7xj1swx_0ksv7rcddzd2cb/T/session689216052548979970
  -Djnlpx.heapsize=NULL,NULL -Djava.security.policy=file:/Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Home/lib/security/javaws.policy
  -DtrustProxy=true -Xverify:remote -Dsun.awt.warmup=true com.sun.javaws.Main ://.../webstart.jnlp
  </code></pre>
  
  <p>Again, Xms1024m is used, but not XstartOnFirstThread.</p>
  
  <p>(Note a number of pieces of identifying information were removed from the logs posted here, but this should not affect the analysis).</p>
  
  <p>I have also confirmed that copying the relevant files from the server to my local computer and running the application via <code>java -XstartOnFirstThread...</code> works without a problem. </p>
  
  <p>How can I launch an SWT Web Start application on Mac using Java 7? How can I get startOnFirstThread to be successfully processed by Java 7? Is there another way around the SWT Mac quagmire?</p>
  
  <p>Mac OS X 10.9.2</p>
  
  <p>Java 1.7.0_60</p>