このページでは、単純な Java アプリケーションを Mac で配布可能なバージョンに変換する方法について詳しく説明します。流れを追うには、Java チュートリアルから ButtonDemo (.zip) の例をダウンロードしてください。この例は、Ant ユーティリティーを使用する NetBeans を使って作成されました。NetBeans を起動しなくても、コマンド行から必要なすべてのツールを実行し、必要なすべての編集を行うことができます。Ant ツールが必要です。
Java アプリケーションを作成したあと、それを配備用にバンドルする必要があるとします。それには次の手順が必要となります。
この段階では ButtonDemo.jar ファイルを作成します。
高レベルプロジェクトディレクトリ内で ant jar を実行し、dist/ButtonDemo.jar ファイルを作成します。この jar ファイルは .app パッケージを作成するために使用されます。
ButtonDemo.app パッケージを作成するには、appbundler ツールを使用します。appbundler は、Mac 向け Oracle JDK の 7u6 バージョンには付属していません。これは、java.net の Java Application Bundler プロジェクトからダウンロードできます。AppBundler のドキュメントも入手可能です。
このドキュメントの執筆時点の最新版である appbundler-1.0.jar をこのドキュメントでは使用します。使用可能な最新版をダウンロードし、適宜ファイル名を読み替えてください。
<?xml version="1.0" encoding="UTF-8"?> <project name="ButtonDemo" default="default" basedir="."> <import file="nbproject/build-impl.xml"/> <taskdef name="bundleapp" classname="com.oracle.appbundler.AppBundlerTask" classpath="lib/appbundler-1.0.jar" /> <target name="bundle-buttonDemo"> <bundleapp outputdirectory="dist" name="ButtonDemo" displayname="Button Demo" identifier="components.ButtonDemo" mainclassname="components.ButtonDemo"> <classpath file="dist/ButtonDemo.jar" /> </bundleapp> </target> </project>
Java アプリケーションを配布するには、サードパーティーソフトウェアに依存しないようにすることをお勧めします。app パッケージに Java Runtime Environment (JRE) を含めるべきです。実際 App Store では、Mac App Store 配布の前提条件として埋め込み JRE の使用が必須となっています。<bundleapp> タスクの runtime サブ要素は、app パッケージに含める JRE のルートを指定します。
この例では、JRE の場所が JAVA_HOME 環境変数を使って定義されています。ただし、開発に使用している JRE とは異なる JRE をバンドルすることを選択する可能性があります。たとえば、7u6 で開発しているが、7u4 をアプリケーションにバンドルする必要があるかもしれません。それに応じて runtime を定義します。
この例では runtime サブ要素が JAVA_HOME を使って定義されているので、それが環境に合わせて正しく構成されていることを確認してください。たとえば .bashrc ファイル内で、JAVA_HOME を次のように定義します。
export JAVA_HOME=`/usr/libexec/java_home`
次の手順を使って、プロジェクトディレクトリの最上位にある build.xml ファイルを変更します。
<property environment="env" />
<runtime dir="${env.JAVA_HOME}" />
結果となる build.xml ファイルは、次のようになるはずです。(新しい行を太字で示しています。)
<?xml version="1.0" encoding="UTF-8"?> <project name="ButtonDemo" default="default" basedir="."> <import file="nbproject/build-impl.xml"/> <property environment="env" /> <taskdef name="bundleapp" classname="com.oracle.appbundler.AppBundlerTask" classpath="lib/appbundler-1.0ea.jar" /> <target name="bundle-buttonDemo"> <bundleapp outputdirectory="dist" name="ButtonDemo" displayname="Button Demo" identifier="components.ButtonDemo" mainclassname="components.ButtonDemo"> <runtime dir="${env.JAVA_HOME}" /> <classpath file="dist/ButtonDemo.jar" /> </bundleapp> </target> </project>
ant bundle-buttonDemo コマンドを使って ButtonDemo.app の新バージョンを作成します。結果となるバージョンでは、app パッケージに JRE が含まれています。このことを確認するには、app パッケージ内の Contents/PlugIns ディレクトリを調べます。
Mountain Lion (OS X 10.8) で導入された Gatekeeper 機能を使うと、ダウンロードされたアプリケーションのセキュリティーレベルをユーザーが設定できます。Gatekeeper はデフォルトでは、OS X App Store のアプリケーションと Developer ID で署名されたアプリケーションのみを許可するように設定されています。Apple から提供された Developer ID 証明書でアプリケーションに署名しないかぎり、Gatekeeper のデフォルト設定を持つシステム上ではアプリケーションが起動しません。
使用可能な署名証明書については、developer.apple.com の「Code Signing Tasks」を参照してください。
署名証明書には、Common Name という名前のフィールドが含まれています。この Common Name フィールドの文字列を使ってアプリケーションに署名します。
次の例に示すように、codesign(1) ツールを使ってアプリケーションに署名します。
% codesign -s "Developer ID Application: CommonNameFromCertificate" ExampleApp.app
アプリケーションが署名されたことを確認できるように、次のコマンドは、アプリケーションの署名ステータスに関する情報を提供します。
% codesign -d --verbose=4 ExampleApp.app
Gatekeeper が有効な状態でアプリケーションを起動できるか確認するには、spctl コマンドを使用します。
% spctl --assess --verbose=4 --type execute ExampleApp.app
--verbose タグを取り去って出力が一切表示されなければ、それは「成功」を示しています。
詳細は、developer.apple.com の「Distributing Outside the Mac App Store」を参照してください。
アプリケーションを Mac App Store 向けにパッケージ化する方法は、アプリケーションに署名する段階までは、通常の配布用にパッケージ化する方法に似ています。Mac App Store 向けにアプリケーションを署名するには、いくつかの追加手順を行い、異なる種類の証明書を使用する必要があります。
アプリケーション ID を作成したあと、そのアプリケーション ID の配布証明書を取得する必要があります。Application Loader を使ってアプリケーションを送信してください。詳細は、(developer.apple.com 上の) 次の各リンクを参照してください。