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

形式

javac [ options ] [ sourcefiles ] [ @argfiles ]
引数を指定する順序は任意です。
options
コマンド行オプション
sourcefiles
コンパイルされる 1 つ以上のソースファイル (MyClass.java など)
@argfiles
オプションとソースファイルを列挙した 1 つ以上のファイル。 このファイルの中では、-J オプションは指定できません。

解説

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

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

ソースコードのファイル名は .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をサブクラスにした場合、アプレットの祖先のクラス (java.awt.Paneljava.awt.Containerjava.awt.Componentjava.awt.Object)を使用していることになります。

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

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

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

オプション

コンパイラには、現在の開発環境でサポートされており、将来のリリースでもサポートされる標準オプションのセットがあります。 これ以外の非標準オプションは、現在の仮想マシンおよびコンパイラの実装に固有のオプションで、将来に変更される可能性があります。 非標準オプションは、-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 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 が添付されているプラットフォームのブートストラップクラスおよび拡張機能クラスに対して行われます。 ただし、javac は、異なる Java プラットフォームに実装されたブートストラップクラスおよび拡張機能クラスに対してコンパイルを行う「クロスコンパイル」もサポートしています。 クロスコンパイルを行う場合は、-bootclasspath および -extdirs を使うことが重要です。このあとの「クロスコンパイルの例」を参照してください。

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

1.1
1.1 VM および Java 2 SDK の VM と互換性があるクラスファイルを生成します。
1.2
Java 2 SDK, v1.2 以降の VM 上では動作するが、1.1 の VM 上では動作しないクラスファイルを生成します。 これはデフォルトの設定です。
1.3
Java 2 SDK, v 1.3 以降の VM 上では動作するが、1.1 または 1.2 の VM 上では動作しないクラスファイルを生成します。
1.4
1.4 VM とのみ互換性があるクラスファイルを生成します。

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

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

非標準オプション

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

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

-Xswitchcheck
switch ブロック内にフォールスルーする case がないかどうか検査し、みつかった場合は警告メッセージを表示します。フォールスルーする case とは、switch ブロック内の case です (ブロックの最後の case を除く)。コード内に break 文を含まず、そのためコードの実行がその case から次の case に「フォールスルー(fall through)」します。たとえば、この switch ブロック内の case 1 ラベルのあとのコードには、break 文が含まれていません。
switch (x) {
case 1:
       System.out.println("1");
       //  No  break;  statement here.
case 2:
       System.out.println("2");
}
このコードをコンパイルするときに -Xswtichcheck フラグが使用されている場合、コンパイラは問題の case の行番号と共に「case にフォールスルーする可能性 (possible fall-through into case)」について警告を表示します。

-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 引数を格納する場合は、次のように指定します。
  C:> 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
次のコマンドを使用して javadoc を実行します。
  C:> javac @options @classes

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

引数ファイルには、パスを指定できます。ただし、そのファイル内に指定されたファイル名は、現在の作業ディレクトリから見た相対パスになります。つまり、下の例の場合は、path1path2 から見た相対パスではありません。
  C:> 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 オプションを使います。

クロスコンパイルの例

ここでは、Java 2 SDK の javac を使って、1.1 VM 上で実行するコードをコンパイルします。
% javac -target 1.1 -bootclasspath jdk1.1.7/lib/classes.zip ¥
             -extdirs "" OldCode.java
-target 1.1 オプションにより、1.1 VM と互換性のあるクラスファイルが生成されます。 Java 2 SDK の javac は、デフォルトで 1.2 のコンパイルを行います。

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

関連項目


Copyright © 2002 Sun Microsystems, Inc. All Rights Reserved.

Sun
Java ソフトウェア