パッケージが定義された場合の開発環境

パッケージを定義した場合の開発環境の設定方法について解説します。
ある程度規模が大きなアプリケーションを開発する場合には、 パッケージの定義を行うべきでしょう。 パッケージを定義した場合の開発環境については、 多少理解しておくべきルールが存在します。
  1. パッケージと作業ディレクトリの関係
  2. 環境変数 CLASSPATH
Javaのパッケージはバイトコードのファイルが含まれるディレクトリに対応します。 したがってパッケージの宣言を行った場合には、 package文で宣言されたパッケージ名と同じ名前のディレクトリを作成しておき、 その内部で作業を行う必要があります。 サブパッケージが宣言される場合には、 ディレクトリの階層構造を含めて同一の名前にしておきます。 たとえば、あるソースファイルの先頭で、 次のようなパッケージ文の宣言があったとしましょう。

package mygame.network;

上の宣言の意味は「パッケージ mygame の中のサブパッケージ network」を 意味します。このソースプログラム内に定義されたクラスのバイトコードは、 最終的に必ずディレクトリ mygameの下のディレクトリ networkの中に置かれなくては いけません。(通常はソースファイルも同じディレクトリに置くのが普通でしょう。)
さて、上のディレクトリ名は相対指定になっていることに気付いたと思います。 パッケージ名に対応するディレクトリの出発点はどこにすればいいのでしょうか? それを決めるのが CLASSPATH と呼ばれる環境変数です。 CLASSPATHにはパッケージ名をたどってクラスのバイトコードを捜しに行く出発点の ディレクトリを指定します。出発点のディレクトリは複数指定することが可能です。 環境変数の設定法方はシステムの環境に多少依存します。 たとえば Solarisの Kシェル環境で、カレントディレクトリと /home/java ディレクトリの2つを CLASSPATHに指定したい場合には次のようにします。

CLASSPATH=.:/home/java
export CLASSPATH

クラスパスとコマンド実行を検索するパスとを混同しないように注意してください。 javaコマンドでクラスを呼び出す時に指定するクラスの名前は、 CLASSPATHを起点とします。仮に呼び出したクラスのパッケージが mygame.network でクラス名が Sender だったとします。 このクラスを呼び出す場合には、

java  mygame.network.Sender

としなければなりません。バイトコードが存在するのと同一のディレクトリに いたとしても、上のようにする必要があり、パッケージ名も含めて呼び出さないと 「クラスが見つからない」ということになります。 慣れないうちは混乱しやすいので注意してください。