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
フォルダに配置する必要がある。