javac(1)

名前
javac - Java コンパイラ

形式

javac [ -bootclasspath bootclasspath ]
[ -classpath classpath ] [ -d directory ]
[ -deprecation ] [ -encoding encoding ]
[ -extdirs directories ]
[ -g | -g:none | -g:keyword-list ] [ -Joption ]
[ -nowarn ] [ -O ] [ -sourcepath sourcepath ]
[ -target version ] [ -verbose ] [ -X ]
[ -Xstdout filename ] [ 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 はクラスファイルが古くなっていると判断します。

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

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

  標準オプション

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

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

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

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

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

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

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

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

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

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

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

    lines
        行番号のデバッグ情報

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

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

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

-source release
    表明を含むソースコードのコンパイルに対するサポートを有効にします。

    release が 1.4 に設定されると、コンパイラは表明を含むコードを受け入れます。 表明は、J2SE 1.4 で導入されました。

    release が 1.3 に設定されると、コンパイラは表明をサポートしません。 -source フラグが使用されない場合、コンパイラはデフォルトで 1.3 の動作になります。

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

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

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

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

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

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

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

-target version
    指定されたバージョンの VM 上で動作するクラスファイルを生成します。 デフォルトでは、1.2 VM と互換性のあるクラスファイル を生成します。1 つだけ例外があり、 -source 1.4 オプションを使用すると、デフォルトのターゲットは 1.4 になります。 サポートされているバージョンは以下のとおりです。

    1.1 生成するクラスファイルが、1.1 VM と 1.2 VM に互換性があることを 保証します。

    1.2 1.2 VM 上では動作するが、1.1 VM 上では動作しないクラスファイル を生成します。これがデフォルトのオプションです。

    1.3 Java 2 SDK, バージョン 1.3 およびそれ以降の VM では 動作するが、1.1 VM または 1.2 VM 上では動作しないクラスファイルを 生成します。

    1.4 1.4 VM とのみ互換性があるクラスファイルを生成します。

  非標準オプション

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

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

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

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

-Xswitchcheck
    switch ブロックで "失敗する case" を検査して、 検出されたところで警告メッセージを表示します。 "失敗する case" とは、case が switch ブロック内にあり、ブロック内の最後の case ではなく、 そのコードに break 文が含まれない場合で、コードの実行がこの case から次の case まで "失敗する" ことを許します。 たとえば、次の例で、この switch ブロック内の case 1 ラベルに続くコードには break 文が含まれていません。:

      switch (x) {
      case 1:
             System.out.println("1");
             // break; 文がない。
      case 2:
             System.out.println("2");
      }

    このコードをコンパイルするときに -Xswtichcheck フラグを使用すると、コンパイラは、問題のある case の行番号と ともに、 "case で失敗する可能性" について警告を発行します。

コマンド行引数ファイル
javac コマンド行を短縮、あるいは簡潔にするため、 javac コマンドに対する引数を含むファイルを 1 つ以上指定できます。 これにより、任意のオペレーティングシステム上で任意の長さの javac コマンドを作成できます。

引数ファイルには、javac オプションとソースファイル名を 任意の組み合わせで入れることができます。ファイル中の引数は、 空白文字または改行で区切ります。 引数ファイル中のファイル名は、引数ファイルの位置ではなく、 現在のディレクトリとの相対位置で表します。 引数のリストに、ワイルドカード (*) は使用できません ( *.java のような指定)。 ファイルを再帰的に解釈する @ 文字の使用はサポートされていません。

javac を実行すると、各引数ファイルのパスおよび名前に「 @ 」で始まる文字列が渡されます。javac が「 @ 」文字で始まる引数を検出すると、そのファイルの内容が属性リストに 展開されます。

  例 - 引数ファイルを 1 つ使用
すべての javac 引数を持つ argfile という名前の引数ファイルを 1 つ使用します。

      example% javac @argfile

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

  例 - 引数ファイルを 2 つ使用
2 つの引数ファイルを作成できます。1 つは javac オプション用、もう 1 つは ソースファイル用です (次のリストには、行をつなぐ文字列が使用されて いないことに注意してください)。

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

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

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

    MyClass1.java
    MyClass2.java
    MyClass3.java

次のコマンドで、javac を実行します。

    example% javac @options @classes

  例 - パスを指定した引数ファイル
引数ファイルにはパスを指定できますが、引数ファイル内の
    ファイル名はすべて、現在の作業用ディレクトリ ( path1 でも path2 でもなく) との相対位置で表します。

    example% javac @path1\options @path2\classes

使用例

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

次に示すソースファイル
    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 Extensions Mechanism @
    http://java.sun.com/j2se/1.4/docs/guide/extensions/index.html ：英語版