前にも書いたようにMac OS XのJAVAには大きな断絶があり、今日のJAVAの開発を困難にしている。OS X 10.6以前(JAVA6まで)のJAVAはAppleによってOS Xと一体にサポートされ、ツールや資料も手厚く提供されてきた。
OS X 10.7以降はOracleがJAVA7以降を提供するようになり、Appleから提供されていた資料やツールが非推奨化・旧態化するとともに消滅しつつあり、一方新しい情報は出てこなくなったきた。
そんな中、ユーザの交流サイト等が細々と情報を提供している現状である。
そもそもOS XはLinuxマシンである。しかしローカライズ機能等を使ってLinuxの素顔は隠され、Macintoshとして見えるようになっている。Linuxとしての顔を見るためにはコマンドラインで扱う必要がある。開発はXCodeというGUIのツールを使うとうまく行くようになっているようだが、アップデートが早く、手持ちMacに合う古いXCodeには必要な追加ツールが手に入らない。
本題に話を戻すと、OS Xでのアプリの起動方法は次の、
a)アプリをダブルクリックして起動
b)アプリのエイリアスをダブルクリックして起動
c)ドックアイコンをダブルクリックして起動
d)アプリにドキュメントファイルをドロップして起動
e)アプリのエイリアスにドキュメントファイルをドロップして起動
f)ドックアイコンにドキュメントファイルをドロップして起動
等であり、つまり3つの対象に対して、1)それをダブルクリックしてアプリを起動するか、2)それにドキュメントファイルをドロップしてアプリを起動する。
1)や2)のアプリの起動はOS Xのバンドルというやり方に従って比較適容易に実現できる。一方2)でドロップされたファイル(名)の受け取りでは、起動前に発生したOpenDocumentイベントが起動後のアプリに伝わり、アプリ側でそのイベントを受け取って処理する事が求められる。これはJAVAの範疇外であり、専用に用意された特別のライブラリを使うか、あるいはイベントを受け取れる別の言語で処理してJAVAに渡すことになる。
専用のライブラリとしてApplicationというクラスがAppleで(今はライブラリの奥底に)用意されていて呪文を唱えると使えるが、古い性かJAVA8ではファイル名の取り込みは機能しなかった。 そうすると、(shellはAppleイベントを扱えないため)イベントを受け取れる筈のObjective-CやPython、Qt、AppleScript、Automater等で挑戦するしかないか。もっと調べないと・・・。
そんな起動方法の問題とは別に、同じGUIでもWindowsとMacintoshでは流儀に違いがあるため、個別の対応が必要な部分がある。
1)メニューバーの付け方
2)クローズのやり方
3)Aboutメニュー、Helpメニューの場所
4)ショートカット(ALT)キー
5)アクセラレータ(META)キー
等々。
このためネット上の多くの文献を参考にしたが、特に次の資料は有用でした。
○ seraphyの日記
・Pure JavaでMacOSX対応のアプリケーションを作る方法
・JAVAアプリをMac OS X用にApplication Bundle化する
○ Developing an OSX Application in Java
○ Make Your Swing App Go Native, Part 1, 2, 3
まあ、今後ともボチボチ開発していきます。とりあえずMacらしくOpenDocumentを実現したい。
その後・・・
環境がないので検証出来ないが、OS X 10.8 Mountain Lionで導入されたGateKeeperというツールで怪しいアプリの実行がブロックされるらしいことが分かった。JAVAの場合Bundleの中にJREを組み込まないと引っかかるらしいが、そうすると配布モジュールが大きくなる(圧縮前のDMG形式は10MBが最低なので、ある程度の大きさは覚悟しないといけないが)。
もちろんGeteKeeperの設定変更やCTRLを押しながらの起動で回避できるらしいから、とりあえずマニュアルを編集することで回避しよう。
○ 情報源→ I am running Mountain Lion (OS X 10.8) or later and Gatekeeper is blocking an app from launching. What is going on?
その後・・・
OS X のApplicationクラスの使い方が、ネットに流れている情報は不十分でサンプルプログラムをそのまま使ってもExceptionを起こして機能しない。OS XのJAVAはクソだから捨てた方が良いなんてアドバイスもネットに流れている。
一、二週間ほど格闘してみて、少し面倒だがListenerやHandler等を纏めないで個々に別クラスとして作成するとうまく行った。たぶんこれで行けるだろう・・・か。
0 件のコメント:
コメントを投稿