问题描述
我们有一个使用SWT库通过Webstart启动的应用程序.
We have an application that launches via webstart that uses the SWT library.
众所周知,osx要求swt库在主线程中运行,因此我们在jnlp中提供了它:
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>
由于我们已升级到Java 7(1.7.0_10),因此webstart似乎没有将"-XstartOnFirstThread"传递给它启动的Java进程.
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.
我从'ps'可以看到Java进程没有获得"-XstartOnFirstThread"选项.
I can see from 'ps' that the java process isn't getting the "-XstartOnFirstThread" option.
有人知道如何使Webstart返回其先前的行为吗?
Does anyone know how to get webstart to go back to its previous behaviour?
关于,哥德.
这是Webstart日志显示的内容:
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)
推荐答案
我在Java 7中也看到了这一点,并想知道这是否是基于另一个人的这篇文章的Java 7 bug(我继续并提交了一个错误报告,因为我没有从Java错误数据库中搜索到任何错误): http://www.java.net/forum/topic/jdk/java-se/webstart-os-x-xstartonfirstthread
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
我发现的解决方法只是使用Apple提供的Java 6中的javaws,尽管我必须从命令行启动它:/System/Library/Java/Support/Deploy.bundle/Contents/MacOS/javaws myjnlp.jnlp
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
这篇关于Java 7使用Web Start打破了OS X上的SWT应用程序的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!