Java 7 breaks SWT app on OS X using Web Start

2019-02-12 17:20发布

问题:

We have an application that launches via webstart that uses the SWT library.

It's well known that osx requires the swt library to run in the main thread, so we have this in our jnlp:

<resources os="Mac"> 
    <j2se version="1.6+" java-vm-args="-XstartOnFirstThread"/>
    <jar href="swt-mac64.jar"/>
</resources>

Since we've upgraded to Java 7 (1.7.0_10), it seems that webstart doesn't pass the "-XstartOnFirstThread" to the java process that it starts.

I can see from 'ps' that the java process isn't getting the "-XstartOnFirstThread" option.

Does anyone know how to get webstart to go back to its previous behaviour?

Regards, Gord.

This is what the webstart log shows:

Java Web Start 10.10.2.18
Using JRE version 1.7.0_10-b18 Java HotSpot(TM) 64-Bit Server VM
User home directory = /Users/shier
----------------------------------------------------
c:   clear console window
f:   finalize objects on finalization queue
g:   garbage collect
h:   display this help message
m:   print memory usage
o:   trigger logging
p:   reload proxy configuration
q:   hide console
r:   reload policy configuration
s:   dump system and deployment properties
t:   dump thread list
v:   dump thread stack
0-5: set trace level to <n>
----------------------------------------------------
    Match: beginTraversal
Match: digest selected JREDesc: JREDesc[version 1.6+, heap=-1--1, args=-XstartOnFirstThread, href=null, sel=false, null, null], JREInfo: JREInfo for index 0:
    platform is: 1.7
    product is: 1.7.0_10
    location is: http://java.sun.com/products/autodl/j2se
    path is: /Library/Internet Plug-ins/JavaAppletPlugin.plugin/Contents/Home/bin/java
    args is: null
    native platform is: Mac OS X, x86_64 [ x86_64, 64bit ]
    JavaFX runtime is: JavaFX 2.2.4 found at /Library/Internet Plug-ins/JavaAppletPlugin.plugin/Contents/Home/
    enabled is: true
    registered is: true
    system is: true

    Match: ignoring maxHeap: -1
    Match: ignoring InitHeap: -1
    Match: digesting vmargs: -XstartOnFirstThread
    Match: digested vmargs: [JVMParameters: isSecure: false, args: -XstartOnFirstThread]
    Match: JVM args after accumulation: [JVMParameters: isSecure: false, args: -XstartOnFirstThread]
    Match: digest LaunchDesc: http://htxuat.example.com/broker/broker-XX.jnlp
    Match: digest properties: []
    Match: JVM args: [JVMParameters: isSecure: false, args: -XstartOnFirstThread]
    Match: endTraversal ..
    Match: JVM args final: -XstartOnFirstThread
    Match: Running JREInfo Version    match: 1.7.0.10 == 1.7.0.10
     Match: Running JVM args match the secure subset: have:<"-Djnlp.application.href=\"http://htxuat.example.com/broker/broker-XX.jnlp \"">  satisfy want:<-XstartOnFirstThread>
Dec 13, 2012 10:19:49 AM com.example.log.JavaUtilLogger infoImpl
INFO: Available host [tcp:htxuat.example.com:49200]
Dec 13, 2012 10:19:49 AM com.example.log.JavaUtilLogger infoImpl
INFO: Available host [ssl:htxuat.example.com:49301]
Dec 13, 2012 10:19:49 AM com.example.log.JavaUtilLogger infoImpl
INFO: Will try the first address [tcp:htxuat.example.com:49200]
Dec 13, 2012 10:19:49 AM com.example.log.JavaUtilLogger infoImpl
INFO: Using host [tcp:htxuat.example.com:49200]
Dec 13, 2012 10:19:49 AM com.example.log.JavaUtilLogger infoImpl
INFO: Don't forget to change back the logging, this is only temporary
Dec 13, 2012 10:19:49 AM com.example.log.JavaUtilLogger infoImpl
INFO: Using library /Users/shier/Library/Java/Extensions:/Library/Java/Extensions:/Network/Library/Java/Extensions:/System/Library/Java/Extensions:/usr/lib/java:.
Dec 13, 2012 10:19:49 AM com.example.log.JavaUtilLogger infoImpl
INFO: Registering  [com.example.client.ClientController]
JNLPClassLoader: Finding library libswt-cocoa-3738.dylib
JNLPClassLoader: Finding library libswt-cocoa.dylib
JNLPClassLoader: Finding library libswt-pi-cocoa-3738.dylib
JNLPClassLoader: Finding library libswt-pi-cocoa.dylib
***WARNING: Display must be created on main thread due to Cocoa restrictions.
Dec 13, 2012 10:19:50 AM com.example.log.JavaUtilLogger errorImpl
SEVERE: Problem
org.eclipse.swt.SWTException: Invalid thread access
    at org.eclipse.swt.SWT.error(SWT.java:4282)
    at org.eclipse.swt.SWT.error(SWT.java:4197)
    at org.eclipse.swt.SWT.error(SWT.java:4168)
    at org.eclipse.swt.widgets.Display.error(Display.java:1065)
    at org.eclipse.swt.widgets.Display.createDisplay(Display.java:822)
    at org.eclipse.swt.widgets.Display.create(Display.java:805)
    at org.eclipse.swt.graphics.Device.<init>(Device.java:130)
    at org.eclipse.swt.widgets.Display.<init>(Display.java:696)
    at org.eclipse.swt.widgets.Display.<init>(Display.java:687)
    at org.eclipse.swt.widgets.Display.getDefault(Display.java:1383)
    at org.eclipse.swt.widgets.Shell.<init>(Shell.java:270)
    at org.eclipse.swt.widgets.Shell.<init>(Shell.java:263)
    at com.example.swt.ShellViewParent.attach(ShellViewParent.java:124)
    at com.example.swt.MultipleParents.init(MultipleParents.java:55)
    at com.example.client.mvc.ViewController.setViewParents(ViewController.java:320)
    at com.example.client.mvc.ViewController.setViewParents(ViewController.java:287)
    at com.example.client.mvc.ViewController.setViewParents(ViewController.java:278)
    at com.example.client.gui.prefs.PreferencesViewController.<init>(PreferencesViewController.java:53)
    at com.example.client.ClientController.init(ClientController.java:353)
    at com.example.mvc.Controller.register(Controller.java:51)
    at com.example.client.Application.loadComponents(Application.java:153)
    at com.example.client.Application.start(Application.java:139)
    at com.example.client.Application.main(Application.java:166)
    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:601)
    at com.sun.javaws.Launcher.executeApplication(Unknown Source)
    at com.sun.javaws.Launcher.executeMainClass(Unknown Source)
    at com.sun.javaws.Launcher.doLaunchApp(Unknown Source)
    at com.sun.javaws.Launcher.run(Unknown Source)
    at java.lang.Thread.run(Thread.java:722)

org.eclipse.swt.SWTException: Invalid thread access
    at org.eclipse.swt.SWT.error(SWT.java:4282)
    at org.eclipse.swt.SWT.error(SWT.java:4197)
    at org.eclipse.swt.SWT.error(SWT.java:4168)
    at org.eclipse.swt.widgets.Display.error(Display.java:1065)
    at org.eclipse.swt.widgets.Display.createDisplay(Display.java:822)
    at org.eclipse.swt.widgets.Display.create(Display.java:805)
    at org.eclipse.swt.graphics.Device.<init>(Device.java:130)
    at org.eclipse.swt.widgets.Display.<init>(Display.java:696)
    at org.eclipse.swt.widgets.Display.<init>(Display.java:687)
    at org.eclipse.swt.widgets.Display.getDefault(Display.java:1383)
    at org.eclipse.swt.widgets.Shell.<init>(Shell.java:270)
    at org.eclipse.swt.widgets.Shell.<init>(Shell.java:263)
    at com.example.swt.ShellViewParent.attach(ShellViewParent.java:124)
    at com.example.swt.MultipleParents.init(MultipleParents.java:55)
    at com.example.client.mvc.ViewController.setViewParents(ViewController.java:320)
    at com.example.client.mvc.ViewController.setViewParents(ViewController.java:287)
    at com.example.client.mvc.ViewController.setViewParents(ViewController.java:278)
    at com.example.client.gui.prefs.PreferencesViewController.<init>(PreferencesViewController.java:53)
    at com.example.client.ClientController.init(ClientController.java:353)
    at com.example.mvc.Controller.register(Controller.java:51)
    at com.example.client.Application.loadComponents(Application.java:153)
    at com.example.client.Application.start(Application.java:139)
    at com.example.client.Application.main(Application.java:166)
    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:601)
    at com.sun.javaws.Launcher.executeApplication(Unknown Source)
    at com.sun.javaws.Launcher.executeMainClass(Unknown Source)
    at com.sun.javaws.Launcher.doLaunchApp(Unknown Source)
    at com.sun.javaws.Launcher.run(Unknown Source)
    at java.lang.Thread.run(Thread.java:722)

回答1:

I've been seeing this as well with Java 7 and wonder if it's a Java 7 bug based on this post from another person (I went ahead and submitted a bug report since I didn't see any from searching through the Java bug database): http://www.java.net/forum/topic/jdk/java-se/webstart-os-x-xstartonfirstthread

The workaround I've found is simply to use javaws from the Java 6 supplied by Apple, although I had to launch it from the command line: /System/Library/Java/Support/Deploy.bundle/Contents/MacOS/javaws myjnlp.jnlp