javac(1)

名前
javac - Java コンパイラ

形式
javac [ options ] [ sourcefiles ] [ @argfiles ]

パラメータ
引数は任意の順番で指定できます。

options
    コマンド行オプション

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

@argfiles
    ソースファイルを一覧表示する 1 つ以上のファイル これらのファイルでは、 -J オプションは許可されていません。

機能説明
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 オプションが指定されていない場合、クラスファイルとソースファイルの 両方がユーザクラスパスで検索されます。

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

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

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

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

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

    lines
        行番号のデバッグ情報

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

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

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

-source release
    宣言を含むソースコードのコンパイルのサポートを有効にします。 次の値を release で指定することができます。

1.5 コンパイラは、JDK 1.5 から導入された総称型 および他の言語機能を含むコードを受け入れます。 -source フラグが使用されない場合、 1.5 の動作がコンパイラの デフォルトに設定されます。

5   1.5 と同義。

1.4 コンパイラは、JDK 1.4 で導入された宣言を含む コードを受け入れます。

1.3 コンパイラは、JDK 1.3 より後に導入された、宣言、総称型 およびその他の言語機能をサポートしません。

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

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

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

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

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

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

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

    1.1 生成するクラスファイルが、1.1 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 JDK 1.4 以降の VM 上で動作するクラスファイルを 生成します。ただし、1.1、1.2、または 1.3 VM 上では 動作しません。

    1.5 JDK 1.5 VM 上のみでコンパイル可能なクラスファイルを生成します。

    5   1.5 と同じです。

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

-cldc1.0
    CLDC プログラムをコンパイルします。このコンパイラはスタックマップを 生成し、プリベリファイヤの使用を不要にします。

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

  非標準オプション

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

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

-Xbootclasspath/:path
    ブートストラップクラスパスの場所をオーバーライドします。

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

-Xlint:none
    Java 言語仕様によって義務付けられていない、すべての警告を無効にします。

-Xlint:-xxx
    警告 xxx を無効にします。ここで xxx は、下記に示す -Xlint:xxx でサポートされる警告の名前です。

-Xlint:unchecked
    Java 言語仕様で義務付けられているチェックが行われていない、 変換警告についての詳細を表示します。

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

-Xlint:serial
    直列化可能クラスの失われた serialVersionUID 定義について警告します。

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

-lint:fallthrough
    fall-through 文のスイッチブロックを検査し 検出されたすべての警告メッセージを表示します。 Fall-through case はスイッチブロック内の case で、 ブロックの最後の case を除く、break 文を含まない コードを持つ case は、その case から次の case へ "fall through" のコード実行を行うことを可能にします。 たとえば、このスイッチブロックの case 1 レベルに続く コードは、break 文を含みません。

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

このコードをコンパイルするときに -Xlint:fallthrough フラグが使用されると、コンパイラは "possible fall-through into case" についての警告を、問題になっている case の番号とともに表示します。

-Xmaxerrors  number
    表示するエラーの最大数を設定します。

-Xmaxwarns  number
    表示する警告の最大数を設定します。 -Xstdout filename 指定されたファイルのコンパイラメッセージを送信します。 デフォルトでは、コンパイラメッセージは 次のファイルに出力されます。 System.err

-J オプション

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

注: CLASSPATH 、 -classpath 、 -bootclasspath 、 および -extdirs は javac の実行に使用する クラスを指定しません。このような、コンパイラの 不必要な実装は、通常、無意味であるだけでなく、 常に危険が伴います。クラスを指定する必要がある 場合は、 -J オプションを使用して、オプションを 基本となる Java 起動ツールに渡します。

コマンド行引数ファイル
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 を実行します。

    % javac @options @classes

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

    % javac @path1/options @path2/classes

使用例

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

次に示すソースファイル 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.4 VM 上で実行するコードをコンパイルします。

   % javac -target 1.4 -bootclasspath jdk1.4.2/lib/classes.zip \
        -extdirs "" OldCode.java

-target 1.4 オプションにより、生成されるクラスファイルが 1.4 VM に互換性がある ことが保証されます。デフォルトでは、 javac は 1.5 への互換性を維持してコンパイルを行います。

JDK の javac は、デフォルトでは、ブートストラップクラスに対してコンパイルを行う ので、JDK 1.4 のブートストラップクラスに対してコンパイ ルを行うように指定する必要があります。これは、 -bootclasspath および -extdirs を使って行います。この指定を行わないと、1.4 VM には存在しない Java 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.5/docs/guide/extensions/index.html ：英語版