javac(1)

名前
javac - Java コンパイラ

形式

javac [ -bootclasspath bootclasspath ]
[ -classpath classpath ] [ -d directory ]
[ -deprecation ] [ -encoding ] [ -extdirs directories ]
[ -g | -g:none | -g:keyword-list ] [ -Joption ]
[ -nowarn ] [ -O ] [ -sourcepath sourcepath ]
[ -target version ] [ -verbose ] [ -X ] [ -Xdepend ]
[ -Xstdout ] [ -Xverbosepath [ sourcefiles ] [ @files ]

パラメータ
オプションの順序は任意です。特定のオプションに適用されるパラメータについては、「オプション」節を参照してください。

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

@files
    ソースファイルを一覧表示する 1 つ以上のファイル

機能説明

javac ツールは、Java プログラミング言語で記述されたクラスとインタフェース の定義を読み取り、バイトコードクラスファイルにコンパイルします。

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

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

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

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

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

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

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

  型の検索

ソースファイルをコンパイルするとき、コンパイラには、まだ認識していな い型に関する情報が必要になることがあります。コンパイラには、ソース ファイルで使われているクラスまたはインタフェース、拡張されているクラス またはインタフェース、あるいは実装されているクラスまたはインタフェース それぞれの型情報が必要です。これには、ソースファイルで明示的には 言及されていなくても、継承を通じて情報を提供するクラスとインタフェース も含まれます。

たとえば、java.applet.Applet をサブクラス化する場合は、Applet の上位クラスである java.awt.Panel、 java.awt.Container、 java.awt.Component 、および java.awt.Object も使っていることになります。

コンパイラは、型情報が必要になると、該当する型を定義しているソース ファイルまたはクラスファイルを探します。コンパイラは、まず、ブートス トラップクラスと拡張機能クラスを検索し、次にユーザクラスパスを検索 します。ユーザクラスパスは、 CLASSPATH 環境変数を設定するか、あるいは -classpath コマンド行オプションを使って設定します (詳細は、「 クラスパスの設定 」 を参照)。 -sourcepath オプションが指定されている場合、コンパイラは、指定されたパスでソース ファイルを検索します。それ以外の場合は、ユーザクラスパスでクラス ファイルとソースファイルの両方を検索します。 -bootclasspath オプションと -extdirs オプションを使うと、別のブートストラップクラスや拡張機能クラスを指定 できます。後述の「 クロスコンパイルオプション 」を参照してください。

型の検索に成功したときに得られる結果は、クラスファイル、ソースファイル、またはその両方である場合があります。それぞれの場合に javac がどのように処理を行うかを次に示します。

•   検索で見つかったものがソースファイルではなく、クラスファイルである 場合、 javac はクラスファイルを使用します。

•   検索で見つかったものがクラスファイルではなく、ソースファイルである 場合、 javac は、該当するソースファイルをコンパイルし、その結果作成されるクラスファイルを使用します。

•   検索で見つかったものがソースファイルとクラスファイルの両方である 場合、 javac は、クラスファイルが古くなっているかどうかを調べます。クラスファイルが 古くなっている場合は、ソースファイルを再コンパイルし、更新後の クラスファイルを使用します。それ以外の場合は、見つかったクラスファイ ルを使用します。

    デフォルトでは、クラスファイルがソースファイルより古い場合にのみ、 javac はクラスファイルが古くなっていると判断します。 -Xdepend オプションを指定すると、処理速度は遅くなりますが、より信頼性の高い方法で判断します。

javac は、コマンド行に指定されていないソースファイルをコンパイルするときで も、そのことを示すメッセージを表示しません。自動コンパイルをトレースす るには、 -verbose オプションを使ってください。

  ファイルのリスト

javac コマンドを短く簡潔にするために、各行にファイル名が 1 つ記述されてい るファイルを 1 つまたは複数指定することができます。コマンド行で、ファイ ル名に「@」文字を付けることにより、指定したファイルをファイルのリストとし て指定できます。 javac は、「@」文字で始まる引数に遭遇すると、そのファイル内にあるファイル名 がコマンド行に書かれていたかのように、それらのファイル名に対して操作 を行います。

たとえば、sourcefiles というファイル内に、次のようにすべてのソースファイ ル名のリストを記述できます。

    MyClass1.java
    MyClass2.java
    MyClass3.java

次のコマンドを使って、コンパイラを実行できます。

   example% javac @sourcefiles

オプション
コンパイラには、現在の開発環境でサポートされ、将来のリリースでも サポートされる標準オプションのセットがあります。非標準オプションの 補足的なセットは、現在の Virtual Machine の実装特有のもので、将来 変更される可能性があります。非標準オプションは、 -X で始まります。

  標準オプション

-classpath classpath
    ユーザクラスパスを設定し、 CLASSPATH 環境変数のユーザクラスパスを上書きします。 CLASSPATH と -classpath のどちらも指定されていない場合、ユーザクラスパスは現在のディレクトリになります。詳細は、「 クラスパスの設定 」を参照してください。

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

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

    -d が指定されていない場合、 javac はソースファイルと同じディレクトリにクラスファイルを置きます。

    -d で指定されたディレクトリがユーザクラスパスに自動的に追加されるわけ ではないことに注意してください。

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

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

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

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

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

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

    lines
        行番号のデバッグ情報

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

-nowarn
    警告メッセージを表示しません。

-O  注: javac の現在の実装では、 -O オプションにはまったく効力がありません。実行時のコードを最適化します。 -O オプションを指定すると、コンパイル速度が低下し、作成されるクラス ファイルのサイズが増大して、デバッグの困難なプログラムが生成される ことがあります。

    JDK 1.2 より前は、 javac の -g オプションと -O オプションを一緒に使うことができませんでした。JDK 1.2 では、これらの オプションを組み合わせることができますが、変数の喪失、コードの移動 や喪失などの思わぬ結果になる可能性があります。 -O オプションを指定しても、 -depend オプションが自動的に有効になったり、 -g オプションが自動的に無効になったりすることはなくなりました。また、 -O を指定しても、複数のクラスにまたがるインライン化は有効にはなりません。

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

    ソースが見つかった場合、クラスパスで見つかったクラスは、自動再 コンパイルの対象になります。

-verbose
    冗長出力を指定します。ロードされるクラスおよびコンパイルされる ソースファイルごとに情報を出力します。

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

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

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

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

-target version
    指定されたバージョンの VM 上で動作するクラスファイルを生成します。 デフォルトでは、1.1 VM と 1.2 VM の両方に互換性のあるクラスファイル を生成します。JDK 1.2 の javac がサポートするバージョンは次のとおり です。

    1.1 生成するクラスファイルが、1.1 VM と 1.2 VM に互換性があることを 保証します。これがデフォルトのオプションです。

    1.2 1.2 VM 上では動作するが、1.1 VM 上では動作しないクラスファイル を生成します。

    1.3 1.3 以降の VM 上では動作するが、1.1 VM 上では動作しない クラスファイルを生成します。

  非標準オプション

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

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

-X  非標準オプションについての情報を表示し、終了します。

-Xdepend
    アクセス可能なすべてのクラスを再帰的に検索し、再コンパイル用のより 新しいソースファイルを探します。このオプションを使うと、再コンパイルの 必要なクラスをより信頼性の高い方法で検索できますが、コンパイル処理 時間が大幅に長くなる可能性があります。

-Xstdout
    コンパイラのメッセージを System.out に送信します。デフォルトでは、 コンパイラのメッセージは System.err に送信されます。

-Xverbosepath
    ソースファイルおよびクラスファイルを見つけるために、パスおよび 標準拡張機能を検索する方法を記述します。

例

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

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

   example% ls
      greetings/
   example% ls greetings
      Hello.java
   example% 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]);
              }
           }
      }
   example% javac greetings/Hello.java
   example% ls greetings
      Hello.class   Hello.java
   example% java greetings.Hello World Universe Everyone
      Hello World
      Hello Universe
      Hello Everyone

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

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

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

  ユーザクラスパスの指定

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

   example% pwd
      /examples
   example% javac greetings/Hi.java

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

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

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

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

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

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

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

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

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

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

  クロスコンパイルの例

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

   example% javac -target 1.1 -bootclasspath jdk1.1.7/lib/classes.zip \
        -extdirs "" OldCode.java

-target 1.1 オプションにより、生成されるクラスファイルが 1.1 VM に互換性がある ことが保証されます。JDK1.2 では、 javac は、デフォルトで 1.1 への互換性を維持してコンパイルを行うので、この オプションは厳密には必要ありません。ただし、コンパイラによってデフォ ルトが異なる可能性があるので、このオプションを指定する習慣をつけて おくとよいでしょう。

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

関連項目
jar(1)、 java(1)、 javadoc(1)、 javah(1)、 javap(1)、 jdb(1)

次については、Java の Web サイトを参照または検索してください。

Java 拡張機能機構 @
    http://java.sun.com/j2se/1.3/ja/docs/ja/guide/extensions/index.html (http://java.sun.com/j2se/1.3/docs/guide/extensions/index.html ：英語版)