blob: a0b9cb4011a3e598cdbc5694a5345dd876503ae1 [file] [log] [blame]
." Copyright 2006 Sun Microsystems, Inc. All Rights Reserved.
." DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
."
." This code is free software; you can redistribute it and/or modify it
." under the terms of the GNU General Public License version 2 only, as
." published by the Free Software Foundation.
."
." This code is distributed in the hope that it will be useful, but WITHOUT
." ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
." FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
." version 2 for more details (a copy is included in the LICENSE file that
." accompanied this code).
."
." You should have received a copy of the GNU General Public License version
." 2 along with this work; if not, write to the Free Software Foundation,
." Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
."
." Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
." or visit www.oracle.com if you need additional information or have any
." questions.
."
.TH javac 1 "04 May 2009"
." Generated from HTML by html2man (author: Eric Armstrong)
.LP
.SH "名前"
javac \- Java プログラミング言語コンパイラ
.LP
.RS 3
.TP 2
o
形式
.TP 2
o
説明
.TP 2
o
オプション
.TP 2
o
コマンド行引数ファイル
.TP 2
o
注釈処理
.TP 2
o
型の検索
.TP 2
o
プログラマティックインタフェース
.TP 2
o
.TP 2
o
関連項目
.RE
.LP
.SH "形式"
.LP
.LP
.nf
\f3
.fl
\fP\f3javac\fP [ options ] [ sourcefiles ] [ classes ] [ @argfiles ]
.fl
.fl
.fi
.LP
.LP
引数は順不同です。
.LP
.RS 3
.LP
.RS 3
.TP 3
options
コマンド行オプション。
.TP 3
sourcefiles
コンパイルされる 1 つ以上のソースファイル (MyClass.java など)
.TP 3
classes
注釈の処理対象となる 1 つ以上のクラス (MyPackage.MyClass など)
.TP 3
@argfiles
オプションとソースファイルを列挙した 1 つ以上のファイル。このファイルの中では、\f2\-J\fP オプションは指定できません。
.RE
.LP
.RE
.SH "説明"
.LP
.LP
.LP
\f3javac\fP ツールは、Java プログラミング言語で記述されたクラスとインタフェースの定義を読み取り、バイトコードのクラスファイルにコンパイルします。また、Java ソースファイルおよびクラス内の注釈の処理も行います。
.LP
.LP
ソースコードのファイル名を \f3javac\fP に渡すには、次の 2 つの方法があります。
.LP
.RS 3
.TP 2
o
ソースファイルの数が少ない場合は、ファイル名をコマンド行で直接指定します。
.TP 2
o
ソースファイルの数が多い場合は、ファイル名を空白または改行で区切って、1 つのファイルに列挙します。次に、このリストファイル名の先頭に \f3@\fP を付けて、\f3javac\fP のコマンド行で指定します。
.RE
.LP
.LP
ソースコードのファイル名は \f2.java\fP 拡張子を、クラスのファイル名は \f2.class\fP 拡張子を持っていなければなりません。 また、ソースファイルとクラスファイルのどちらも、該当するクラスに対応するルート名を持っていなければなりません。たとえば、\f2MyClass\fP という名前のクラスは、\f2MyClass.java\fP という名前のソースファイルに記述します。 このソースファイルは、\f2MyClass.class\fP という名前のバイトコードクラスファイルにコンパイルされます。
.LP
.LP
内部クラスが定義されていると、追加のクラスファイルが生成されます。これらのクラスファイルの名前は、\f2MyClass$MyInnerClass.class\fP のように、外部クラス名と内部クラス名を組み合わせたものになります。
.LP
.LP
ソースファイルは、パッケージツリーを反映したディレクトリツリーに配置する必要があります。たとえば、すべてのソースファイルを \f3/workspace\fP に置いている場合、\f2com.mysoft.mypack.MyClass\fP のソースコードは \f3/workspace/com/mysoft/mypack/MyClass.java\fP にある必要があります。
.LP
.LP
デフォルトでは、コンパイラは、各クラスファイルを対応するソースファイルと同じディレクトリに置きます。別の出力先ディレクトリを指定するには、\f3\-d\fP を使用します (このあとのオプションを参照)。
.LP
.SH "オプション"
.LP
.LP
.LP
コンパイラには、現在の開発環境でサポートされており、将来のリリースでもサポートされる標準オプションのセットがあります。これ以外の非標準オプションは、現在の仮想マシンおよびコンパイラの実装に固有のオプションで、将来に変更される可能性があります。非標準オプションは、\f3\-X\fP で始まります。
.LP
.SS
標準オプション
.LP
.RS 3
.LP
.RS 3
.TP 3
\-Akey[=value]
注釈プロセッサに渡されるオプション。これらは、javac によって直接解釈されず、個々のプロセッサによって使用されます。 \f2key\fP には、1 つまたは複数の識別子を「.」で区切ったものを指定してください。
.TP 3
\-cp path または \-classpath path
ユーザーのクラスファイルおよび (場合によっては) 注釈プロセッサやソースファイルの検索場所を指定します。このクラスパスは \f3CLASSPATH\fP 環境変数のユーザークラスパスをオーバーライドします。\f3CLASSPATH\fP\f3\-cp\fP\f3\-classpath\fP のいずれも指定されていない場合、ユーザークラスパスは、現在のディレクトリになります。詳細は、
.na
\f2「クラスパスの設定」\fP @
.fi
http://java.sun.com/javase/6/docs/technotes/tools/index.html#classpathを参照してください。
.LP
\f3\-sourcepath\fP オプションが指定されていない場合は、ソースファイルもユーザークラスパスから検索されます。
.LP
\f3\-processorpath\fP オプションが指定されていない場合は、注釈プロセッサもユーザークラスパスから検索されます。
.LP
便宜上、\f2*\fP のベース名を含むクラスパス要素は、ディレクトリ内の拡張子 \f2.jar\fP または \f2.JAR\fP を持つすべてのファイルのリストを指定するのと同じとみなされます。
.br
.br
たとえば、ディレクトリ \f2foo\fP \f2a.jar\fP \f2b.JAR\fP が含まれている場合、クラスパス要素 \f2foo/*\fP は \f2A.jar:b.JAR\fP に展開されます。 ただし、JAR ファイルの順番は指定されません。このリストには、隠しファイルも含め、指定されたディレクトリ内のすべての JAR ファイルが含まれます。\f2*\fP だけから成るクラスパスエントリは、カレントディレクトリ内のすべての JAR ファイルのリストに展開されます。\f2CLASSPATH\fP 環境変数も、定義時には同様に展開されます。\f3注:\fPコマンド行環境の構成によっては、\f2javac \-cp "*.jar" MyClass.java\fP などのように、ワイルドカード文字を引用符で囲まなければならない場合があります。
.TP 3
\-Djava.ext.dirs=directories
インストール型拡張機能の位置をオーバーライドします。
.TP 3
\-Djava.endorsed.dirs=directories
承認された標準パスの位置をオーバーライドします。
.TP 3
\-d directory
クラスファイルの出力先ディレクトリを設定します。そのディレクトリはすでに存在している必要があります。 \f3javac\fP はディレクトリを作成しません。クラスがパッケージの一部である場合、\f3javac\fP は、必要に応じてディレクトリを作成し、パッケージ名を反映したサブディレクトリにクラスファイルを置きます。たとえば、\f3\-d /home/myclasses\fP と指定し、クラスの名前が \f2com.mypackage.MyClass\fP である場合、クラスファイルは \f2/home/myclasses/com/mypackage/MyClass.class\fP になります。
.LP
\f3\-d\fP が指定されなかった場合、\f3javac\fP は各クラスファイルを、その生成元となるソースファイルと同じディレクトリ内に格納します。
.LP
\f3注:\fP\f3\-d\fP で指定したディレクトリはユーザークラスパスに自動的には追加されません。
.TP 3
\-deprecation
推奨されないメンバーやクラスが、使用またはオーバーライドされるたびに説明を表示します。\f3\-deprecation\fP が指定されていない場合、\f3javac\fP は、推奨されないメンバーやクラスを使用またはオーバーライドしているソースファイルの要約を表示します。\f3\-deprecation\fP は \f3\-Xlint:deprecation\fP の省略表記です。
.TP 3
\-encoding encoding
ソースファイルのエンコーディング名 (\f2EUC\-JP\fP や \f2UTF\-8\fP など) を指定します。\f3\-encoding\fP が指定されていない場合は、プラットフォームのデフォルトコンバータが使われます。
.TP 3
\-g
局所変数を含むすべてのデバッグ情報を生成します。デフォルトでは、行番号およびソースファイル情報だけが生成されます。
.TP 3
\-g:none
デバッグ情報を生成しません。
.TP 3
\-g:{keyword list}
コンマで区切られたキーワードリストにより指定された、特定の種類のデバッグ情報だけを生成します。次のキーワードが有効です。
.RS 3
.TP 3
source
ソースファイルのデバッグ情報
.TP 3
lines
行番号のデバッグ情報
.TP 3
vars
局所変数のデバッグ情報
.RE
.TP 3
\-help
標準オプションの形式を表示します。
.TP 3
\-implicit:{class,none}
暗黙的にロードされたソースファイルに対するクラスファイルの生成を制御します。クラスファイルを自動生成するには、\f3\-implicit:class\fP を使用します。クラスファイルの生成を抑制するには、\f3\-implicit:none\fP を使用します。 このオプションが指定されなかった場合のデフォルト動作は、クラスファイルの自動生成になります。その場合、そのようなクラスファイルが生成された時に注釈処理も実行されると、コンパイラから警告が発行されます。 このオプションが明示的に設定された場合には、警告は発行されません。 「型の検索」を参照してください。
.TP 3
\-nowarn
警告メッセージを無効にします。これは \f3\-Xlint:none\fP と同じ意味です。
.TP 3
\-proc: {none,only}
注釈処理、コンパイル、その両方、のいずれを実行するかを制御します。\f3\-proc:none\fP は、注釈処理なしでコンパイルが実行されることを意味します。\f3\-proc:only\fP は、注釈処理だけが実行され、後続のコンパイルはまったく実行されないことを意味します。
.TP 3
\-processor class1[,class2,class3...]
実行する注釈プロセッサの名前。これを指定した場合、デフォルトの検索処理は省略されます。
.TP 3
\-processorpath path
注釈プロセッサの検索場所を指定します。 このオプションを使用しなかった場合、クラスパス内でプロセッサの検索が行われます。
.TP 3
\-s dir
生成されたソースファイルの格納先となるディレクトリを指定します。そのディレクトリはすでに存在している必要があります。 \f3javac\fP は作成しません。クラスがパッケージの一部になっていた場合、コンパイラはそのソースファイルを、パッケージ名を反映したサブディレクトリ内に格納します。 その際、必要に応じてディレクトリを作成します。たとえば、ユーザーが \f3\-s /home/mysrc\fP と指定し、クラスの名前が \f2com.mypackage.MyClass\fP であった場合、そのソースファイルは \f2/home/mysrc/com/mypackage/MyClass.java\fP 内に格納されます。
.TP 3
\-source release
受け付けるソースコードのバージョンを指定します。\f2release\fP には次の値を指定できます。
.RS 3
.TP 3
1.3
このコンパイラでは、JDK 1.3 以降に導入されたアサーション、総称、または他の言語機能をサポートしません。
.TP 3
1.4
JDK 1.4 で導入された、アサーションを含むコードを受け付けます。
.TP 3
1.5
JDK 5 で導入された総称および他の言語機能を含んだコードを受け付けます。
.TP 3
5
1.5 と同義です。
.TP 3
1.6
これがデフォルト値です。Java SE 6 では言語に対する変更は導入されませんでしたが、ソースファイル内のエンコーディングエラーが、以前のような「警告」ではなく、「エラー」として報告されるようになりました。
.TP 3
6
1.6 と同義です。
.RE
.TP 3
\-sourcepath sourcepath
クラスまたはインタフェースの定義を検索するソースコードパスを指定します。ユーザークラスパスと同様に、ソースパスの複数のエントリはコロン (\f3:\fP) で区切ります。 ソースパスのエントリには、ディレクトリ、JAR アーカイブ、または ZIP アーカイブを指定できます。パッケージを使っている場合は、ディレクトリまたはアーカイブ内のローカルパス名がパッケージ名を反映していなければなりません。
.LP
\f3注:\fP\ クラスパスからクラスだけでなくそのソースも見つかった場合、そのクラスは自動再コンパイルの対象になることがあります。「型の検索」を参照してください。
.TP 3
\-verbose
詳細な出力を表示します。ロードされるクラスおよびコンパイルされるソースファイルごとの情報が出力されます。
.TP 3
\-X
非標準オプションに関する情報を表示して終了します。
.RE
.LP
.RE
.SS
クロスコンパイルオプション
.LP
.RS 3
.LP
.LP
デフォルトでは、クラスのコンパイルは、\f3javac\fP が添付されているプラットフォームのブートストラップクラスおよび拡張機能クラスに対して行われます。ただし、\f3javac\fP は、異なる Java プラットフォームに実装されたブートストラップクラスおよび拡張機能クラスに対してコンパイルを行う「クロスコンパイル」もサポートしています。クロスコンパイルを行う場合は、\f3\-bootclasspath\fP および \f3\-extdirs\fP を使うことが重要です。 このあとの「クロスコンパイルの例」を参照してください。
.LP
.RS 3
.TP 3
\-target version
指定されたバージョンの VM をターゲットにしたクラスファイルを生成します。このクラスファイルは、指定されたターゲット以降のバージョンでは動作しますが、それより前のバージョンの VM では動作しません。有効なターゲットは、\f31.1\fP、\f31.2\fP、\f31.3\fP、\f31.4\fP、\f31.5\fP (\f35\fP も可)、および \f31.6\fP (\f36\fP も可) です。
.LP
\f3\-target\fP のデフォルトは、次のように \f3\-source\fP の値によって決まります。
.RS 3
.TP 2
o
\-source が\f3指定されなかった\fP場合、\-target の値は \f31.6\fP になります。
.TP 2
o
\-source が\f31.2\fP の場合、\-target の値は \f31.4\fP になります。
.TP 2
o
\-source が\f31.3\fP の場合、\-target の値は \f31.4\fP になります。
.TP 2
o
\-source が\f3それ以外の値の場合はすべて\fP、\\\-target の値は \f3\-source\fP の値になります。
.RE
.TP 3
\-bootclasspath bootclasspath
指定された一連のブートクラスに対してクロスコンパイルを行います。ユーザークラスパスと同様に、ブートクラスパスの複数のエントリはコロン (\f3:\fP) で区切ります。 ブートクラスパスのエントリには、ディレクトリ、JAR アーカイブ、または ZIP アーカイブを指定できます。
.TP 3
\-extdirs directories
指定された拡張機能ディレクトリに対してクロスコンパイルを行います。\f2directories\fP には、コロンで区切ったディレクトリのリストを指定します。指定したディレクトリ内の各 JAR アーカイブから、クラスファイルが検索されます。
.RE
.LP
.RE
.SS
非標準オプション
.LP
.RS 3
.LP
.RS 3
.TP 3
\-Xbootclasspath/p:path
ブートストラップクラスパスの前に追加します。
.TP 3
\-Xbootclasspath/a:path
ブートストラップクラスパスの後ろに追加します。
.TP 3
\-Xbootclasspath/:path
ブートストラップクラスファイルの位置をオーバーライドします。
.TP 3
\-Xlint
推奨されるすべての警告を有効にします。このリリースでは、利用可能なすべての警告が推奨されています。
.TP 3
\-Xlint:none
Java 言語仕様では指定されていないすべての警告を無効にします。
.TP 3
\-Xlint:\-name
警告 \f2name\fP を無効にします。 ただし、\f2name\fP は、\f3\-Xlint:\fP\f2name\fP に使用できる警告名のいずれかになります。 この警告名は次のとおりです。
.TP 3
\-Xlint:unchecked
Java 言語仕様で指定されている未検査変換警告の詳細を示します。
.TP 3
\-Xlint:path
存在しないパス (classpath、sourcepath など) ディレクトリについて警告します。
.TP 3
\-Xlint:serial
\f2serialVersionUID\fP 定義が直列化可能クラスにないことを警告します。
.TP 3
\-Xlint:finally
正常に完了できない \f2finally\fP 節について警告します。
.TP 3
\-Xlint:fallthrough
fall\-through ケースの \f2switch\fP ブロックをチェックし、検出されたものに対して警告メッセージを表示します。Fall\-through ケースは、\f2switch\fP ブロック内の最後のケースを除くケースです。 このコードには \f2break\fP 文は含まれません。 コードの実行をそのケースから次のケースへ移動します。たとえば、この \f2switch\fP ブロック内の \f2case 1\fP ラベルに続くコードは、\f2break\fP 文で終わっていません。
.RS 3
.LP
.nf
\f3
.fl
switch (x) {
.fl
case 1:
.fl
System.out.println("1");
.fl
// No break; statement here.
.fl
case 2:
.fl
System.out.println("2");
.fl
}
.fl
.fl
\fP
.fi
.RE
このコードのコンパイル時に \f2\-Xlint:fallthrough\fP フラグが使用されていた場合、コンパイラは 当該ケースの行番号とともに、fall\-through ケースの可能性があることを示す警告を発行します。
.TP 3
\-Xmaxerrs number
印刷するエラーの最大数を設定します。
.TP 3
\-Xmaxwarns number
印刷する警告の最大数を設定します。
.TP 3
\-Xstdout filename
コンパイラのメッセージを、指定されたファイルに送ります。デフォルトでは、コンパイラのメッセージは \f2System.err\fP に送られます。
.TP 3
\-Xprefer:{newer,source}
ある型に対してソースファイルとクラスファイルの両方が見つかった場合、そのどちらのファイルを読み取るべきかを指定します (「型の検索」を参照)。\f2\-Xprefer:newer\fP を使用した場合、ある型に対するソースファイルとクラスファイルの新しい方が読み取られます (デフォルト)。\f2\-Xprefer:source\fPオプションを使用した場合、ソースファイルが読み取られます。\f2SOURCE\fP の保存ポリシーを使って宣言された注釈に任意の注釈プロセッサがアクセスできるようにしたい場合は、\f2\-Xprefer:source\fPを使用してください。
.TP 3
\-Xprint
指定された型のテキスト表現をデバッグ目的で出力します。 注釈処理、コンパイルのどちらも実行しません。出力形式は変更される可能性があります。
.TP 3
\-XprintProcessorInfo
ある特定のプロセッサが処理を依頼されている注釈に関する情報を出力します。
.TP 3
\-XprintRounds
初回および後続の注釈処理ラウンドに関する情報を出力します。
.RE
.LP
.RE
.SS
\-J オプション
.LP
.RS 3
.LP
.RS 3
.TP 3
\-Joption
\f3javac\fP が呼び出す \f3java\fP 起動ツールに、\f2option\fP を渡します。たとえば、\f3\-J\-Xms48m\fP と指定すると、スタートアップメモリーは 48M バイトに設定されます。このオプションは \f3\-X\fP で始まっていませんが、\f3javac\fP の「標準オプション」ではありません。\f3\-J\fP を使って、Java で記述されたアプリケーションを実行する背後の VM にオプション渡すことは、よく行われています。
.LP
\f3注:\fP \ \f3CLASSPATH\fP、\f3\-classpath\fP、\f3\-bootclasspath\fP、および \f3\-extdirs\fP は、\f3javac\fP を実行するために使うクラスを指定するものではありません。このような方法でコンパイラの実装を操作することは、通常は無意味であり、常に危険を伴います。このような方法を使う必要がある場合は、\f3\-J\fP オプションを使って、必要なオプションを背後の \f3java\fP 起動ツールに渡してください。
.RE
.LP
.RE
.SH "コマンド行引数ファイル"
.LP
.LP
.LP
\f2javac\fP のコマンド行を短くしたり簡潔にしたりするために、\f2javac\fP コマンドに対する引数 (\f2\-J\fP オプションを除く) を含む 1 つ以上のファイルを指定することができます。この方法を使うと、どのオペレーティングシステム上でも、任意の長さの javac コマンドを作成できます。
.LP
.LP
引数ファイルには、javac のオプションとソースファイル名を自由に組み合わせて記述できます。ファイル内の各引数は、スペースまたは改行で区切ります。ファイル名に空白が含まれている場合は、そのファイル名全体を二重引用符で囲みます。
.LP
.LP
引数ファイル内のファイル名は、現在のディレクトリから見た相対パスになります。引数ファイルの位置から見た相対パスではありません。引数ファイル内のファイル名リストでは、ワイルドカード (*) は使用できません。たとえば、\f2*.java\fP とは指定できません。引数ファイル内の引数で \f2@\fP 文字を使用して、複数のファイルを再帰的に解釈することはサポートされていません。また、\f2\-J\fP オプションもサポートされていません。 このオプションは起動ツールに渡されますが、起動ツールでは引数ファイルをサポートしていないからです。
.LP
.LP
javac を実行するときに、各引数ファイルのパスとファイル名の先頭に \f2@\fP 文字を付けて渡します。javac は、\f2@\fP 文字で始まる引数を見つけると、そのファイルの内容を展開して引数リストに挿入します。
.LP
.SS
引数ファイルを 1 つ指定する例
.LP
.LP
\f2argfile\fP という名前の引数ファイルにすべての javac 引数を格納する場合は、次のように指定します。
.LP
.nf
\f3
.fl
% \fP\f3javac @argfile\fP
.fl
.fl
.fi
.LP
.LP
この引数ファイルには、次の例で示されている 2 つのファイルの内容を両方とも入れることができます。
.LP
.SS
引数ファイルを 2 つ指定する例
.LP
.LP
たとえば、javac オプション用に 1 ファイル、ソースファイル名用に 1 ファイルというように、2 つの引数ファイルを作成することもできます。なお、このあとのリストでは、行の継続文字を使用していません。
.LP
.LP
以下の内容を含む \f2options\fP という名前のファイルを作成します。
.LP
.nf
\f3
.fl
\-d classes
.fl
\-g
.fl
\-sourcepath /java/pubs/ws/1.3/src/share/classes
.fl
.fl
\fP
.fi
.LP
.LP
以下の内容を含む \f2classes\fP という名前のファイルを作成します。
.LP
.nf
\f3
.fl
MyClass1.java
.fl
MyClass2.java
.fl
MyClass3.java
.fl
.fl
\fP
.fi
.LP
.LP
次のコマンドを使用して \f3javac\fP を実行します。
.LP
.nf
\f3
.fl
% \fP\f3javac @options @classes\fP
.fl
.fl
.fi
.LP
.SS
パス付きの引数ファイルの例
.LP
.LP
引数ファイルには、パスを指定できます。 ただし、そのファイル内に指定されたファイル名は、現在の作業ディレクトリから見た相対パスになります。 つまり、下の例の場合は、\f2path1\fP や \f2path2\fP から見た相対パスではありません。
.LP
.nf
\f3
.fl
% \fP\f3javac @path1/options @path2/classes\fP
.fl
.fl
.fi
.LP
.SH "注釈処理"
.LP
.LP
.LP
\f3javac\fP が注釈処理を直接サポートしているため、独立した注釈処理ツールである \f3apt\fP を使用する必要がなくなりました。
.LP
.LP
注釈処理の API は、\f2javax.annotation.processing\fP および \f2javax.lang.model\fP パッケージとそのサブパッケージ内に定義されています。
.LP
.SS
注釈処理の概要
.LP
.LP
\f3\-proc:none\fP オプションによって注釈処理が無効化されないかぎり、コンパイラは使用可能なすべての注釈プロセッサを検索します。検索パスは \f3\-processorpath\fP オプションを使って指定できます。 検索パスを指定しなかった場合は、ユーザークラスパスが使用されます。プロセッサの検索は、検索パス上の
.br
\f2\ META\-INF/services/javax.annotation.processing.Processor\fP
.br
という名前のサービスプロバイダ構成ファイルに基づいて行われます。このようなファイルには、使用するすべての注釈プロセッサの名前を、1 行に 1 つずつ含めてください。また、別の方法として、\f3\-processor\fP オプションを使ってプロセッサを明示的に指定することもできます。
.LP
.LP
コンパイラは、コマンド行のソースファイルやクラスを走査することで、どのような注釈が存在しているかを確認し終わると、プロセッサに対して問い合わせを行い、それらのプロセッサがの注釈を処理できるのかを確認します。一致するものが見つかった場合、そのプロセッサが呼び出されます。各プロセッサは、自身が処理する注釈を「要求」できます。 その場合、それらの注釈に対する別のプロセッサを見つける試みは行われません。すべての注釈が要求されてしまうと、コンパイラはそれ以上プロセッサの検索を行いません。
.LP
.LP
いずれかのプロセッサによって新しいソースファイルが生成されると、注釈処理の 2 回目のラウンドが開始されます。新しく生成されたすべてのソースファイルが走査され、前回と同様に注釈が処理されます。以前のラウンドで呼び出されたプロセッサはすべて、後続のどのラウンドでも呼び出されます。これが、新しいソースファイルが生成されなくなるまで続きます。
.LP
.LP
あるラウンドで新しいソースファイルが生成されなかった場合、注釈プロセッサがあと 1 回だけ呼び出され、必要な処理を実行する機会が与えられます。 最後に、\f3\-proc:only\fP オプションが使用されないかぎり、コンパイラは、元のソースファイルと生成されたすべてのソースファイルをコンパイルします。
.LP
.SS
暗黙的にロードされたソースファイル
.LP
.LP
コンパイラは、一連のソースファイルをコンパイルする際に、別のソースファイルを暗黙的にロードしなければならない場合があります (「型の検索」を参照)。そのようなファイルは、現時点では注釈処理の対象になりません。デフォルトでは、注釈処理が実行され、かつ暗黙的にロードされたソースファイルが 1 つでもコンパイルされた場合にコンパイラは警告を発行します。この警告を抑制する方法については、\-implicit オプションを参照してください。
.LP
.SH "型の検索"
.LP
.LP
.LP
ソースファイルをコンパイルする場合、コマンド行で指定したソースファイルに型の定義が見つからないとき、コンパイラは通常、その型に関する情報を必要とします。コンパイラは、ソースファイルで使われているクラスまたはインタフェース、拡張されているクラスまたはインタフェース、あるいは実装されているクラスまたはインタフェースすべてについて、型の情報を必要とします。これには、ソースファイルで明示的には言及されていなくても、継承を通じて情報を提供するクラスとインタフェースも含まれます。
.LP
.LP
たとえば、\f3java.applet.Applet\fP をサブクラスにした場合、\f3アプレットの\fP祖先のクラス(\f3java.awt.Panel\fP、\f3java.awt.Container\fP、\f3java.awt.Component\fP、\f3java.lang.Object\fP)を使用していることになります。
.LP
.LP
コンパイラは、型の情報が必要になると、その型を定義しているソースファイルまたはクラスファイルを探します。まず、ブートストラップクラスと拡張機能クラスを検索し、続いてユーザークラスパス (デフォルトではカレントディレクトリ) を検索します。ユーザークラスパスは、\f3CLASSPATH\fP 環境変数を設定して定義するか、または \f3\-classpath\fP コマンド行オプションを使って設定します。詳細は、
.na
\f2「クラスパスの設定」\fP @
.fi
http://java.sun.com/javase/6/docs/technotes/tools/index.html#classpathを参照してください。
.LP
.LP
\-sourcepath オプションが指定されている場合、コンパイラは、指定されたパスからソースファイルを検索します。 それ以外の場合は、ユーザークラスパスからクラスファイルとソースファイルの両方を検索します。
.LP
.LP
\f3\-bootclasspath\fP オプションと \f3\-extdirs\fP オプションを使うと、別のブートストラップクラスや拡張機能クラスを指定できます。 このあとの「クロスコンパイルオプション」を参照してください。
.LP
.LP
型の検索に成功したときに得られる結果は、クラスファイル、ソースファイル、またはその両方である場合があります。両方が見つかった場合、そのどちらを使用すべきかを \-Xprefer オプションでコンパイラに指示できます。\f3newer\fP が指定された場合、コンパイラは 2 つのファイルの新しい方を使用します。\f3source\fP が指定された場合、コンパイラはソースファイルを使用します。デフォルトは \f3newer\fP です。
.LP
.LP
型の検索自体によって、または \f3\-Xprefer\fP が設定された結果として必要な型のソースファイルが見つかった場合、コンパイラはそのソースファイルを読み取り、必要な情報を取得します。さらに、コンパイラはデフォルトで、そのソースファイルのコンパイルも行います。\-implicit オプションを使えばその動作を指定できます。\f3none\fP を指定した場合、そのソースファイルのクラスファイルは生成されません。\f3class\fP を指定した場合、そのソースファイルのクラスファイルが生成されます。
.LP
.LP
コンパイラは、注釈処理の完了後に、ある型情報の必要性を認識しない場合があります。その型情報があるソースファイル内に見つかり、かつ \f3\-implicit\fP オプションが指定されていない場合は、そのファイルが注釈処理の対象とならずにコンパイルされることを、コンパイラがユーザーに警告します。この警告を無効にするには、(そのファイルが注釈処理の対象となるように) そのファイルをコマンド行に指定するか、あるいはそのようなソースファイルに対してクラスファイルを生成すべきかどうかを \f3\-implicit\fP オプションを使って指定します。
.LP
.SH "プログラマティックインタフェース"
.LP
.LP
.LP
\f3javac\fP は、\f2javax.tools\fP パッケージ内のクラスとインタフェースによって定義される新しい Java Compiler API をサポートします。
.LP
.SS
.LP
.LP
コマンド行から指定された引数を使ってコンパイルを実行するには、次のようなコードを使用します。
.LP
.nf
\f3
.fl
JavaCompiler javac = ToolProvider.getSystemJavaCompiler();
.fl
int rc = javac.run(null, null, null, args);
.fl
.fl
\fP
.fi
.LP
.LP
この場合、標準出力ストリームにすべての診断メッセージが書き出され、コマンド行から呼び出された \f3javac\fP が返すのと同じ終了コードが返されます。
.LP
.LP
\f2javax.tools.JavaCompiler\fP インタフェース上のほかのメソッドを使えば、診断メッセージの処理やファイルの読み取り元/書き込み先の制御などを行えます。
.LP
.SS
旧式のインタフェース
.LP
.RS 3
.LP
.LP
\f3注:\fP \ この API は、下位互換性を確保するためだけに残されています。 新しいコードでは、必ず前述の Java Compiler API を使用してください。
.LP
.LP
\f2com.sun.tools.javac.Main\fP クラスには、プログラム内からコンパイラを呼び出すための static メソッドが 2 つ用意されています。 それらを次に示します。
.LP
.nf
\f3
.fl
public static int compile(String[] args);
.fl
public static int compile(String[] args, PrintWriter out);
.fl
.fl
\fP
.fi
.LP
.LP
\f2args\fP パラメータは、javac プログラムに通常渡される任意のコマンド行引数を表しています。 その概要については、前出の「形式」節を参照してください。
.LP
.LP
\f2out\fP パラメータは、コンパイラの診断メッセージの出力先を示します。
.LP
.LP
戻り値は、\f3javac\fP の終了値と同じです。
.LP
.LP
名前が \f2com.sun.tools.javac\fP で始まるパッケージ (非公式には \f2com.sun.tools.javac\fP のサブパッケージとして知られる) に含まれる\f3その他の\fPクラスやメソッドは、どれも完全に内部用であり、いつでも変更される可能性があります。
.LP
.RE
.SH "例"
.LP
.SS
簡単なプログラムのコンパイル
.LP
.RS 3
.LP
.LP
\f2Hello.java\fP というソースファイルで、\f3greetings.Hello\fP という名前のクラスを定義しているとします。\f2greetings\fP ディレクトリは、ソースファイルとクラスファイルの両方があるパッケージディレクトリで、現在のディレクトリのすぐ下にあります。このため、この例では、デフォルトのユーザークラスパスを使用できます。また、\f3\-d\fP を使って別の出力先ディレクトリを指定する必要もありません。
.LP
.RS 3
.LP
.nf
\f3
.fl
% \fP\f3ls\fP
.fl
greetings/
.fl
% \f3ls greetings\fP
.fl
Hello.java
.fl
% \f3cat greetings/Hello.java\fP
.fl
package greetings;
.fl
.fl
public class Hello {
.fl
public static void main(String[] args) {
.fl
for (int i=0; i < args.length; i++) {
.fl
System.out.println("Hello " + args[i]);
.fl
}
.fl
}
.fl
}
.fl
% \f3javac greetings/Hello.java\fP
.fl
% \f3ls greetings\fP
.fl
Hello.class Hello.java
.fl
% \f3java greetings.Hello World Universe Everyone\fP
.fl
Hello World
.fl
Hello Universe
.fl
Hello Everyone
.fl
.fl
.fi
.RE
.LP
.RE
.SS
複数のソースファイルのコンパイル
.LP
.RS 3
.LP
.LP
次の例では、パッケージ \f2greetings\fP 内のすべてのソースファイルをコンパイルします。
.LP
.RS 3
.LP
.nf
\f3
.fl
% \fP\f3ls\fP
.fl
greetings/
.fl
% \f3ls greetings\fP
.fl
Aloha.java GutenTag.java Hello.java Hi.java
.fl
% \f3javac greetings/*.java\fP
.fl
% \f3ls greetings\fP
.fl
Aloha.class GutenTag.class Hello.class Hi.class
.fl
Aloha.java GutenTag.java Hello.java Hi.java
.fl
.fl
.fl
.fi
.RE
.LP
.RE
.SS
ユーザークラスパスの指定
.LP
.RS 3
.LP
.LP
上の例のソースファイルのうち 1 つを変更し、変更後のファイルを再コンパイルするとします。
.LP
.RS 3
.LP
.nf
\f3
.fl
% \fP\f3pwd\fP
.fl
/examples
.fl
% \f3javac greetings/Hi.java\fP
.fl
.fl
.fi
.RE
.LP
.LP
\f2greetings.Hi\fP は、\f2greetings\fP パッケージ内のほかのクラスを参照しているため、コンパイラはこれらのクラスを探す必要があります。上の例では、デフォルトのユーザークラスパスが、パッケージディレクトリを含むディレクトリと同じであるため、コンパイルは正常に実行されます。ただし、現在どのディレクトリにいるかに関係なく、このファイルを再コンパイルする場合は、ユーザークラスパスに \f2/examples\fP を追加する必要があります。ユーザークラスパスにエントリを追加するには、\f3CLASSPATH\fP を設定する方法もありますが、ここでは \f3\-classpath\fP オプションを使うことにします。
.LP
.RS 3
.LP
.nf
\f3
.fl
% \fP\f3javac \-classpath /examples /examples/greetings/Hi.java\fP
.fl
.fl
.fi
.RE
.LP
.LP
再度 \f2greetings.Hi\fP を変更してバナーユーティリティーを使うようにした場合は、このバナーユーティリティーもユーザークラスパスを通じてアクセスできるようになっている必要があります。
.LP
.RS 3
.LP
.nf
\f3
.fl
% \fP\f3javac \-classpath /examples:/lib/Banners.jar \\
.fl
/examples/greetings/Hi.java\fP
.fl
.fl
.fi
.RE
.LP
.LP
\f2greetings\fP 内のクラスを実行するには、\f2greetings\fP と、\f2greetings\fP が使うクラスの両方にアクセスできる必要があります。
.LP
.RS 3
.LP
.nf
\f3
.fl
% \fP\f3java \-classpath /examples:/lib/Banners.jar greetings.Hi\fP
.fl
.fl
.fi
.RE
.LP
.RE
.SS
ソースファイルとクラスファイルの分離
.LP
.RS 3
.LP
.LP
特に大規模プロジェクトの場合は、ソースファイルとクラスファイルを別々のディレクトリに置くと便利なことがあります。クラスファイルの出力先を別に指定するには、\f3\-d\fP を使います。ソースファイルはユーザークラスパスにはないので、\f3\-sourcepath\fP を使って、コンパイラがソースファイルを見つけることができるようにします。
.LP
.RS 3
.LP
.nf
\f3
.fl
% \fP\f3ls\fP
.fl
classes/ lib/ src/
.fl
% \f3ls src\fP
.fl
farewells/
.fl
% \f3ls src/farewells\fP
.fl
Base.java GoodBye.java
.fl
% \f3ls lib\fP
.fl
Banners.jar
.fl
% \f3ls classes\fP
.fl
% \f3javac \-sourcepath src \-classpath classes:lib/Banners.jar \\
.fl
src/farewells/GoodBye.java \-d classes\fP
.fl
% \f3ls classes\fP
.fl
farewells/
.fl
% \f3ls classes/farewells\fP
.fl
Base.class GoodBye.class
.fl
.fl
.fl
.fi
.RE
.LP
.LP
\f3注:\fP \ コマンド行では \f2src/farewells/Base.java\fP を指定していませんが、このファイルもコンパイラによってコンパイルされています。自動コンパイルを監視するには、\f3\-verbose\fP オプションを使います。
.LP
.RE
.SS
クロスコンパイルの例
.LP
.RS 3
.LP
.LP
ここでは、\f3javac\fP を使って、1.5 VM 上で実行するコードをコンパイルします。
.LP
.RS 3
.LP
.nf
\f3
.fl
% \fP\f3javac \-target 1.5 \-bootclasspath jdk1.5.0/lib/rt.jar \\
.fl
\-extdirs "" OldCode.java\fP
.fl
.fl
.fi
.RE
.LP
.LP
\f3\-target 1.5\fP オプションにより、1.5 VM と互換性のあるクラスファイルが生成されます。デフォルトでは、\f3javac\fP は JDK 6 用にコンパイルします。
.LP
.LP
Java プラットフォーム JDK の \f3javac\fP は、デフォルトでは、Java 2 SDK のブートストラップクラスに対してコンパイルを行うので、Java 2 SDK ではなく JDK 1.5 のブートストラップクラスに対してコンパイルを行うように指定する必要があります。これは、\f3\-bootclasspath\fP および \f3\-extdirs\fP を使って指定します。この指定を行わないと、1.5 VM には存在しない Java 2 プラットフォーム API に対応したコンパイルが行われるため、プログラムの実行時に障害が発生することがあります。
.LP
.RE
.SH "関連項目"
.LP
.LP
.RS 3
.TP 2
o
.na
\f2「The javac Guide」\fP @
.fi
http://java.sun.com/javase/6/docs/technotes/guides/javac/index.html
.TP 2
o
「java(1) \- Java アプリケーション起動ツール」
.TP 2
o
「jdb(1) \- Java デバッガ」
.TP 2
o
「javah(1) \- C ヘッダーとスタブファイルジェネレータ」
.TP 2
o
「javap(1) \- クラスファイル逆アセンブラ」
.TP 2
o
「javadoc(1) \- Java API ドキュメントジェネレータ」
.TP 2
o
「jar(1) \- JAR アーカイブツール」
.TP 2
o
.na
\f2「Java 拡張機能フレームワーク」\fP @
.fi
http://java.sun.com/javase/6/docs/technotes/guides/extensions/index.html
.RE
.LP
.LP