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 をサブクラス化した場合は、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 c:¥myclasses と指定した場合、クラスの名前が
com.mypackage.MyClass
であると、クラスファイルはc:¥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 と互換性のあるクラスファイルを生成します。 Java 2 SDK の 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
- fall-through ケースの switch ブロックをチェックし、検出されたものに対して警告メッセージを表示します。 Fall-through ケースは、switch ブロック内の最後のケースを除くケースです。このコードには break 文は含まれません。コードの実行をそのケースから次のケースへ移動します。 たとえば、この switch ブロック内の case 1 ラベルに続くコードには、break 文は含まれません。
このコードのコンパイル時に -Xswtichcheck フラグが使用されていた場合、コンパイラは 当該ケースの行番号とともに、fall-through ケースの可能性があることを示す警告を発行します。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 を使って別の出力先ディレクトリを指定する必要もありません。C:> dir greetings/ C:> dir greetings Hello.java C:> 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]); } } } C:> javac greetings¥Hello.java C:> dir greetings Hello.class Hello.java C:> java greetings.Hello World Universe Everyone Hello World Hello Universe Hello Everyone
次の例では、パッケージgreetings
内のすべてのソースファイルをコンパイルします。C:> dir greetings¥ C:> dir greetings Aloha.java GutenTag.java Hello.java Hi.java C:> javac greetings¥*.java C:> dir greetings Aloha.class GutenTag.class Hello.class Hi.class Aloha.java GutenTag.java Hello.java Hi.java
上の例のソースファイルのうち 1 つを変更し、変更後のファイルを再コンパイルするとします。C:> cd ¥examples C:> javac greetings¥Hi.javagreetings.Hi
は、greetings
パッケージ内のほかのクラスを参照しているため、コンパイラはこれらのクラスを探す必要があります。 上の例では、デフォルトのユーザクラスパスが、パッケージディレクトリを含むディレクトリと同じであるため、コンパイルは正常に実行されます。 ただし、現在どのディレクトリにいるかに関係なく、このファイルを再コンパイルする場合は、 ユーザクラスパスに¥examples
を追加する必要があります。 ユーザクラスパスにエントリを追加するには、CLASSPATH を設定する方法もありますが、ここでは -classpath オプションを使うことにします。再度C:> javac -classpath ¥examples ¥examples¥greetings¥Hi.javagreetings.Hi
を変更してバナーユーティリティを使うようにした場合は、このバナーユーティリティもユーザクラスパスを通じてアクセスできるようになっている必要があります。C:> javac -classpath ¥examples;¥lib¥Banners.jar ¥ ¥examples¥greetings¥Hi.javagreetings
内のクラスを実行するには、greetings
と、greetings
が使うクラスの両方にアクセスできる必要があります。C:> java -classpath ¥examples;¥lib¥Banners.jar greetings.Hi
特に大規模プロジェクトの場合は、ソースファイルとクラスファイルを別々のディレクトリに置くと便利なことがあります。 クラスファイルの出力先を別に指定するには、-d を使います。 ソースファイルはユーザクラスパスにはないので、-sourcepath を使って、コンパイラがソースファイルを見つけることができるようにします。
コマンド行ではC:> dir classes¥ lib¥ src¥ C:> dir src farewells¥ C:> dir src¥farewells Base.java GoodBye.java C:> dir lib Banners.jar C:> dir classes C:> sjavac -sourcepath src -classpath classes;lib¥Banners.jar ¥ src¥farewells¥GoodBye.java -d classes C:> dir classes farewells¥ C:> dir classes¥farewells Base.class GoodBye.classsrc¥farewells¥Base.java
を指定していませんが、このファイルもコンパイラによってコンパイルされています。 自動コンパイルを監視するには、-verbose オプションを使います。
ここでは、Java 2 SDK の javac を使って、1.1 VM 上で実行するコードをコンパイルします。-target 1.1 オプションにより、1.1 VM と互換性のあるクラスファイルが生成されます。 デフォルトでは 1.2 の Java 2 SDK javac で生成されます。C:> 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 ソフトウェア |