web-dev-qa-db-ja.com

MacでSWTベースのクロスプラットフォームjarを適切に実行する

私は、Java Web Startとしてデプロイすることを目的とした、複数のプラットフォームで使用することを目的としたSWTベースのプロジェクトに取り組んでいます。

これまでのところ、SWTが依存しているシステム固有のライブラリが原因で発生するエクスポートの問題に取り組むことができました(関連する スレッド を参照)。結果のjarは、32/64ビットのLinuxおよび64ビットのWindowsで正常に起動するように見えますが、Macでは次の出力で実行が失敗します。

$ Java -jar dist/test.jar 
Adding { file:/Volumes/LaCie/ChiBE_Local/swt/swt-cocoa-macosx-x86_64-3.6.1.jar } to the classpath
***WARNING: Display must be created on main thread due to Cocoa restrictions.
Exception in thread "main" Java.lang.reflect.InvocationTargetException
   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 org.Eclipse.jdt.internal.jarinjarloader.JarRsrcLoader.main(JarRsrcLoader.Java:58)
Caused by: Java.lang.ExceptionInInitializerError
   at org.Eclipse.gef.tools.MarqueeSelectionTool.<init>(MarqueeSelectionTool.Java:99)
   at org.gvt.MarqueeZoomTool.<init>(MarqueeZoomTool.Java:16)
   at org.gvt.action.MarqueeZoomToolAction$1.<init>(MarqueeZoomToolAction.Java:28)
   at org.gvt.action.MarqueeZoomToolAction.createTool(MarqueeZoomToolAction.Java:28)
   at org.gvt.action.AbstractGEFToolAction.<init>(AbstractGEFToolAction.Java:24)
   at org.gvt.action.MarqueeZoomToolAction.<init>(MarqueeZoomToolAction.Java:20)
   at org.gvt.TopMenuBar.createBarMenu(TopMenuBar.Java:113)
   at org.gvt.ChisioMain.createMenuManager(ChisioMain.Java:617)
   at org.Eclipse.jface.window.ApplicationWindow.addMenuBar(ApplicationWindow.Java:235)
   at org.gvt.ChisioMain.main(ChisioMain.Java:149)
   at org.gvt.RuntimeMain.main(RuntimeMain.Java:14)
   ... 5 more
Caused by: 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 org.Eclipse.swt.widgets.Display.getDefault(Unknown Source)
   at org.Eclipse.swt.widgets.Display$1.run(Unknown Source)
   at org.Eclipse.swt.graphics.Device.getDevice(Unknown Source)
   at org.Eclipse.swt.graphics.Resource.<init>(Unknown Source)
   at org.Eclipse.swt.graphics.Cursor.<init>(Unknown Source)
   at org.Eclipse.draw2d.Cursors.<clinit>(Cursors.Java:170)
   ... 16 more

私はいくつかの関連するスレッドをチェックしました:( Mac OS XでSWTディスプレイを取得できませんMacでのSWTの問題 )および I SWT FAQのスレッドエントリ および Java App to Mac および Mac OSXでのSWTアプリケーションのデプロイ などのチュートリアル。

この問題はMacOSXでのスレッド処理が原因であると理解しているので、実行時にJVM引数-XstartOnFirstThreadを実装する必要があります。これは正しいですか?

問題の私の理解が正確であると仮定すると、このソフトウェアはクロスプラットフォームであり、javawsで実行することを目的としているため、少し混乱しています。 info.plistファイルを作成する必要がありますか?作成する場合、パッケージのどこに、どのように作成する必要がありますか?そうでない場合、実行時にその引数を「条件付きで」JVMに渡すにはどうすればよいですか?

前もって感謝します、

23
posdef

はい、Mac OSXでこれを機能させるには必ず-XstartOnFirstThreadが必要です。これはVMパラメータであるため、アプリケーションの起動時にのみ指定できます。したがって、からOSを検出します。 Mac OS Xの場合は、コーディングして設定することはできません。 Eclipseサイトのソリューション 適切なMac OS Xを作成しますMy Application.app、これはプラットフォーム固有であり、繰り返しになりますが、あなたの場合は実行不可能です。

しかし、WindowsでEclipseRCPアプリケーションを実行しようとしたところXP -XstartOnFirstThread引数を指定して)まったく文句を言わなかった。つまり、この引数をで指定できるということです。 JNLPファイルとおそらくそれは他のすべてのプラットフォームでは無視され、Mac OSXで取得されます。

UPDATE:何らかの理由で-XstartOnFirstThreadがいずれかのプラットフォームで問題を引き起こした場合、または単に正しいことをしたい場合事、別の可能な解決策があります。ブラウザでユーザーのOSを検出し(アプリケーションがWebページから起動されていると仮定)、Mac OSXおよびその他のプラットフォーム用に別のJNLPを提供できます。

UPDATE 2:コメントで指摘されているように、 Java)を使用したSWTアプリケーションのデプロイに関するチュートリアルがあります。 = Web Start 。Mac OS X(10.6.x)でJNLPを起動しただけで、機能しました。 JNPLの例 を見ると、次のことがわかりました。

<?xml version="1.0" encoding="utf-8"?>
<jnlp spec="1.0+"
    codebase="http://www.Eclipse.org/swt/jws/"
    href="controlexample.jnlp">
<information>
      <title>Control Example</title>
      <vendor>Eclipse.org</vendor>
      <homepage href="http://www.Eclipse.org/swt/jws/" />
      <description>A demonstration of SWT Widgets</description>
      <description>Control Example</description>
</information>

<security>
    <all-permissions />
</security>

<resources>
    <extension href="swt.jnlp"/>
    <jar href="controlexample.jar" />
</resources>

<application-desc main-class="org.Eclipse.swt.examples.controlexample.ControlExample" />
</jnlp>

プラットフォーム固有のSWT JNLPファイル (ここでは一部省略)を指す<extension href="swt.jnlp"/>行に注意してください。

<?xml version="1.0" encoding="utf-8"?>
<jnlp spec="1.0+"
    codebase="http://www.Eclipse.org/swt/jws/"
    href="swt.jnlp">
<information>
      <title>SWT</title>
      <vendor>Eclipse.org</vendor>
      <homepage href="http://www.Eclipse.org/swt/jws/" />
      <description>SWT</description>
</information>

<security>
    <all-permissions />
</security>

<resources os="Windows" Arch="x86">
    <j2se version="1.4+" />
    <jar href="swt-win32-windows-x86.jar" />
</resources>

...

<resources os="Mac\ OS\ X">
    <j2se version="1.5*" Java-vm-args="-XstartOnFirstThread"/>
    <jar href="swt-carbon-osx-universal.jar" />
</resources>

<component-desc/>
</jnlp>

ファイルの終わりに向かっています:Mac OSX固有の-XstartOnFirstThread引数。

37
Zsolt Török