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というJavaのGUIプログラミングで一般的な
ツールキットを使いました。
このページを見ればほとんどのことはできるのでは、
というくらいまとまっています。
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>
(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というスプラッシュ用の画像ファイルを任意の位置に置き、
その位置を
$APP_PACKAGEはappのShow Package contentsからのルートである、
Contentsと同階層を指すようです。
ちなみに、Java SE6以上(1.6)でバンドルする必要があるとのことなので、
Jar Bunlderの設定でJavaのバージョン設定に注意してください。
パッケージインストーラの作成についてもやってみたいと思います。