Javaプログラムのコンパイルと実行
com.sample.appパッケージのMain.javaを実行したいとする。
FQCN(Fully Qualified Class Name:完全修飾クラス名)はcom.sample.app.Main。
コンパイルする
$ cdコマンドでMain.javaを配置したディレクトリに移動してから、$ javacコマンドを実行する。
$ javac Main.java
実行する
コンパイルによって生成されたクラスファイル(Main.class)を実行するには、$ javaコマンドを実行する。
$ java com.sample.app.Main
$ javacコマンドはファイル名を指定する
$ javaコマンドはクラス名(FQCN)を指定する
配布
Javaのプログラムを配布する場合を考える。必要なものは以下の2つ。
- コンパイルしたクラスファイル(物理的なデータ)
-
main()を持つクラス名(どのクラスかという情報)
通常、プログラムは上の例のようにMain.javaだけで構成されることはなく、複数のクラスやライブラリなどを使用するため、それらをコンパイルしたクラスファイルなどが全て配布対象になる。JAR形式のアーカイブにしてもOK。
main()はプログラムの起点となる場所なので、エントリポイントと呼ばれる。javaコマンドにはmain()の存在するクラス名(FQCN)が必要。
JARファイルにした場合、MANIFEST.MF内にエントリポイントを記述する方法もある。
$ java FQCNが実行されると、JVM(Java Virtual Machine)は、FQCNで指定されたクラスのmain()からプログラムを実行するが、main()の中で使用される、別ファイルの別クラスについては、クラスパスに指定する必要がある。JVMは、クラスパス以外に配置されたクラスファイルを見つけることができない。
クラスパス
-
クラスパスはJVMが高速に目的のクラスファイルを検索するためのヒントとして利用される。具体的には、クラスローダは、クラスパスに指定されたパスからクラスファイルを探し出す。
-
クラスパスには、フォルダやJarファイルが指定可能。
-
クラスローダは、クラスパスに含まれるJARファイルの中までは検索しない。そのため、JARファイル内を指定したい場合は、JARファイル自体をクラスパスに指定する必要がある。
-
クラスパスに指定したいクラスがデフォルトパッケージではなく、特定のパッケージに属している場合、クラスローダはクラスパスを基準位置として、パッケージをフォルダ階層とみなして検索を行う。具体的には、
C:¥aaaをクラスパスに指定し、com.sample.appパッケージのbbb.classを検索させたい場合、bbb.classはC:¥aaa¥com¥sample¥appフォルダに配置する必要がある。