2011年10月19日水曜日

[Java][コマンドライン]Javaプログラムコマンドライン起動

eclipseの便利さに慣れてしまうと、コマンドラインでJavaプログラムをコンパイルすることはないが、現場レベルでは往々にしてコマンドライン起動がありうる。

例えばサーバ上でJavaプログラムを動かしている場合、サーバ機には開発ツール等の余計なものは入っていないはずだ。
サーバ運用に必要な最小限の構成を組み、セキュリティアップデートなども記録して行っているはずである。
開発用サーバならまだしも、本番機にはまずeclipseは入っていない。

こうしたときに、サーバにアップデートした検証用プログラムや新しいプログラムを起動するためには、コマンドライン起動ができなくてはならない。
そのようなケースのために、手順を記述する。

例えばプロジェクトルートSampleProject、パッケージ名sample、クラスファイル名SampleProgram.classという構成でプログラムを動かす場合を考えてみる。
ディレクトリ構成は、下記を想定する。

[dir]SampleProject
  [dir]bin
    [dir]sample
      SampleProgram.class
  [dir]src
    [dir]sample
      SampleProgram.java

ディレクトリには[dir]と記述している。
eclipseでプログラムを作った場合、通常は上記の構成となるだろう。
起動のためには、SampleProjectディレクトリで次のコマンドを打つ。

java -classpath .:./bin sample.SampleProgram

クラスパスオプション("-classpath [クラスパス]")には".:./bin"を指定している。
ドット(.)はカレントディレクトリ、./binはカレントディレクトリ配下のbinディレクトリを示している。
複数のディレクトリをつなぐ場合は、コロン(:)を用いる。(Linuxの場合、Windowsならセミコロン(;))
つまり「クラスパスとしてカレントディレクトリ及びbinディレクトリを指定する」という意味になる。
(複数ディレクトリ指定のためにカレントディレクトリも入れたが、本当は./binだけでよい)

続く"sample.SampleProgam"は「sampleパッケージのSampleProgram.class」を意味している。
Javaではプログラムをひとまとまりとするためにパッケージを用いる。
パッケージ名のディレクトリ配下に、そのパッケージに含めるクラスファイルを格納する。
コマンドライン起動の場合は、クラスパスでbinディレクトリを指定したら、その配下にあるクラスファイルの名前を".class"抜きで記述する。

ちなみに、"sample.SampleProgram"を"SampleProgram"とだけ書くのはNG。
プログラムは起動しない。
[パッケージ名].[クラスファイル名(".class"を抜いた名称)]
という記述が決まりとなっている。(完全修飾名)

次に、コンパイルコマンドについて記述する。
eclipseを使っている場合、サーバとJavaのバージョンが合っていればWindowsで作ったクラスファイルをLinuxで起動しても問題なく動く。
通常はコンパイルすることはないだろう。
だが、修正したファイルをすぐに試したい場合など、手動コンパイルの出番がないわけではない。

少々長いが、下記のようにコマンドを打つことで、手動コンパイルができる。
コマンドを実行するディレクトリは、先ほどと同じくSampleProjectディレクトリである。

javac -sourcepath ./src/sample -classpath ./bin -d ./bin ./src/sample/SampleProgram.java

"-sourcepath [ソースパス]"でソースファイルがあるパス名を指定する。
"-classpath [クラスパス名]"でクラスパスを指定するのは、実行コマンドと同じである。
"-d [出力先ディレクトリ]"はクラスファイルの出力先ディレクトリを示す。

クラスパス、出力先ディレクトリともに、パッケージディレクトリまでは指定してはいけない。
sampleパッケージだからbin/sample配下にクラスファイルを出力しようとして、下記のように書くのはNG。

-d ./bin/sample

(↑)こう書くと、bin/sample/sample/SampleProgram.classが出来てしまう。
(sampleの下にsampleが出てくる)
Javaコンパイラはpackage宣言を参照して、自動的にパッケージディレクトリを作るため、"./bin"までの指定が正しい。
なお、依存関係にあるクラスは依存先を最初にコンパイルし、クラスパスを通しておかないと、依存元のコンパイルでエラーとなるので注意が必要である。

上記のコマンドライン起動がうまくいったら、シェルスクリプトやバッチファイルにコマンドを記述し、次回以降は面倒なコマンドをフルに打たなくても起動できるようにするのがオススメである。

0 件のコメント:

コメントを投稿