Macのアプリケーションバンドル(.app)を作成する with Java編

Macのアプリケーションバンドル(.appというファイル)を作ります。
プログラミング言語Javaです。
この記事はIDE統合開発環境)としてXcode以外を使っている方向けかもしれません。
Xcodeだと.appは自動で作成されるのかも。今回自分はeclipse Heliosを使いました)

アプリケーションバンドルを自分で作ってみるメリットは、
1.Macの規格である.appのアプリケーションを
自分で作ることができ、プログラミングのモチベーションが上がる
2.人に配ることができる

などです。

手順は以下になります。
1.Javaでプログラムを書き、動くものを作る
2.実行可能JAR(Java archive file)を書き出す。
3.Jar Bundlerでアプリケーションバンドルを作る


ではまず1.から。
今回はSwingというJavaGUIプログラミングで一般的な
ツールキットを使いました。
このページを見ればほとんどのことはできるのでは、
というくらいまとまっています。
http://www.javadrive.jp/tutorial/

さて、それでは実行できるSwingアプリケーションができたとします。

2.次に、実行可能JARを書き出します。
JARとはコンパイルしたあとのデータ(バイトコード)や画像ファイルを
まとめたもので、zipファイルと同じような感覚です。

eclipseからは、パッケージエクスプローラの書き出したいプロジェクト上で
右クリック>Export>Java>Executable JARでいけます。
ちなみに毎回右クリック→設定→JAR生成、はめんどくさいので
Antというビルドスクリプトbuild.xmlというファイル)を
作っておくと、その次はAntをビルドするだけで
JARが生成できるので便利です。
(JARを作成するとき、ダイアログで
Antファイルを作るか?と聞かれるのでチェックを入れるだけで
ビルドスクリプトが同時に生成されます。)

3.できたJAR(.jarファイル)を.appファイルにします。
Jar Bundlerというソフトを使います。
Xcodeをインストールしている方は既に入っているとのこと。
http://seino-takahiro.blogspot.com/2009/02/jude-mac-os-x.html
ここでアプリケーションのアイコンとなる画像を指定するのですが、
Icon Composerというソフトを使うと便利です。
http://wakabamac.blog95.fc2.com/blog-entry-430.html
.icnsファイルは基本は.pngらしいのですが、違う形式らしいです。

以上が大まかな流れですが、2点気になったことを補足します。

(i)メニューバーの表示位置がMacっぽくない
ふつうMacのアプリケーションメニューは画面の一番上にでますが、
今回自分の実装したメニューバーはアプリケーション上(JFrame上)に出力されています。
解決策は以下を参考にしました。
http://developer.apple.com/library/mac/#documentation/Java/Reference/Java_InfoplistRef/Articles/JavaDictionaryInfo.plistKeys.html#//apple_ref/doc/uid/TP40008050

アプリケーションバンドル(.appファイル)を右クリックして
Show package contentsを選択し、Contents>Info.plistと進みます。
Info.plistをエディタで開き、以下を追加すると解決しました。

<key>Java</key>
<dict>
     <key>Properties</key>
            <dict>
                <key>apple.laf.useScreenMenuBar</key>
                <string>true</string>
            </dict>
        <key>VMOptions</key>
        <string>-Xmx512m</string>
</dict>

Java以下に記述することに気をつけてください。

(ii)スプラッシュ画面を表示する
無かったら無かったでいいのですが、あるとそれっぽくなるスプラッシュ画面。
(アプリ起動時に1〜2秒表示される静止画像です)
自分は実行可能JARのマニフェストファイルManifest.mfに記述して
スプラッシュ画面を表示していたのですが、アプリケーションバンドル化すると
動かなくなりました。
これも、Info.plistで指定するみたいです。
http://d.hatena.ne.jp/seraphy/20100624

Info.plistに追加する行は以下です。

<plist> 
 <dict>
    <key>Java</key>  
   <dict>     
    <key>SplashFile</key>     
    <string>$APP_PACKAGE/splash.png</string>   
  </dict> 
 </dict> 
</plist>

splash.pngというスプラッシュ用の画像ファイルを任意の位置に置き、
その位置をSplashFile以下で指定します。
$APP_PACKAGEはappのShow Package contentsからのルートである、
Contentsと同階層を指すようです。
ちなみに、Java SE6以上(1.6)でバンドルする必要があるとのことなので、
Jar Bunlderの設定でJavaのバージョン設定に注意してください。


パッケージインストーラの作成についてもやってみたいと思います。