javac - Javaコンパイラ

javac により、Java プログラムがコンパイルされます。

形式

javac [ options ] filename.java ...

機能説明

javac コマンドにより、Java ソースコードが Java バイトコードにコンパイルされます。そして Java インタプリタ(java)を使用して Java バイトコードを実行します。

Java ソースコードは、ファイル名の最後に .java 拡張子が付いたファイルでなければなりません。また、クラスが public になっていたり、他のソースファイルから参照される場合、そのファイル名は classname.java のように、クラス名から構成されなければなりません。

javac でコンパイルすると、ソースファイルで定義される各クラスごとに、バイトコードを classname.class という名前の クラスファイル に格納します。-d オプションを指定しない場合、コンパイラは、対応するソースファイルと同じディレクトリにクラスファイルを置きます。

コンパイラがユーザ自身のクラスを参照しなければならない場合、場所を指定する必要があります。場所を指定するために、-classpath オプションか CLASSPATH 環境変数を使用してください。javacが、コマンドライン引数として直接指定したファイルの中でまだ定義されていないクラスを探す、一連のディレクトリ (または zip ファイル)がクラスパスです。コンパイラは、必要なソースファイルとクラスファイルの双方をクラスパスから探し、未定義なクラスを解決します。その際に、ソースファイルとクラスファイルの双方が存在しつつ、ソースファイルのほうが新しい場合には再コンパイルします(そしてクラスファイルを再生成します)。

コンパイラの出力メッセージを System.out に送り出すためには、プロパティ javac.pipe.output を true にセットします。出力メッセージを System.err に送り出すためには、javac.pipe.output を false にセットします (つまりセットしません)。

オプション

-classpath path
javac がクラスを探すために使用するパスを指定します。デフォルトまたは CLASSPATH 環境変数が設定されている場合、その設定をオーバーライドします。ディレクトリはコロン(UNIX版)やセミコロン(Windows版)で分割します。クラスパス上にソースファイルを含む場合、これはしばしば useful です。常にパスの最後にシステムクラスを含むようにしなければなりません。たとえば以下の様に指定します:
   javac -classpath .:/home/avh/classes:/usr/local/java/classes ...

-d directory
クラスファイル階層のルートディレクトリを指定します。たとえば、以下のように指定します。
   javac -d /home/avh/classes MyProgram.java
MyProgram.java ソースファイルをコンパイルして作られるクラスファイルが、ディレクトリ /home/avh/classes に保存されます。もし、そのクラスがパッケージ demos/awt と定義されている場合、ディレクトリ /home/avh/classes/demos/awt に保存されます。

-d オプションと -classpath オプションによる効果は、独立的であることに注意してください。コンパイラはクラスパスからしか読み取らないし、出力ディレクトリにしか書き込みません。出力ディレクトリがクラスパス上にあれば、これはかなり useful です。-dオプションが指定されていない場合、ソースファイルは、パッケージ構成を示す階層ディレクトリに格納されます。


-encoding encoding name
EUCJIS/SJIS などのソースファイルエンコーディング名を指定します。このオプションを指定しない場合、プラットフォームのデフォルトのコンバータが使用されます。

-deprecation
デプリケーテッド(使われることのない?)メンバーやクラスを使用したりオーバーライドした場合に警告する。もし、コメントに @deprecated タグが 含まれている場合、そのクラスやメンバーはデプリケーテッドです。コンパイラは、-deprecation オプションが指定されようがなかろうが、デプリケーテッドメンバーやクラスを使用したりオーバーライドした場合、コンパイル終了後には警告を出します。

もしデプリケーテッドメンバーやクラスをソースファイルがある場合、再コンパイルされます。しかし、意味が良くわからんなあ。


-nowarn
警告をオフにします。このオプションを指定した場合、コンパイラはいかなる警告も表示しません。

-g
デバッガのためのデバッグテーブルが生成されます。デバッグテーブルは、行番号とローカル変数についての情報を含みます。デフォルトでは、行番号だけが生成されます。

Version 1.2 では、 -g-O オプションを同時に指定することができます。この場合、オプチマイズによってデバッグがしにくくなる可能性があります。例えば、オプチマイズによってコードを簡略化されたため意図したステップを実行しないなど。


-g:nodebug
行番号やローカル変数についてのデバッグ情報を生成しない。

-O
コンパイラはオプチマイズされたコードを生成します。このオプションを指定すると、コンパイル時間が遅くなり、生成されるクラスファイルも大きくなります。また、デバッグしにくいコードになります。

互換性に問題が出る。時々イリーガルなバイトコードを生成する。それって使うなって言っているようなものじゃないの? -O オプションを使うなら、必ず -depend オプションを指定して -gオプションは指定しないほうがいいってさ。


-O:interclass
ううむ、このオプチマイズオプションも怪しいことが書いてあるなあ~。バイナリーコンパチビリティーが失われるとか、非常に注意してつかえとか....
結論、このオプチマイズオプションを使うのは止めましょう。どうしても使いたいなら、まず "The Java Language Specification section 13.4.21" を読んで詳細を把握してから使いましょう。

-depend オプションを指定するのを推奨。


-verbose
何のソースファイルがコンパイルされ、何のクラスファイルがロードされているかについての情報を、コンパイラとリンカに表示させます。

-depend
このオプションは、他のクラスファイルから参照されるクラスファイルを再コンパイルさせます。普通は、他のソースコードから参照されるファイルのうち、欠落した、または古くなったクラスファイルを再コンパイルするだけです。

-Jjavaoption
コンパイラを実行する Java インタプリタへ、文字列 javaoption を 1 つの引数として渡します。引数にはスペースを入れません。複数の指定する場合、すべて -J で始め一つずつ区分しなければなりません。これは、コンパイラの実行環境またはメモリの利用の調整に有効です。

サンプル

クラスのコンパイル

ソースファイルが /home/ws/src/java/awt/*.java の場合、クラスを置きたいディレクトリに移動し、ソースファイルを指定してコンパイラを起動する。

  % cd /home/ws/src/java/awt/
  % javac Button.java Canvas.java

二つのクラスがコンパイルされました。

環境変数

CLASSPATH
ユーザ定義クラスへのパスをシステムに指定します。ディレクトリはコロン(UNIX版)やセミコロン(Windows版)で分割します。たとえば、
UNIXの場合
   .:/home/me/classes:/usr/local/java/classes.jar

Windowsの場合
   .;C:\home\me\classes;C:\java\classes.jar