javac [ options ] [ sourcefiles ] [ @argfiles ]引数を指定する順序は任意です。
options
- コマンド行オプション
sourcefiles
- コンパイルされる 1 つ以上のソースファイル (MyClass.java など)
@argfiles
- オプションとソースファイルを列挙した 1 つ以上のファイル。 このファイルの中では、
-J
オプションは指定できません。
javac ツールは、Java プログラミング言語で記述されたクラスとインタフェースの定義を読み取り、バイトコードのクラスファイルにコンパイルします。ソースコードのファイル名を javac に渡すには、次の 2 つの方法があります。
ソースコードのファイル名は
- ソースファイルの数が少ない場合は、ファイル名をコマンド行で直接指定します。
- ソースファイルの数が多い場合は、ファイル名を空白または改行で区切って、1 つのファイルに列挙します。 次に、このリストファイル名の先頭に @ を付けて、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をサブクラスにした場合、アプレットの祖先のクラス (java.awt.Panel、java.awt.Container、java.awt.Component、java.awt.Object)を使用していることになります。
コンパイラは、型の情報が必要になると、その型を定義しているソースファイルまたはクラスファイルを探します。 コンパイラは、まず、ブートストラップクラスと拡張機能クラスを検索し、次にユーザクラスパスを検索します。 ユーザクラスパスは、CLASSPATH 環境変数を設定して定義するか、または -classpath コマンド行オプションを使って設定します。 詳細は、「クラスパスの設定」を参照してください。 -sourcepath オプションが指定されている場合、コンパイラは、指定されたパスからソースファイルを検索します。それ以外の場合は、ユーザクラスパスからクラスファイルとソースファイルの両方を検索します。 -bootclasspath オプションと -extdirs オプションを使うと、別のブートストラップクラスや拡張機能クラスを指定できます。このあとの「クロスコンパイルオプション」を参照してください。
型の検索に成功したときに得られる結果は、クラスファイル、ソースファイル、またはその両方である場合があります。 それぞれの場合に javac がどのように処理するかを次に示します。
javac は、コマンド行に指定されていないソースファイルをコンパイルするときでも、そのことを示すメッセージを表示しません。 自動コンパイルを監視するには、-verbose オプションを使います。
- 検索によりソースファイルではなくクラスファイルが見つかった場合: javac は、そのクラスファイルを使用します。
- 検索によりクラスファイルではなくソースファイルが見つかった場合: javac は、そのソースファイルをコンパイルし、生成されたクラスファイルを使用します。
- 検索によりソースファイルとクラスファイルの両方が見つかった場合: javac は、クラスファイルが最新かどうかを調べます。 クラスファイルが古くなっている場合は、ソースファイルを再コンパイルし、更新後のクラスファイルを使用します。 それ以外の場合は、見つかったクラスファイルを使用します。
クラスファイルがソースファイルより古い場合にのみ、javac はクラスファイルが古くなっていると判断します。
コンパイラには、現在の開発環境でサポートされており、将来のリリースでもサポートされる標準オプションのセットがあります。 これ以外の非標準オプションは、現在の仮想マシンおよびコンパイラの実装に固有のオプションで、将来に変更される可能性があります。 非標準オプションは、-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 文が含まれていません。
このコードをコンパイルするときに -Xswtichcheck フラグが使用されている場合、コンパイラは問題の case の行番号と共に「case にフォールスルーする可能性 (possible fall-through into case)」について警告を表示します。switch (x) { case 1: System.out.println("1"); // No break; statement here. case 2: System.out.println("2"); }
- -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
パス付きの引数ファイルの例
引数ファイルには、パスを指定できます。ただし、そのファイル内に指定されたファイル名は、現在の作業ディレクトリから見た相対パスになります。つまり、下の例の場合は、path1
やpath2
から見た相対パスではありません。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.javagreetings.Hi
は、greetings
パッケージ内のほかのクラスを参照しているため、コンパイラはこれらのクラスを探す必要があります。 上の例では、デフォルトのユーザクラスパスが、パッケージディレクトリを含むディレクトリと同じであるため、コンパイルは正常に実行されます。 ただし、現在どのディレクトリにいるかに関係なく、このファイルを再コンパイルする場合は、 ユーザクラスパスに/examples
を追加する必要があります。 ユーザクラスパスにエントリを追加するには、CLASSPATH を設定する方法もありますが、ここでは -classpath オプションを使うことにします。再度% javac -classpath /examples /examples/greetings/Hi.javagreetings.Hi
を変更してバナーユーティリティを使うようにした場合は、このバナーユーティリティもユーザクラスパスを通じてアクセスできるようになっている必要があります。% javac -classpath /examples:/lib/Banners.jar ¥ /examples/greetings/Hi.javagreetings
内のクラスを実行するには、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.classsrc/farewells/Base.java
を指定していませんが、このファイルもコンパイラによってコンパイルされていることに注意してください。 自動コンパイルを監視するには、-verbose オプションを使います。
ここでは、Java 2 SDK の javac を使って、1.1 VM 上で実行するコードをコンパイルします。-target 1.1 オプションにより、1.1 VM と互換性のあるクラスファイルが生成されます。 Java 2 SDK の javac は、デフォルトで 1.2 のコンパイルを行います。% javac -target 1.1 -bootclasspath jdk1.1.7/lib/classes.zip ¥ -extdirs "" OldCode.javaJava 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. |
Java ソフトウェア |