タイトルJava Watch on the X》4 - アプリケーションをパッケージとしてビルドする(3)実行時に必要な情報カテゴリーProjectBuilder/Interface Builder, Java, Java Watch on the X
作成日2002/1/15 14:13:22作成者新居雅行
Javaの実行バイナリはclassファイルに保存されている。あるいはそのclassファイルをアーカイブしたjarやzipファイルができあがる。こうしたファイルは、プラットフォームで実行可能なバイナリではなく、JavaのVertual Machineで稼働可能な実行バイナリである。つまり、そのままでは起動できないのである。そのため、汎用的にはjavaコマンドで実行できるようになっており、Mac OS Xでも同様である。その場合には、アプリケーションであれば最低限でもどのクラスから実行をはじめるのかということを指定するし、クラスパスなどを指定する必要がある。また、その指定方法もいくつかのバリエーションがある。こうした、Javaの実行のために必要な情報の供給を、Mac OS Xでのアプリケーションパッケージはどのように行うのかを解説しよう。

――――Mainクラスの設定
Javaのアプリケーションは、あるクラスにあるクラスメソッドのmainを呼び出すところから実行が始まる。どのクラスのmainメソッドを呼び出すのかを実行時に指定しなければならない。
まず、パッケージのContents/Resources/MRJApp.propertiesファイルで設定する場合は、以下のような記述を含めておく。左がキーワードで、イコールの右側に、mainメソッドのあるクラスを指定する。

com.apple.mrj.application.main=SwingAppTest

プロジェクトにMRJApp.propertiesファイルがある場合には、それをProject Builder上で編集すれば良いが、基本的にはこの設定は最初から行われている。

◇MRJApp.propertiesファイルでの設定
 

一方、ターゲットの設定を「プロジェクト」メニューの「アクティブターゲットの編集」(Command+option+E)を選択するなどして表示し、「アプリケーション設定」のタブで「詳細表示」を選択した場合、プロパティリストでの、JavaのカテゴリにあるMainClassの項目として、mainメソッドのあるクラスを指定する。つまり、実行するパッケージでは、Info.plistの項目で、メインのクラスを指定できるということだ。

◇アプリケーション設定にメインクラスを設定する
 

いずれにしても最初から設定されているので、プロジェクト名と同名のクラスにmainメソッドがある場合には特に変更する必要はない。mainを実行するクラスを変更したい場合や、あるいはpackage文などを記述して、クラス名が階層化された場合には、これらの設定を変更する必要があるだろう。たとえば、SwingAppTest.javaファイルに「package jp.locus.msyk;」といった記述がトップに入れば、SwingAppTestの代わりにクラスへのフルパス名である「jp.locus.msyk.SwingAppTest」といった指定を行う必要がある。

MRJApp.propertiesの利用をやめて、ターゲットのアプリケーション設定を利用するように変更したいのであれば、「詳細表示」にして設定を加えるが、まず、「Java」というプロパティを加えて、そのタイプを「辞書」にする。「Java」はキータイプするが、タイプについてはポップアップメニューから選ぶ。

 

そうすると、階層化された項目ができる。「Java」の項目の左側の三角形をクリックして▼の向きにする。そして「Java」の項目を選択すると、上部のボタンが「下位に新規作成」となる。その状態で新しい項目を作る。

 

そして、新たに下位のレベルに作られた項目の左側のプロパティ名を「MainClass」、右側にはmainクラスのあるクラス名を指定すれば良い。

 

――――クラスパスの設定とライブラリ参照
Javaのアプリケーションでは、もう1つ設定を行わないといけないものがある。実行するclassを含むパスであるが、通常は、指定した名前(デフォルトはプロジェクトと同じ名前)の.jarファイルである。MRJApp.propertiesファイルでは、

com.apple.mrj.application.classpath = Contents/Resources/Java/SwngAppTest.jar

のように記述を行う。
一方、ターゲットのアプリケーション設定では、Javaのカテゴリの中の「ClassPath」というプロパティに対して設定を行う。設定結果は、MRJApp.propertiesファイルの場合と異なって、「$JAVAROOT/JavaSwingAppTest.jar」のようになっている。$JAVAROOTは、Javaのアーカイブファイルなどを入れておく規定のフォルダを指すものだ。ここでの設定は、絶対パスでなければならないようだ。Appleの文書ではMRJApp.propertiesファイルの設定と同様にできると記載されているが、相対パスを記述するとエラーになる。$JAVAROOT以外にアプリケーションパッケージのルート、つまり.appフォルダを指すものとして、$APP_PACKAGEというキーワードも利用できる。

別のプロジェクトで作成したライブラリなどを、jarファイルで供給されることもある。それを利用したい場合には、「プロジェクト」メニューの「ファイルを追加」などを使って、プロジェクトに登録する。このとき、そのままだと絶対パスでライブラリファイルを参照するので、必要なら相対パスにするなどの設定の変更を行なう。追加時に出てくるダイアログボックスで設定できる。
すると、ターゲット設定の「ファイルとビルドフェーズ」ではFrameworks & Librariesに登録したファイルが加わる。これによりコンパイル時にはこのライブラリのjarファイルを参照するため、ライブラリのjarファイルにあるクラスを使ったプログラムが可能となる。

◇登録されたjar形式のライブラリ
 

このライブラリを実行時にも使うようにするいちばん簡単な方法は、ファイル名の右の方に出てくるMergeのチェックを入れることだ。そうすると、アプリケーションパッケージに作成するjarファイルに、ライブラリの中身もマージしてしまうので、実行時にも必要なクラスへの参照ができるようになる。
ライブラリをパッケージとはまったく別のファイルとして供給する場合には、MRJApp.propertiesファイルでは、

com.apple.mrj.application.classpath = 元からあるパス:ライブラリへのパス

のように、元から設定されているパスの後に、半角のコロンで区切って、ライブラリへのパスを記述する。ライブラリへのパスは絶対パスでもかまわないし、相対パスでもかまわない。そうすると、実行時に複数のjarファイルをクラスパスとして認識できるようになる。

一方、アプリケーション設定で「詳細設定」を行うときに、JavaのClassPathでも複数のjarファイルを指定できることになっている。Appleの文書では、コロンで区切るか、あるいは文字列の配列にするという方法ができるとなっているが、どいうもこれはできないようだ。コロンで区切ると、コロンも含めた1つのパスとして認識してしまって正しくファイルの指定ができない。また、文字列の配列を作った場合、Java以下のプロパティはStringでなければならないという実行時のエラーが出る。同名のプロパティは同一階層には指定できないので、とりあえずお手上げである。複数のjarファイルを参照して実行する場合は、とりあえずは、MRJApp.propertiesファイルを使うことになるだろう。(Mac OS X 10.1.2、Dec 2001版Developer Toolsの場合)

MRJApp.propertiesファイルと、アプリケーション設定(すなわちInfo.plist)ファイルでは、実行時には後者の方が優先される。今回説明した、メインクラスとクラスパスは必ず指定しなければならない設定であるが、もし、Info.plistに「Java」の項目があると、MRJApp.propertiesファイルは無視されてしまう。従って、アプリケーション設定で片方だけを設定するというわけにはいかず、メインクラスを指定するとクラスパスも必ず指定しなければならない。
(この項、続く)
関連リンク