javac(1)

名前
javac - Java プログラミング言語コンパイラ

    o   形式

    o   説明

    o   オプション

    o   コマンド行引数ファイル

    o   注釈処理

    o   型の検索

    o   プログラマティックインタフェース

    o   例

    o   関連項目

形式

        javac [ options ] [ sourcefiles ] [ classes ] [ @argfiles ]

引数は順不同です。

        options
            コマンド行オプション。

        sourcefiles
            コンパイルされる 1 つ以上のソースファイル (MyClass.java など)

        classes
            注釈の処理対象となる 1 つ以上のクラス (MyPackage.MyClass など)

        @argfiles
            オプションとソースファイルを列挙した 1 つ以上のファイル。このファイルの中では、-J オプションは指定できません。

説明

javac ツールは、Java プログラミング言語で記述されたクラスとインタフェースの定義を読み取り、バイトコードのクラスファイルにコンパイルします。また、Java ソースファイルおよびクラス内の注釈の処理も行います。

ソースコードのファイル名を javac に渡すには、次の 2 つの方法があります。

    o   ソースファイルの数が少ない場合は、ファイル名をコマンド行で直接指定します。

    o   ソースファイルの数が多い場合は、ファイル名を空白または改行で区切って、1 つのファイルに列挙します。次に、このリストファイル名の先頭に @ を付けて、javac のコマンド行で指定します。

ソースコードのファイル名は .java 拡張子を、クラスのファイル名は .class 拡張子を持っていなければなりません。 また、ソースファイルとクラスファイルのどちらも、該当するクラスに対応するルート名を持っていなければなりません。たとえば、MyClass という名前のクラスは、MyClass.java という名前のソースファイルに記述します。 このソースファイルは、MyClass.class という名前のバイトコードクラスファイルにコンパイルされます。

内部クラスが定義されていると、追加のクラスファイルが生成されます。これらのクラスファイルの名前は、MyClass$MyInnerClass.class のように、外部クラス名と内部クラス名を組み合わせたものになります。

ソースファイルは、パッケージツリーを反映したディレクトリツリーに配置する必要があります。たとえば、すべてのソースファイルを /workspace に置いている場合、com.mysoft.mypack.MyClass のソースコードは /workspace/com/mysoft/mypack/MyClass.java にある必要があります。

デフォルトでは、コンパイラは、各クラスファイルを対応するソースファイルと同じディレクトリに置きます。別の出力先ディレクトリを指定するには、-d を使用します (このあとのオプションを参照)。

オプション

コンパイラには、現在の開発環境でサポートされており、将来のリリースでもサポートされる標準オプションのセットがあります。これ以外の非標準オプションは、現在の仮想マシンおよびコンパイラの実装に固有のオプションで、将来に変更される可能性があります。非標準オプションは、-X で始まります。

  標準オプション

        -Akey[=value]
            注釈プロセッサに渡されるオプション。これらは、javac によって直接解釈されず、個々のプロセッサによって使用されます。 key には、1 つまたは複数の識別子を「.」で区切ったものを指定してください。

        -cp path または -classpath path
            ユーザーのクラスファイルおよび (場合によっては) 注釈プロセッサやソースファイルの検索場所を指定します。このクラスパスは CLASSPATH 環境変数のユーザークラスパスをオーバーライドします。CLASSPATH、-cp、-classpath のいずれも指定されていない場合、ユーザークラスパスは、現在のディレクトリになります。詳細は、 「クラスパスの設定」 @
            http://java.sun.com/javase/6/docs/technotes/tools/index.html#classpathを参照してください。

        -sourcepath オプションが指定されていない場合は、ソースファイルもユーザークラスパスから検索されます。

        -processorpath オプションが指定されていない場合は、注釈プロセッサもユーザークラスパスから検索されます。

        便宜上、* のベース名を含むクラスパス要素は、ディレクトリ内の拡張子 .jar または .JAR を持つすべてのファイルのリストを指定するのと同じとみなされます。
        たとえば、ディレクトリ foo に a.jar と b.JAR が含まれている場合、クラスパス要素 foo/* は A.jar:b.JAR に展開されます。 ただし、JAR ファイルの順番は指定されません。このリストには、隠しファイルも含め、指定されたディレクトリ内のすべての JAR ファイルが含まれます。* だけから成るクラスパスエントリは、カレントディレクトリ内のすべての JAR ファイルのリストに展開されます。CLASSPATH 環境変数も、定義時には同様に展開されます。注:コマンド行環境の構成によっては、javac -cp "*.jar" MyClass.java などのように、ワイルドカード文字を引用符で囲まなければならない場合があります。

        -Djava.ext.dirs=directories
            インストール型拡張機能の位置をオーバーライドします。

        -Djava.endorsed.dirs=directories
            承認された標準パスの位置をオーバーライドします。

        -d directory
            クラスファイルの出力先ディレクトリを設定します。そのディレクトリはすでに存在している必要があります。 javac はディレクトリを作成しません。クラスがパッケージの一部である場合、javac は、必要に応じてディレクトリを作成し、パッケージ名を反映したサブディレクトリにクラスファイルを置きます。たとえば、-d /home/myclasses と指定し、クラスの名前が com.mypackage.MyClass である場合、クラスファイルは /home/myclasses/com/mypackage/MyClass.class になります。

        -d が指定されなかった場合、javac は各クラスファイルを、その生成元となるソースファイルと同じディレクトリ内に格納します。

        注:-d で指定したディレクトリはユーザークラスパスに自動的には追加されません。

        -deprecation
            推奨されないメンバーやクラスが、使用またはオーバーライドされるたびに説明を表示します。-deprecation が指定されていない場合、javac は、推奨されないメンバーやクラスを使用またはオーバーライドしているソースファイルの要約を表示します。-deprecation は -Xlint:deprecation の省略表記です。

        -encoding encoding
            ソースファイルのエンコーディング名 (EUC-JP や UTF-8 など) を指定します。-encoding が指定されていない場合は、プラットフォームのデフォルトコンバータが使われます。

        -g  局所変数を含むすべてのデバッグ情報を生成します。デフォルトでは、行番号およびソースファイル情報だけが生成されます。

        -g:none
            デバッグ情報を生成しません。

        -g:{keyword list}
            コンマで区切られたキーワードリストにより指定された、特定の種類のデバッグ情報だけを生成します。次のキーワードが有効です。

            source
                ソースファイルのデバッグ情報

            lines
                行番号のデバッグ情報

            vars
                局所変数のデバッグ情報

        -help
            標準オプションの形式を表示します。

        -implicit:{class,none}
            暗黙的にロードされたソースファイルに対するクラスファイルの生成を制御します。クラスファイルを自動生成するには、-implicit:class を使用します。クラスファイルの生成を抑制するには、-implicit:none を使用します。 このオプションが指定されなかった場合のデフォルト動作は、クラスファイルの自動生成になります。その場合、そのようなクラスファイルが生成された時に注釈処理も実行されると、コンパイラから警告が発行されます。 このオプションが明示的に設定された場合には、警告は発行されません。 「型の検索」を参照してください。

        -nowarn
            警告メッセージを無効にします。これは -Xlint:none と同じ意味です。

        -proc: {none,only}
            注釈処理、コンパイル、その両方、のいずれを実行するかを制御します。-proc:none は、注釈処理なしでコンパイルが実行されることを意味します。-proc:only は、注釈処理だけが実行され、後続のコンパイルはまったく実行されないことを意味します。

        -processor class1[,class2,class3...]
            実行する注釈プロセッサの名前。これを指定した場合、デフォルトの検索処理は省略されます。

        -processorpath path
            注釈プロセッサの検索場所を指定します。 このオプションを使用しなかった場合、クラスパス内でプロセッサの検索が行われます。

        -s dir
            生成されたソースファイルの格納先となるディレクトリを指定します。そのディレクトリはすでに存在している必要があります。 javac は作成しません。クラスがパッケージの一部になっていた場合、コンパイラはそのソースファイルを、パッケージ名を反映したサブディレクトリ内に格納します。 その際、必要に応じてディレクトリを作成します。たとえば、ユーザーが -s /home/mysrc と指定し、クラスの名前が com.mypackage.MyClass であった場合、そのソースファイルは /home/mysrc/com/mypackage/MyClass.java 内に格納されます。

        -source release
            受け付けるソースコードのバージョンを指定します。release には次の値を指定できます。

            1.3 このコンパイラでは、JDK 1.3 以降に導入されたアサーション、総称、または他の言語機能をサポートしません。

            1.4 JDK 1.4 で導入された、アサーションを含むコードを受け付けます。

            1.5 JDK 5 で導入された総称および他の言語機能を含んだコードを受け付けます。

            5   1.5 と同義です。

            1.6 これがデフォルト値です。Java SE 6 では言語に対する変更は導入されませんでしたが、ソースファイル内のエンコーディングエラーが、以前のような「警告」ではなく、「エラー」として報告されるようになりました。

            6   1.6 と同義です。

        -sourcepath sourcepath
            クラスまたはインタフェースの定義を検索するソースコードパスを指定します。ユーザークラスパスと同様に、ソースパスの複数のエントリはコロン (:) で区切ります。 ソースパスのエントリには、ディレクトリ、JAR アーカイブ、または ZIP アーカイブを指定できます。パッケージを使っている場合は、ディレクトリまたはアーカイブ内のローカルパス名がパッケージ名を反映していなければなりません。

        注: クラスパスからクラスだけでなくそのソースも見つかった場合、そのクラスは自動再コンパイルの対象になることがあります。「型の検索」を参照してください。

        -verbose
            詳細な出力を表示します。ロードされるクラスおよびコンパイルされるソースファイルごとの情報が出力されます。

        -X  非標準オプションに関する情報を表示して終了します。

  クロスコンパイルオプション

    デフォルトでは、クラスのコンパイルは、javac が添付されているプラットフォームのブートストラップクラスおよび拡張機能クラスに対して行われます。ただし、javac は、異なる Java プラットフォームに実装されたブートストラップクラスおよび拡張機能クラスに対してコンパイルを行う「クロスコンパイル」もサポートしています。クロスコンパイルを行う場合は、-bootclasspath および -extdirs を使うことが重要です。 このあとの「クロスコンパイルの例」を参照してください。

        -target version
            指定されたバージョンの VM をターゲットにしたクラスファイルを生成します。このクラスファイルは、指定されたターゲット以降のバージョンでは動作しますが、それより前のバージョンの VM では動作しません。有効なターゲットは、1.1、1.2、1.3、1.4、1.5 (5 も可)、および 1.6 (6 も可) です。

        -target のデフォルトは、次のように -source の値によって決まります。

            o   -source が指定されなかった場合、-target の値は 1.6 になります。

            o   -source が1.2 の場合、-target の値は 1.4 になります。

            o   -source が1.3 の場合、-target の値は 1.4 になります。

            o   -source がそれ以外の値の場合はすべて、\-target の値は -source の値になります。

        -bootclasspath bootclasspath
            指定された一連のブートクラスに対してクロスコンパイルを行います。ユーザークラスパスと同様に、ブートクラスパスの複数のエントリはコロン (:) で区切ります。 ブートクラスパスのエントリには、ディレクトリ、JAR アーカイブ、または ZIP アーカイブを指定できます。

        -extdirs directories
            指定された拡張機能ディレクトリに対してクロスコンパイルを行います。directories には、コロンで区切ったディレクトリのリストを指定します。指定したディレクトリ内の各 JAR アーカイブから、クラスファイルが検索されます。

  非標準オプション

        -Xbootclasspath/p:path
            ブートストラップクラスパスの前に追加します。

        -Xbootclasspath/a:path
            ブートストラップクラスパスの後ろに追加します。

        -Xbootclasspath/:path
            ブートストラップクラスファイルの位置をオーバーライドします。

        -Xlint
            推奨されるすべての警告を有効にします。このリリースでは、利用可能なすべての警告が推奨されています。

        -Xlint:none
            Java 言語仕様では指定されていないすべての警告を無効にします。

        -Xlint:-name
            警告 name を無効にします。 ただし、name は、-Xlint:name に使用できる警告名のいずれかになります。 この警告名は次のとおりです。

        -Xlint:unchecked
            Java 言語仕様で指定されている未検査変換警告の詳細を示します。

        -Xlint:path
            存在しないパス (classpath、sourcepath など) ディレクトリについて警告します。

        -Xlint:serial
            serialVersionUID 定義が直列化可能クラスにないことを警告します。

        -Xlint:finally
            正常に完了できない finally 節について警告します。

        -Xlint:fallthrough
            fall-through ケースの switch ブロックをチェックし、検出されたものに対して警告メッセージを表示します。Fall-through ケースは、switch ブロック内の最後のケースを除くケースです。 このコードには break 文は含まれません。 コードの実行をそのケースから次のケースへ移動します。たとえば、この switch ブロック内の case 1 ラベルに続くコードは、break 文で終わっていません。

            switch (x) {
            case 1:
                   System.out.println("1");
                   //  No  break;  statement here.
            case 2:
                   System.out.println("2");
            }

        このコードのコンパイル時に -Xlint:fallthrough フラグが使用されていた場合、コンパイラは 当該ケースの行番号とともに、fall-through ケースの可能性があることを示す警告を発行します。

        -Xmaxerrs number
            印刷するエラーの最大数を設定します。

        -Xmaxwarns number
            印刷する警告の最大数を設定します。

        -Xstdout filename
            コンパイラのメッセージを、指定されたファイルに送ります。デフォルトでは、コンパイラのメッセージは System.err に送られます。

        -Xprefer:{newer,source}
            ある型に対してソースファイルとクラスファイルの両方が見つかった場合、そのどちらのファイルを読み取るべきかを指定します (「型の検索」を参照)。-Xprefer:newer を使用した場合、ある型に対するソースファイルとクラスファイルの新しい方が読み取られます (デフォルト)。-Xprefer:sourceオプションを使用した場合、ソースファイルが読み取られます。SOURCE の保存ポリシーを使って宣言された注釈に任意の注釈プロセッサがアクセスできるようにしたい場合は、-Xprefer:sourceを使用してください。

        -Xprint
            指定された型のテキスト表現をデバッグ目的で出力します。 注釈処理、コンパイルのどちらも実行しません。出力形式は変更される可能性があります。

        -XprintProcessorInfo
            ある特定のプロセッサが処理を依頼されている注釈に関する情報を出力します。

        -XprintRounds
            初回および後続の注釈処理ラウンドに関する情報を出力します。

  -J オプション

        -Joption
            javac が呼び出す java 起動ツールに、option を渡します。たとえば、-J-Xms48m と指定すると、スタートアップメモリーは 48M バイトに設定されます。このオプションは -X で始まっていませんが、javac の「標準オプション」ではありません。-J を使って、Java で記述されたアプリケーションを実行する背後の VM にオプション渡すことは、よく行われています。

        注: CLASSPATH、-classpath、-bootclasspath、および -extdirs は、javac を実行するために使うクラスを指定するものではありません。このような方法でコンパイラの実装を操作することは、通常は無意味であり、常に危険を伴います。このような方法を使う必要がある場合は、-J オプションを使って、必要なオプションを背後の java 起動ツールに渡してください。

コマンド行引数ファイル

javac のコマンド行を短くしたり簡潔にしたりするために、javac コマンドに対する引数 (-J オプションを除く) を含む 1 つ以上のファイルを指定することができます。この方法を使うと、どのオペレーティングシステム上でも、任意の長さの javac コマンドを作成できます。

引数ファイルには、javac のオプションとソースファイル名を自由に組み合わせて記述できます。ファイル内の各引数は、スペースまたは改行で区切ります。ファイル名に空白が含まれている場合は、そのファイル名全体を二重引用符で囲みます。

引数ファイル内のファイル名は、現在のディレクトリから見た相対パスになります。引数ファイルの位置から見た相対パスではありません。引数ファイル内のファイル名リストでは、ワイルドカード (*) は使用できません。たとえば、*.java とは指定できません。引数ファイル内の引数で @ 文字を使用して、複数のファイルを再帰的に解釈することはサポートされていません。また、-J オプションもサポートされていません。 このオプションは起動ツールに渡されますが、起動ツールでは引数ファイルをサポートしていないからです。

javac を実行するときに、各引数ファイルのパスとファイル名の先頭に @ 文字を付けて渡します。javac は、@ 文字で始まる引数を見つけると、そのファイルの内容を展開して引数リストに挿入します。

  引数ファイルを 1 つ指定する例

argfile という名前の引数ファイルにすべての javac 引数を格納する場合は、次のように指定します。

  % javac @argfile

この引数ファイルには、次の例で示されている 2 つのファイルの内容を両方とも入れることができます。

  引数ファイルを 2 つ指定する例

たとえば、javac オプション用に 1 ファイル、ソースファイル名用に 1 ファイルというように、2 つの引数ファイルを作成することもできます。なお、このあとのリストでは、行の継続文字を使用していません。

以下の内容を含む options という名前のファイルを作成します。

     -d classes
     -g
     -sourcepath /java/pubs/ws/1.3/src/share/classes

以下の内容を含む classes という名前のファイルを作成します。

     MyClass1.java
     MyClass2.java
     MyClass3.java

次のコマンドを使用して javac を実行します。

  % javac @options @classes

  パス付きの引数ファイルの例

引数ファイルには、パスを指定できます。 ただし、そのファイル内に指定されたファイル名は、現在の作業ディレクトリから見た相対パスになります。 つまり、下の例の場合は、path1 や path2 から見た相対パスではありません。

  % javac @path1/options @path2/classes

注釈処理

javac が注釈処理を直接サポートしているため、独立した注釈処理ツールである apt を使用する必要がなくなりました。

注釈処理の API は、javax.annotation.processing および javax.lang.model パッケージとそのサブパッケージ内に定義されています。

  注釈処理の概要

-proc:none オプションによって注釈処理が無効化されないかぎり、コンパイラは使用可能なすべての注釈プロセッサを検索します。検索パスは -processorpath オプションを使って指定できます。 検索パスを指定しなかった場合は、ユーザークラスパスが使用されます。プロセッサの検索は、検索パス上の
META-INF/services/javax.annotation.processing.Processor
という名前のサービスプロバイダ構成ファイルに基づいて行われます。このようなファイルには、使用するすべての注釈プロセッサの名前を、1 行に 1 つずつ含めてください。また、別の方法として、-processor オプションを使ってプロセッサを明示的に指定することもできます。

コンパイラは、コマンド行のソースファイルやクラスを走査することで、どのような注釈が存在しているかを確認し終わると、プロセッサに対して問い合わせを行い、それらのプロセッサがの注釈を処理できるのかを確認します。一致するものが見つかった場合、そのプロセッサが呼び出されます。各プロセッサは、自身が処理する注釈を「要求」できます。 その場合、それらの注釈に対する別のプロセッサを見つける試みは行われません。すべての注釈が要求されてしまうと、コンパイラはそれ以上プロセッサの検索を行いません。

いずれかのプロセッサによって新しいソースファイルが生成されると、注釈処理の 2 回目のラウンドが開始されます。新しく生成されたすべてのソースファイルが走査され、前回と同様に注釈が処理されます。以前のラウンドで呼び出されたプロセッサはすべて、後続のどのラウンドでも呼び出されます。これが、新しいソースファイルが生成されなくなるまで続きます。

あるラウンドで新しいソースファイルが生成されなかった場合、注釈プロセッサがあと 1 回だけ呼び出され、必要な処理を実行する機会が与えられます。 最後に、-proc:only オプションが使用されないかぎり、コンパイラは、元のソースファイルと生成されたすべてのソースファイルをコンパイルします。

  暗黙的にロードされたソースファイル

コンパイラは、一連のソースファイルをコンパイルする際に、別のソースファイルを暗黙的にロードしなければならない場合があります (「型の検索」を参照)。そのようなファイルは、現時点では注釈処理の対象になりません。デフォルトでは、注釈処理が実行され、かつ暗黙的にロードされたソースファイルが 1 つでもコンパイルされた場合にコンパイラは警告を発行します。この警告を抑制する方法については、-implicit オプションを参照してください。

型の検索

ソースファイルをコンパイルする場合、コマンド行で指定したソースファイルに型の定義が見つからないとき、コンパイラは通常、その型に関する情報を必要とします。コンパイラは、ソースファイルで使われているクラスまたはインタフェース、拡張されているクラスまたはインタフェース、あるいは実装されているクラスまたはインタフェースすべてについて、型の情報を必要とします。これには、ソースファイルで明示的には言及されていなくても、継承を通じて情報を提供するクラスとインタフェースも含まれます。

たとえば、java.applet.Applet をサブクラスにした場合、アプレットの祖先のクラス（java.awt.Panel、java.awt.Container、java.awt.Component、java.lang.Object）を使用していることになります。

コンパイラは、型の情報が必要になると、その型を定義しているソースファイルまたはクラスファイルを探します。まず、ブートストラップクラスと拡張機能クラスを検索し、続いてユーザークラスパス (デフォルトではカレントディレクトリ) を検索します。ユーザークラスパスは、CLASSPATH 環境変数を設定して定義するか、または -classpath コマンド行オプションを使って設定します。詳細は、 「クラスパスの設定」 @
http://java.sun.com/javase/6/docs/technotes/tools/index.html#classpathを参照してください。

-sourcepath オプションが指定されている場合、コンパイラは、指定されたパスからソースファイルを検索します。 それ以外の場合は、ユーザークラスパスからクラスファイルとソースファイルの両方を検索します。

-bootclasspath オプションと -extdirs オプションを使うと、別のブートストラップクラスや拡張機能クラスを指定できます。 このあとの「クロスコンパイルオプション」を参照してください。

型の検索に成功したときに得られる結果は、クラスファイル、ソースファイル、またはその両方である場合があります。両方が見つかった場合、そのどちらを使用すべきかを -Xprefer オプションでコンパイラに指示できます。newer が指定された場合、コンパイラは 2 つのファイルの新しい方を使用します。source が指定された場合、コンパイラはソースファイルを使用します。デフォルトは newer です。

型の検索自体によって、または -Xprefer が設定された結果として必要な型のソースファイルが見つかった場合、コンパイラはそのソースファイルを読み取り、必要な情報を取得します。さらに、コンパイラはデフォルトで、そのソースファイルのコンパイルも行います。-implicit オプションを使えばその動作を指定できます。none を指定した場合、そのソースファイルのクラスファイルは生成されません。class を指定した場合、そのソースファイルのクラスファイルが生成されます。

コンパイラは、注釈処理の完了後に、ある型情報の必要性を認識しない場合があります。その型情報があるソースファイル内に見つかり、かつ -implicit オプションが指定されていない場合は、そのファイルが注釈処理の対象とならずにコンパイルされることを、コンパイラがユーザーに警告します。この警告を無効にするには、(そのファイルが注釈処理の対象となるように) そのファイルをコマンド行に指定するか、あるいはそのようなソースファイルに対してクラスファイルを生成すべきかどうかを -implicit オプションを使って指定します。

プログラマティックインタフェース

javac は、javax.tools パッケージ内のクラスとインタフェースによって定義される新しい Java Compiler API をサポートします。

  例

コマンド行から指定された引数を使ってコンパイルを実行するには、次のようなコードを使用します。

JavaCompiler javac = ToolProvider.getSystemJavaCompiler();
int rc = javac.run(null, null, null, args);

この場合、標準出力ストリームにすべての診断メッセージが書き出され、コマンド行から呼び出された javac が返すのと同じ終了コードが返されます。

javax.tools.JavaCompiler インタフェース上のほかのメソッドを使えば、診断メッセージの処理やファイルの読み取り元/書き込み先の制御などを行えます。

  旧式のインタフェース

    注: この API は、下位互換性を確保するためだけに残されています。 新しいコードでは、必ず前述の Java Compiler API を使用してください。

    com.sun.tools.javac.Main クラスには、プログラム内からコンパイラを呼び出すための static メソッドが 2 つ用意されています。 それらを次に示します。

    public static int compile(String[] args);
    public static int compile(String[] args, PrintWriter out);

    args パラメータは、javac プログラムに通常渡される任意のコマンド行引数を表しています。 その概要については、前出の「形式」節を参照してください。

    out パラメータは、コンパイラの診断メッセージの出力先を示します。

    戻り値は、javac の終了値と同じです。

    名前が com.sun.tools.javac で始まるパッケージ (非公式には com.sun.tools.javac のサブパッケージとして知られる) に含まれるその他のクラスやメソッドは、どれも完全に内部用であり、いつでも変更される可能性があります。

例

  簡単なプログラムのコンパイル

    Hello.java というソースファイルで、greetings.Hello という名前のクラスを定義しているとします。greetings ディレクトリは、ソースファイルとクラスファイルの両方があるパッケージディレクトリで、現在のディレクトリのすぐ下にあります。このため、この例では、デフォルトのユーザークラスパスを使用できます。また、-d を使って別の出力先ディレクトリを指定する必要もありません。

        % ls
        greetings/
        % ls greetings
        Hello.java
        % cat greetings/Hello.java
        package greetings;
        public class Hello {
            public static void main(String[] args) {
                for (int i=0; i < args.length; i++) {
                    System.out.println("Hello " + args[i]);
                }
            }
        }
        % javac greetings/Hello.java
        % ls greetings
        Hello.class   Hello.java
        % java greetings.Hello World Universe Everyone
        Hello World
        Hello Universe
        Hello Everyone

  複数のソースファイルのコンパイル

    次の例では、パッケージ greetings 内のすべてのソースファイルをコンパイルします。

        % ls
        greetings/
        % ls greetings
        Aloha.java         GutenTag.java      Hello.java         Hi.java
        % javac greetings/*.java
        % ls greetings
        Aloha.class         GutenTag.class      Hello.class         Hi.class
        Aloha.java          GutenTag.java       Hello.java          Hi.java

  ユーザークラスパスの指定

    上の例のソースファイルのうち 1 つを変更し、変更後のファイルを再コンパイルするとします。

        % pwd
        /examples
        % javac greetings/Hi.java

    greetings.Hi は、greetings パッケージ内のほかのクラスを参照しているため、コンパイラはこれらのクラスを探す必要があります。上の例では、デフォルトのユーザークラスパスが、パッケージディレクトリを含むディレクトリと同じであるため、コンパイルは正常に実行されます。ただし、現在どのディレクトリにいるかに関係なく、このファイルを再コンパイルする場合は、ユーザークラスパスに /examples を追加する必要があります。ユーザークラスパスにエントリを追加するには、CLASSPATH を設定する方法もありますが、ここでは -classpath オプションを使うことにします。

        % javac -classpath /examples /examples/greetings/Hi.java

    再度 greetings.Hi を変更してバナーユーティリティーを使うようにした場合は、このバナーユーティリティーもユーザークラスパスを通じてアクセスできるようになっている必要があります。

        % javac -classpath /examples:/lib/Banners.jar \
                    /examples/greetings/Hi.java

    greetings 内のクラスを実行するには、greetings と、greetings が使うクラスの両方にアクセスできる必要があります。

        % java -classpath /examples:/lib/Banners.jar greetings.Hi

  ソースファイルとクラスファイルの分離

    特に大規模プロジェクトの場合は、ソースファイルとクラスファイルを別々のディレクトリに置くと便利なことがあります。クラスファイルの出力先を別に指定するには、-d を使います。ソースファイルはユーザークラスパスにはないので、-sourcepath を使って、コンパイラがソースファイルを見つけることができるようにします。

        % ls
        classes/  lib/      src/
        % ls src
        farewells/
        % ls src/farewells
        Base.java      GoodBye.java
        % ls lib
        Banners.jar
        % ls classes
        % javac -sourcepath src -classpath classes:lib/Banners.jar \
                    src/farewells/GoodBye.java -d classes
        % ls classes
        farewells/
        % ls classes/farewells
        Base.class      GoodBye.class

    注: コマンド行では src/farewells/Base.java を指定していませんが、このファイルもコンパイラによってコンパイルされています。自動コンパイルを監視するには、-verbose オプションを使います。

  クロスコンパイルの例

    ここでは、javac を使って、1.5 VM 上で実行するコードをコンパイルします。

        % javac -target 1.5 -bootclasspath jdk1.5.0/lib/rt.jar \
                    -extdirs "" OldCode.java

    -target 1.5 オプションにより、1.5 VM と互換性のあるクラスファイルが生成されます。デフォルトでは、javac は JDK 6 用にコンパイルします。

    Java プラットフォーム JDK の javac は、デフォルトでは、Java 2 SDK のブートストラップクラスに対してコンパイルを行うので、Java 2 SDK ではなく JDK 1.5 のブートストラップクラスに対してコンパイルを行うように指定する必要があります。これは、-bootclasspath および -extdirs を使って指定します。この指定を行わないと、1.5 VM には存在しない Java 2 プラットフォーム API に対応したコンパイルが行われるため、プログラムの実行時に障害が発生することがあります。

関連項目

    o   「The javac Guide」 @
        http://java.sun.com/javase/6/docs/technotes/guides/javac/index.html

    o   「java(1) - Java アプリケーション起動ツール」

    o   「jdb(1) - Java デバッガ」

    o   「javah(1) - C ヘッダーとスタブファイルジェネレータ」

    o   「javap(1) - クラスファイル逆アセンブラ」

    o   「javadoc(1) - Java API ドキュメントジェネレータ」

    o   「jar(1) - JAR アーカイブツール」

    o   「Java 拡張機能フレームワーク」 @
        http://java.sun.com/javase/6/docs/technotes/guides/extensions/index.html