単一のクラスを持つ初期の Java Web Start アプリケーションがあります。これは Windows と Linux で動作しますが、Mac OS X では恐ろしい Invalid Thread Access エラーが発生します。私は丸 2 日かけてインターネットを探し回り、すべての解決策を実装しましたが、問題は解決しません。
私の理解では、SWT の呼び出しはメイン スレッドから行う必要があります。私が間違っている場合は修正してください。
アプリケーションのソース コード、jnlp ファイルの関連部分、および Mac でのエラー メッセージの 3 つのスニペットを以下に掲載します。質問は最後にあります。
Java ソースコード
package client;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
public class AccountWindow {
public static void main(String[] args) {
Display display = new Display(); **// error occurs here**
Shell shell = new Shell(display); shell.open();
while (!shell.isDisposed()) {
if (!display.readAndDispatch())
display.sleep();
}
display.dispose();
}
}
JNLP スニペット
<resources os="Mac\ OS\ X" arch="x86_64">
<j2se version="1.5+" java-vm-args="-XstartOnFirstThread" />
<nativelib href="swt-4.2-cocoa-macosx-x86_64.jar" />
</resources>
エラーメッセージ
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 client.AccountWindow.main(AccountWindow.java:16)
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 com.sun.javaws.Launcher.executeApplication(Launcher.java:1550)
at com.sun.javaws.Launcher.executeMainClass(Launcher.java:1488)
at com.sun.javaws.Launcher.doLaunchApp(Launcher.java:1299)
at com.sun.javaws.Launcher.run(Launcher.java:114)
at java.lang.Thread.run(Thread.java:637)
注意してください - http://www.eclipse.org/swt/faq.php#javawebstart
に
掲載されている display.syncExec ソリューションは適用できません。呼び出す前にディスプレイが必要だからです。ディスプレイを作成しようとすると、ここでエラーが発生します。
- JaNeLa を使用して jnlp ファイルを検証しましたが、赤いエラーはありません。
- 正しい swt ライブラリがロードされているため、<resources os="Mac\ OS\ X" arch="i386"> が正しく解釈されています。- http://thelinkjuicer.com/gannonline/client.jnlp
でエラーを再現できます
そして今、質問
ソースコードまたはjnlpスニペットでエラーを引き起こす何かを見ることができますか?
二次的な質問: -XstartOnFirstThread 引数が実際に VM によって読み取られているかどうかをどのように確認できますか?