Java 7が必要な実行可能jarをappにする方法です。ためしに航海日誌 (艦これ専用ソフトウェア)”)でやってみる。

必要な道具

Command Line Tools

ターミナルでxcode-select --installとかやると、「Command Line Toolsが必要だけど入れる?」みたいなこと訊いてくるのでそれで入れます。

Apache Ant

Java Developer Packageをインストールするのが、設定とか楽だと思います。Pacifistを使用してAntの入っているJava Toolsだけインストールすることもできます。

これだとAntが古いので、Homebrewから入れたりしたほうがいいです。

JDK7

当たり前だけど要ります。Oracleのページから入れます。

Java SE Development Kit 7 – Downloads | Oracle Technology Network | Oracle

Antから参照するのにJAVA_HOMEを設定しとかないといけないみたいなので、インストール後にvi ~/.bash_profileで.bash_profileに以下を書き込みます。

export JAVA_HOME=$(/usr/libexec/java_home)

ESCでinsertを抜けて、:wqで保存して終了。source .bash_profileで再読み込みを忘れずに。

Xcode

メインのツールであるAppBundlerが10.8 SDKを要求してくるので、容量取るから入れたくないけど必要です。Mac App Storeから入れます。

材料の準備

AppBundler

Oracle純正のAppBundlerは貧弱なため、The Infinite Kindによるフォークを使用します。

infinitekind / appbundler — Bitbucketからソースコードをダウンロードします。

  1. 「ダウンロード」のリンクを開くとzipファイルが落ちてくるので、展開します。Mercurialがあるならhg cloneしてもいいです。
  2. そのあとそのフォルダに移動します。ターミナルに`` と入力して、フォルダをドラッグ&ドロップしてくると楽です。
  3. antと入力して実行すると、現在のディレクトリにある「build.xml」ファイルに従ってビルドが行われます。正常に終わると、新しくできた「bin」フォルダの中に「appbundler-1.0ea.jar」というファイルが出来ています。
  4. 「appbundler-1.0ea.jar」ファイルを、Antのlibディレクトリに入れます。AntをJava Developer Packageからインストールした場合、場所は/usr/share/ant/lib/です。これでAppBundlerの準備は完了です。

航海日誌

公式サイト”)から実行ファイル(ソースコードではありません)をダウンロードして展開します。

build.xml

Antは、build.xmlというファイルに書かれている内容に従って処理を行います。なので、build.xmlを用意する必要があります。以下の内容を「build.xml」というファイル名で、航海日誌のフォルダ(「logbook.jar」のある場所)に保存します。エンコードはUTF-8です。

<?xml version="1.0" encoding="UTF-8" ?>

<project default="create_app">

    <taskdef name="bundleapp"
            classname="com.oracle.appbundler.AppBundlerTask"
            classpath="lib/appbundler-1.0ea.jar"/>

    <property environment="env"/>

    <property name="appname" value="logbook"/>
    <!-- 上の行のlogbookの部分が.appの名前になります -->

    <target name="create_app">
        <bundleapp outputdirectory="."
            name="${appname}"
            displayname="logbook"
            identifier="net.sanaechan.kancolle"
            WorkingDirectory="$APP_ROOT/Contents/Java">
            mainclassname="logbook.gui.ApplicationMain">
            <classpath file="logbook.jar"/>
            <option value="-XstartOnFirstThread"/> <!-- 起動時オプション -->
        </bundleapp>
        <copy todir="./${appname}.app/Contents/Java">
            <fileset dir=".">
                <exclude name="logbook.jar"/>
                <exclude name="build.xml"/>
                <exclude name="${appname}.app/**/*"/>
                <exclude name="${appname}.app"/>
            </fileset>
        </copy>
    </target>

</project>

調理

AppBundlerのときと同じように、build.xmlのあるディレクトリに移動してantを実行します。すぐに.appの出来上がり!

要するに

tree -L 3で出来上がった.app内の構造を調べてみると、以下のようになります。

.
└── Contents
    ├── Info.plist
    ├── Java
    │   ├── logbook.jar
    │   ├── logbook_lib
    │   ├── readme.txt
    │   └── sound
    ├── MacOS
    │   └── JavaAppLauncher
    ├── PkgInfo
    ├── PlugIns
    └── Resources
        ├── GenericApp.icns
        └── en.lproj

.appをダブルクリックするとJavaAppLauncherがInfo.plistの通りにJavaを実行します。つまり、肝のJavaAppLauncherとInfo.plistさえどうにかできれば、build.xmlを書くよりも楽にアプリケーションにできる可能性があります。どっちが楽かと言われると判断の難しいところではありますが。