【发布时间】:2014-08-20 23:20:41
【问题描述】:
目标:使用 Java 7 在 Mac 上启动 SWT Web Start 应用程序
为了在 Mac OS X 上运行 SWT RCP 应用程序,有必要将 -XstartOnFirstThread 作为 Java 虚拟机参数的一部分包含在内。
不幸的是,Java Web Start 似乎正在删除这个论点。查看 Java Web Start 的详细跟踪日志:
temp: returning LaunchDesc from XMLFormat.parse():
<jnlp spec="1.0+" codebase=“..." href=“...">
<information> ...
<resources>
<java java-vm-args="-XstartOnFirstThread -Xms1024m" version="1.6+"/> ...
所以 Web Start 成功接收到 XstartOnFirstThread 参数。
以后
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
...
类似地,在日志的其他地方:
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"]
注意 startOnFirstThread 被正确识别,但在下一个处理阶段没有传递。也许它没有被识别为 'isSecure: true'?
...最后我得到了可怕的:
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)
Web Start 正确解析 -XstartOnFirstThread 和 -Xms1024m,但只选择传递 -Xms1024m 而不是 -XstartOnFirstThread。
同样,如果我在 Web Start 开始加载应用程序的几秒钟内执行 ps aux | grep ms1024m,我会得到:
/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
同样,使用了 Xms1024m,但没有使用 XstartOnFirstThread。
(请注意,此处发布的日志中删除了一些识别信息,但这不应影响分析)。
我还确认将相关文件从服务器复制到我的本地计算机并通过java -XstartOnFirstThread... 运行应用程序没有问题。
如何使用 Java 7 在 Mac 上启动 SWT Web Start 应用程序?如何让 Java 7 成功处理 startOnFirstThread?有没有其他方法可以绕过 SWT Mac 的泥潭?
Mac OS X 10.9.2
Java 1.7.0_60
【问题讨论】:
-
看起来像 Eclipse 错误408508
-
考虑到它在“java”命令行下工作,这不是 Eclipse 错误。只有在尝试从 java webstart 运行时才会失败。
-
@ChaimKut 你读过错误报告吗?这是一个 SWT+WebStart 错误,所有 SWT 错误都归档在 Eclipse 错误跟踪器中。与 Eclipse 本身无关...
-
我同意它描述了一个类似的问题。但由于它似乎是一个 WebStart 问题,因此不太可能在 Eclipse/SWT 错误存储库中处理它。
-
这可能与 stackoverflow.com/questions/24492634/… 重复 - Oracle Java 7 不传递参数。 Apple Java 6 传递参数。
标签: java macos swt java-7 java-web-start