." Copyright (c) 1994, 2011, Oracle and/or its affiliates. All rights reserved. ." .TH javac 1 "05 Jul 2012" .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 .nf \f3 .fl \fP\f3javac\fP [ options ] [ sourcefiles ] [ classes ] [ @argfiles ] .fl .fl .fi .LP .LP 引数は順不同です。 .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 .SH "説明" .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 コンパイラには、現在の開発環境でサポートされており、将来のリリースでもサポートされる標準オプションのセットがあります。これ以外の非標準オプションは、現在の仮想マシンおよびコンパイラの実装に固有のオプションで、将来に変更される可能性があります。非標準オプションは、\f3\-X\fPで始まります。 .LP .SS 標準オプション .LP .RS 3 .TP 3 \-Akey[=value] 注釈プロセッサに渡されるオプション。これらは、javacによって直接解釈されず、個々のプロセッサによって使用されます。\f2key\fPには、1つまたは複数の識別子を「.」で区切ったものを指定してください。 .TP 3 \-cppathまたは\-classpathpath ユーザーのクラス・ファイルおよび(場合によっては)注釈プロセッサやソース・ファイルの検索場所を指定します。このクラス・パスは\f3CLASSPATH\fP環境変数のユーザー・クラス・パスをオーバーライドします。\f3CLASSPATH\fP、\f3\-cp\fP、\f3\-classpath\fPのいずれも指定されていない場合、ユーザー・クラス・パスは、現在のディレクトリになります。詳細は、クラス・パスの設定を参照してください。 .br .br \f3\-sourcepath\fPオプションが指定されていない場合は、ソース・ファイルもユーザー・クラス・パスから検索されます。 .br .br \f3\-processorpath\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になります。 .br .br \f3\-d\fPが指定されなかった場合、\f3javac\fPは各クラス・ファイルを、その生成元となるソース・ファイルと同じディレクトリ内に格納します。 .br .br \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やUTF\-8\fPなど)を指定します。\f3\-encoding\fPが指定されていない場合は、プラットフォームのデフォルト・コンバータが使用されます。 .TP 3 \-endorseddirs directories 承認された標準パスの位置をオーバーライドします。 .TP 3 \-extdirs directories \f2ext\fPディレクトリの位置をオーバーライドします。\f2directories\fP変数には、コロンで区切ったディレクトリのリストを指定します。指定したディレクトリ内の各JARアーカイブから、クラス・ファイルが検索されます。見つかったすべてのJARアーカイブは自動的にクラス・パスの一部になります。 .br .br クロスコンパイル(異なるJavaプラットフォームに実装されたブートストラップ・クラスや拡張機能クラスに対してコンパイルを行う)を実行する場合、このオプションには拡張機能クラスを含むディレクトリを指定します。詳細は、クロスコンパイル・オプションを参照してください。 .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 \-Joption \f3javac\fPが呼び出す\f3java\fP起動ツールに、\f2option\fPを渡します。たとえば、\f3\-J\-Xms48m\fPと指定すると、スタートアップ・メモリーは48Mバイトに設定されます。\f3\-J\fPを使用して、Javaで記述されたアプリケーションを実行する背後のVMにオプションを渡すことは、よく行われています。 .br .br \f3注意:\fP \f3CLASSPATH\fP、\f3\-classpath\fP、\f3\-bootclasspath\fPおよび\f3\-extdirs\fPは、\f3javac\fPを実行するために使用するクラスを指定するものでは\f2ありません\fP。このような方法でコンパイラの実装を操作することは、通常は無意味であり、常に危険を伴います。このような方法を使用する必要がある場合は、\f3\-J\fPオプションを使用して、必要なオプションを背後の\f3java\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 このコンパイラでは、Java SE 1.3以降に導入されたアサーション、総称または他の言語機能をサポート\f2しません\fP。 .TP 3 1.4 Java SE 1.4で導入された、アサーションを含むコードを受け付けます。 .TP 3 1.5 Java SE 5で導入された総称および他の言語機能を含んだコードを受け付けます。 .TP 3 5 1.5と同義です。 .TP 3 1.6 Java SE 6では言語に対する変更は導入されませんでした。しかし、ソース・ファイル内のエンコーディング・エラーが、Java SE以前のような「警告」ではなく、「エラー」として報告されるようになりました。 .TP 3 6 1.6と同義です。 .TP 3 1.7 これがデフォルト値です。Java SE 7で導入された機能を含むコードを受け付けます。 .TP 3 7 1.7と同義です。 .RE .TP 3 \-sourcepath sourcepath クラスまたはインタフェースの定義を検索するソース・コード・パスを指定します。ユーザー・クラス・パスと同様に、ソース・パスの複数のエントリはコロン(\f3:\fP)で区切ります。ソース・パスのエントリには、ディレクトリ、JARアーカイブまたはZIPアーカイブを指定できます。パッケージを使用している場合は、ディレクトリまたはアーカイブ内のローカル・パス名がパッケージ名を反映している必要があります。 .br .br \f3注意:\fP クラス・パスからクラスのみでなくそのソースも見つかった場合、そのクラスは自動再コンパイルの対象になることがあります。型の検索を参照してください。 .TP 3 \-verbose 詳細な出力を表示します。ロードされるクラスおよびコンパイルされるソース・ファイルごとの情報が出力されます。 .TP 3 \-version バージョン情報を出力します。 .TP 3 \-Werror 警告が発生した場合にコンパイルを終了します。 .TP 3 \-X 非標準オプションに関する情報を表示して終了します。 .RE .LP .SS クロスコンパイル・オプション .LP .LP デフォルトでは、クラスのコンパイルは、\f3javac\fPが添付されているプラットフォームのブートストラップ・クラスおよび拡張機能クラスに対して行われます。ただし、\f3javac\fPは、異なるJavaプラットフォームに実装されたブートストラップ・クラスおよび拡張機能クラスに対してコンパイルを行う「\f2クロスコンパイル\fP」もサポートしています。クロスコンパイルを行う場合は、\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も可)および\f31.7\fP(\f37\fPも可)です。 .LP \f3\-target\fPのデフォルトは、次のように\f3\-source\fPの値によって決まります。 .RS 3 .TP 2 o \-sourceが\f3指定されなかった\fP場合、\-targetの値は\f31.7\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が\f31.5\fPの場合、\-targetの値は\f31.7\fPになります。 .TP 2 o \-sourceが\f31.6\fPの場合、\-targetの値は\f31.7\fPになります。 .TP 2 o \-sourceが\f3それ以外の値の場合はすべて\fP、\f3\-target\fPの値は\f3\-source\fPの値になります。 .RE .TP 3 \-bootclasspath bootclasspath 指定された一連のブート・クラスに対してクロスコンパイルを行います。ユーザー・クラス・パスと同様に、ブート・クラス・パスの複数のエントリはコロン(\f3:\fP)で区切ります。ブート・クラス・パスのエントリには、ディレクトリ、JARアーカイブまたはZIPアーカイブを指定できます。 .RE .LP .SS 非標準オプション .LP .RS 3 .TP 3 \-Xbootclasspath/p:path ブートストラップ・クラス・パスの前に追加します。 .TP 3 \-Xbootclasspath/a:path ブートストラップ・クラス・パスの後に追加します。 .TP 3 \-Xbootclasspath/:path ブートストラップ・クラス・ファイルの位置をオーバーライドします。 .TP 3 \-Xlint 推奨されるすべての警告を有効にします。このリリースでは、利用可能なすべての警告を有効にすることをお薦めします。 .TP 3 \-Xlint:all 推奨されるすべての警告を有効にします。このリリースでは、利用可能なすべての警告を有効にすることをお薦めします。 .TP 3 \-Xlint:none すべての警告を無効にします。 .TP 3 \-Xlint:name 警告\f2name\fPを有効にします。このオプションで有効にできる警告のリストについては、\-Xlintオプションを使用して有効または無効にできる警告を参照してください。 .TP 3 \-Xlint:\-name 警告\f2name\fPを無効にします。このオプションで無効にできる警告のリストについては、\-Xlintオプションを使用して有効または無効にできる警告を参照してください。 .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 \-Xpkginfo:{always,legacy,nonempty} パッケージ情報ファイルの処理を指定します。 .TP 3 \-Xprint 指定された型のテキスト表現をデバッグ目的で出力します。注釈処理、コンパイルのどちらも実行しません。出力形式は変更される可能性があります。 .TP 3 \-XprintProcessorInfo ある特定のプロセッサが処理を依頼されている注釈に関する情報を出力します。 .TP 3 \-XprintRounds 初回および後続の注釈処理ラウンドに関する情報を出力します。 .RE .LP .SS \-Xlintオプションを使用して有効または無効にできる警告 .LP .LP \f3\-Xlint:\fP\f2name\fPオプションを使用して警告\f2name\fPを有効にします。ただし、\f2name\fPは次の警告名のいずれかになります。同様に、\f3\-Xlint:\-\fP\f2name\fPオプションを使用して警告\f2name\fPを無効にできます。 .LP .RS 3 .TP 3 cast 不要で冗長なキャストについて警告します。次に例を示します。 .nf \f3 .fl String s = (String)"Hello!" .fl \fP .fi .TP 3 classfile クラス・ファイルの内容に関連した問題について警告します。 .TP 3 deprecation 非推奨項目の使用について警告します。次に例を示します。 .nf \f3 .fl java.util.Date myDate = new java.util.Date(); .fl int currentDay = myDate.getDay(); .fl \fP .fi メソッド\f2java.util.Date.getDay\fPはJDK 1.1以降は推奨されていません。 .TP 3 dep\-ann \f2@deprecated\fP Javadocコメントでドキュメント化されているが、\f2@Deprecated\fP注釈が付いていない項目について警告します。次に例を示します。 .nf \f3 .fl /** .fl * @deprecated As of Java SE 7, replaced by {@link #newMethod()} .fl */ .fl .fl public static void deprecatedMethood() { } .fl .fl public static void newMethod() { } .fl \fP .fi .TP 3 divzero 定整数0で除算されることについて警告します。次に例を示します。 .nf \f3 .fl int divideByZero = 42 / 0; .fl \fP .fi .TP 3 empty \f2if\fP文以降が空の文であることについて警告します。次に例を示します。 .nf \f3 .fl class E { .fl void m() { .fl if (true) ; .fl } .fl } .fl \fP .fi .TP 3 fallthrough fall\-throughケースの\f2switch\fPブロックをチェックし、検出されたものに対して警告メッセージを表示します。Fall\-throughケースは、\f2switch\fPブロック内の最後のケースを除くケースです。このコードには\f2break\fP文は含まれません。コードの実行をそのケースから次のケースへ移動します。たとえば、この\f2switch\fPブロック内の\f2case 1\fPラベルに続くコードは、\f2break\fP文で終わっていません。 .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 \fP .fi このコードのコンパイル時に\f2\-Xlint:fallthrough\fPフラグが使用されていた場合、コンパイラは当該ケースの行番号とともに、fall\-throughケースの可能性があることを示す警告を発行します。 .TP 3 finally 正常に完了できない\f2finally\fP節について警告します。次に例を示します。 .nf \f3 .fl public static int m() { .fl try { .fl throw new NullPointerException(); .fl } catch (NullPointerException e) { .fl System.err.println("Caught NullPointerException."); .fl return 1; .fl } finally { .fl return 0; .fl } .fl } .fl \fP .fi この例では、コンパイラは\f2finally\fPブロックに関する警告を生成します。このメソッドが呼び出されると、値\f21\fPではなく\f20\fPが返されます。\f2finally\fPブロックは、\f2try\fPブロックが終了すると必ず実行されます。この例では、制御が\f2catch\fPに移された場合、メソッドは終了します。ただし、\f2finally\fPブロックは実行される必要があるため、制御がすでにこのメソッドの外部に移されていても、このブロックは実行されます。 .TP 3 options コマンドライン・オプションの使用に関する問題について警告します。この種の警告の例については、クロスコンパイルの例を参照してください。 .TP 3 overrides メソッドのオーバーライドに関する問題について警告します。たとえば、次の2つのクラスがあるとします。 .nf \f3 .fl public class ClassWithVarargsMethod { .fl void varargsMethod(String... s) { } .fl } .fl \fP .fi .nf \f3 .fl public class ClassWithOverridingMethod extends ClassWithVarargsMethod { .fl @Override .fl void varargsMethod(String[] s) { } .fl } .fl \fP .fi コンパイラは次のような警告を生成します。 .br .br \f2warning: [override] varargsMethod(String[]) in ClassWithOverridingMethod overrides varargsMethod(String...) in ClassWithVarargsMethod; overriding method is missing '...'\fP .br .br コンパイラは、varargsメソッドを検出すると、varargsの仮パラメータを配列に変換します。メソッド\f2ClassWithVarargsMethod.varargsMethod\fPでは、コンパイラはvarargsの仮パラメータ\f2String... s\fPを仮パラメータ\f2String[] s\fPに変換します。String[] sは、メソッド\f2ClassWithOverridingMethod.varargsMethod\fPの仮パラメータに対応する配列です。その結果、この例ではコンパイルが行われます。 .TP 3 path コマンドラインでの無効なパス要素と存在しないパス・ディレクトリについて警告します(クラス・パス、ソース・パスなどのパス関連)。このような警告を\f2@SuppressWarnings\fP注釈で抑制することはできません。次に例を示します。 .nf \f3 .fl javac \-Xlint:path \-classpath /nonexistentpath Example.java .fl \fP .fi .TP 3 processing 注釈処理に関する問題について警告します。コンパイラがこの警告を生成するのは、注釈を含むクラスがあるときに、使用している注釈プロセッサでそのタイプの例外を処理できない場合です。単純な注釈プロセッサの例を次に示します。 .br .br \f3ソース・ファイル\fP\f4AnnoProc.java\fP: .nf \f3 .fl import java.util.*; .fl import javax.annotation.processing.*; .fl import javax.lang.model.*; .fl import javax.lang.model.element.*; .fl .fl @SupportedAnnotationTypes("NotAnno") .fl public class AnnoProc extends AbstractProcessor { .fl public boolean process(Set elems, RoundEnvironment renv) { .fl return true; .fl } .fl .fl public SourceVersion getSupportedSourceVersion() { .fl return SourceVersion.latest(); .fl } .fl } .fl \fP .fi \f3ソース・ファイル\fP\f4AnnosWithoutProcessors.java\fP\f3:\fP .nf \f3 .fl @interface Anno { } .fl .fl @Anno .fl class AnnosWithoutProcessors { } .fl \fP .fi 次のコマンドは、注釈プロセッサ\f2AnnoProc\fPをコンパイルし、この注釈プロセッサをソース・ファイル\f2AnnosWithoutProcessors.java\fPに対して実行します。 .nf \f3 .fl % \fP\f3javac AnnoProc.java\fP .fl % \f3javac \-cp . \-Xlint:processing \-processor AnnoProc \-proc:only AnnosWithoutProcessors.java\fP .fl .fi コンパイラがソース・ファイル\f2AnnosWithoutProcessors.java\fPに対して注釈プロセッサを実行すると、次の警告が生成されます。 .br .br \f2warning: [processing] No processor claimed any of these annotations: Anno\fP .br .br この問題を解決するには、クラス\f2AnnosWithoutProcessors\fPで定義および使用される注釈の名前を\f2Anno\fPから\f2NotAnno\fPに変更します。 .TP 3 rawtypes raw型に対する未検査操作について警告します。次の文では、\f2rawtypes\fP警告が生成されます。 .nf \f3 .fl void countElements(List l) { ... } .fl \fP .fi 次の文では、\f2rawtypes\fP警告は生成されません。 .nf \f3 .fl void countElements(List l) { ... } .fl \fP .fi \f2List\fPはraw型です。ただし、\f2List\fPはアンバウンド形式のワイルドカードのパラメータ化された型です。\f2List\fPはパラメータ化されたインタフェースなので、必ずその型引数を指定する必要があります。この例では、\f2List\fPの仮引数はアンバウンド形式のワイルドカード(\f2?\fP)を使用してその仮型パラメータとして指定されます。つまり、\f2countElements\fPメソッドは\f2List\fPインタフェースのどのインスタンス化も受け付けることができます。 .TP 3 serial 直列化可能クラスに\f2serialVersionUID\fP定義がないことを警告します。次に例を示します。 .nf \f3 .fl public class PersistentTime implements Serializable .fl { .fl private Date time; .fl .fl public PersistentTime() { .fl time = Calendar.getInstance().getTime(); .fl } .fl .fl public Date getTime() { .fl return time; .fl } .fl } .fl \fP .fi コンパイラは次の警告を生成します。 .br .br \f2warning: [serial] serializable class PersistentTime has no definition of serialVersionUID\fP .br .br 直列化可能クラスが\f2serialVersionUID\fPという名前のフィールドを明示的に宣言しない場合、直列化ランタイムは「Javaオブジェクト直列化仕様」で説明されているように、クラスの様々な側面に基づいて、クラスの\f2serialVersionUID\fPのデフォルト値を計算します。ただし、すべての直列化可能クラスが\f2serialVersionUID\fP値を明示的に宣言することを強くお薦めします。 これは、\f2serialVersionUID\fP値を計算するデフォルトのプロセスが、コンパイラの実装によって異なる可能性のあるクラスの詳細にきわめて影響を受けやすく、直列化復元中に予期しない\f2InvalidClassExceptions\fPが発生する可能性があるためです。したがって、Javaコンパイラの実装が異なっても\f2serialVersionUID\fP値の一貫性を確保にするには、直列化可能クラスが\f2serialVersionUID\fP値を明示的に宣言する必要があります。 .TP 3 static staticの使用に関する問題について警告します。次に例を示します。 .nf \f3 .fl class XLintStatic { .fl static void m1() { } .fl void m2() { this.m1(); } .fl } .fl \fP .fi コンパイラは次の警告を生成します。 .nf \f3 .fl warning: [static] static method should be qualified by type name, XLintStatic, instead of by an expression .fl \fP .fi この問題を解決するために、次のようにstaticメソッド\f2m1\fPを呼び出すことができます。 .nf \f3 .fl XLintStatic.m1(); .fl \fP .fi あるいは、\f2static\fPキーワードをメソッド\f2m1\fPの宣言から削除することもできます。 .TP 3 try try\-with\-resources文を含む、\f2try\fPブロックの使用に関する問題について警告します。たとえば、\f2try\fP文で宣言されたリソース\f2ac\fPが使用されないために、次の文に対して警告が生成されます。 .nf \f3 .fl try ( AutoCloseable ac = getResource() ) { .fl // do nothing .fl } .fl \fP .fi .TP 3 unchecked Java言語仕様で指定されている未検査変換警告の詳細を示します。次に例を示します。 .nf \f3 .fl List l = new ArrayList(); .fl List ls = l; // unchecked warning .fl \fP .fi 型の消去中に、型\f2ArrayList\fPおよび\f2List\fPはそれぞれ\f2ArrayList\fPおよび\f2List\fPになります。 .br .br 変数\f2ls\fPにはパラメータ化された型\f2List\fPが指定されています。\f2l\fPによって参照される\f2List\fPが\f2ls\fPに代入されると、コンパイラは未検査警告を生成します。コンパイラは\f2l\fPが\f2List\fP型を参照するかどうかをコンパイル時に判断できません。また、JVMが実行時にそれを判断できないことも認識しています。lはList型を参照しません。その結果、ヒープ汚染が発生します。 .br .br 詳しく説明すると、ヒープ汚染状態が発生するのは、\f2List\fPオブジェクト\f2l\fP(そのstatic型は\f2List\fP)が別の\f2List\fPオブジェクト\f2ls\fP(異なるstatic型\f2List\fPを持つ)に代入される場合です。しかし、コンパイラではこの代入をいまだに許可しています。総称をサポートしないJava SEのバージョンとの下位互換性を確保するために、この代入を許可する必要があります。型消去のために、\f2List\fPと\f2List\fPは\f2List\fPになります。その結果、コンパイラはオブジェクト\f2l\fP(\f2List\fPというraw型を持つ)をオブジェクト\f2ls\fPに代入することを許可します。 .TP 3 varargs 可変引数(varargs)メソッド、特に非具象化可能引数を含むものの使用が安全でないことを警告します。次に例を示します。 .nf \f3 .fl public class ArrayBuilder { .fl public static void addToList (List listArg, T... elements) { .fl for (T x : elements) { .fl listArg.add(x); .fl } .fl } .fl } .fl \fP .fi コンパイラは、メソッド\f2ArrayBuilder.addToList\fPの定義に関する次の警告を生成します。 .nf \f3 .fl warning: [varargs] Possible heap pollution from parameterized vararg type T .fl \fP .fi コンパイラは、varargsメソッドを検出すると、varargsの仮パラメータを配列に変換します。しかし、Javaプログラミング言語では、パラメータ化された型の配列の作成を許可していません。メソッド\f2ArrayBuilder.addToList\fPでは、コンパイラはvarargsの仮パラメータ\f2T... elements\fPを仮パラメータ\f2T[] elements\fP(配列)に変換します。しかし、型消去のために、コンパイラはvarargsの仮パラメータを\f2Object[] elements\fPに変換します。その結果、ヒープ汚染が発生する可能性があります。 .RE .LP .SH "コマンドライン引数ファイル" .LP .LP javacのコマンドラインを短くしたり簡潔にしたりするために、\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 .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 .fi .LP .SH "注釈処理" .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オプションを使用して指定できます。検索パスを指定しなかった場合は、ユーザー・クラス・パスが使用されます。プロセッサの検索は、検索パス上の\f2META\-INF/services/javax.annotation.processing.Processor\fPという名前のサービス・プロバイダ構成ファイルに基づいて行われます。このようなファイルには、使用するすべての注釈プロセッサの名前を、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 たとえば、\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コマンドライン・オプションを使用して設定します。詳細は、クラス・パスの設定を参照してください。 .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 \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 \fP .fi .LP .LP この場合、標準出力ストリームにすべての診断メッセージが書き出され、コマンドラインから呼び出された\f3javac\fPが返すのと同じ終了コードが返されます。 .LP .LP \f2javax.tools.JavaCompiler\fPインタフェース上の他のメソッドを使用すると、診断メッセージの処理やファイルの読取り元/書込み先の制御などを行えます。 .LP .SS 旧式のインタフェース .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 \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のサブパッケージとして知られる)に含まれるその他のクラスやメソッドは、どれも完全に内部用であり、いつでも変更される可能性があります。 .LP .SH "例" .LP .SS 簡単なプログラムのコンパイル .LP .LP \f2Hello.java\fPというソース・ファイルで、\f3greetings.Hello\fPという名前のクラスを定義しているとします。\f2greetings\fPディレクトリは、ソース・ファイルとクラス・ファイルの両方があるパッケージ・ディレクトリで、現在のディレクトリのすぐ下にあります。このため、この例では、デフォルトのユーザー・クラス・パスを使用できます。また、\f3\-d\fPを使用して別の出力先ディレクトリを指定する必要もありません。 .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 .fi .LP .SS 複数のソース・ファイルのコンパイル .LP .LP 次の例では、パッケージ\f2greetings\fP内のすべてのソース・ファイルをコンパイルします。 .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 .fi .LP .SS ユーザー・クラス・パスの指定 .LP .LP 上の例のソース・ファイルのうち1つを変更し、変更後のファイルを再コンパイルするとします。 .LP .nf \f3 .fl % \fP\f3pwd\fP .fl /examples .fl % \f3javac greetings/Hi.java\fP .fl .fi .LP .LP \f2greetings.Hi\fPは、\f2greetings\fPパッケージ内の他のクラスを参照しているため、コンパイラはこれらのクラスを探す必要があります。上の例では、デフォルトのユーザー・クラス・パスが、パッケージ・ディレクトリを含むディレクトリと同じであるため、コンパイルは正常に実行されます。しかし、現在どのディレクトリにいるかに関係なく、このファイルを再コンパイルする場合を考えてみましょう。そのような場合は、ユーザー・クラス・パスに\f2/examples\fPを追加する必要があります。ユーザー・クラス・パスにエントリを追加するには、\f3CLASSPATH\fPを設定する方法もありますが、ここでは\f3\-classpath\fPオプションを使用します。 .LP .nf \f3 .fl % \fP\f3javac \-classpath /examples /examples/greetings/Hi.java\fP .fl .fi .LP .LP 再度\f2greetings.Hi\fPを変更してバナー・ユーティリティを使用するようにした場合は、このバナー・ユーティリティもユーザー・クラス・パスを通じてアクセスできるようになっている必要があります。 .LP .nf \f3 .fl % \fP\f3javac \-classpath /examples:/lib/Banners.jar \\ .fl /examples/greetings/Hi.java\fP .fl .fi .LP .LP \f2greetings\fP内のクラスを実行するには、\f2greetings\fPと、それが使用するクラスの両方にアクセスできる必要があります。 .LP .nf \f3 .fl % \fP\f3java \-classpath /examples:/lib/Banners.jar greetings.Hi\fP .fl .fi .LP .SS ソース・ファイルとクラス・ファイルの分離 .LP .LP 特に大規模プロジェクトの場合は、ソース・ファイルとクラス・ファイルを別々のディレクトリに置くと便利なことがあります。クラス・ファイルの出力先を別に指定するには、\f3\-d\fPを使用します。ソース・ファイルはユーザー・クラス・パスにはないので、\f3\-sourcepath\fPを使用して、コンパイラがソース・ファイルを見つけることができるようにします。 .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 .fi .LP .LP \f3注意:\fP コマンドラインでは\f2src/farewells/Base.java\fPを指定していませんが、このファイルもコンパイラによってコンパイルされています。自動コンパイルを監視するには、\f3\-verbose\fPオプションを使用します。 .LP .SS クロスコンパイルの例 .LP .LP 次の例は、1.6 VM上で動作するコードをコンパイルするために\f3javac\fPを使用します。 .LP .nf \f3 .fl % \fP\f3javac \-source 1.6 \-target 1.6 \-bootclasspath jdk1.6.0/lib/rt.jar \\ .fl \-extdirs "" OldCode.java\fP .fl .fi .LP .LP \f2\-source 1.6\fPオプションにより、\f2OldCode.java\fPのコンパイルにはバージョン1.6(または6)のJavaプログラミング言語が使用されます。\f3\-target 1.6\fPオプションにより、1.6 VMと互換性のあるクラス・ファイルが生成されます。ほとんどの場合、\f3\-target\fPオプションの値は\f3\-source\fPオプションの値になります。この例では、\f3\-target\fPオプションを省略できます。 .LP .LP \f3\-bootclasspath\fPオプションを使用して、適切なバージョンのブートストラップ・クラス(\f2rt.jar\fPライブラリ)を指定する必要があります。指定しない場合は、コンパイラによって次の警告が生成されます。 .LP .nf \f3 .fl % \fP\f3javac \-source 1.6 OldCode.java\fP .fl warning: [options] bootstrap class path not set in conjunction with \-source 1.6 .fl .fi .LP .LP 適切なバージョンのブートストラップ・クラスを指定しない場合、コンパイラは古い言語仕様(この例では、バージョン1.6のJavaプログラミング言語)を新しいブートストラップ・クラスと組み合せて使用します。その結果、存在しないメソッドへの参照が含まれていることがあるため、クラス・ファイルが古いプラットフォーム(この場合はJava SE 6)で動作しない可能性があります。 .LP .SH "関連項目" .LP .RS 3 .TP 2 o .na \f2javacガイド\fP @ .fi http://docs.oracle.com/javase/7/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) \- APIドキュメント・ジェネレータ .TP 2 o jar(1) \- JARアーカイブ・ツール .TP 2 o .na \f2Java拡張機能フレームワーク\fP @ .fi http://docs.oracle.com/javase/7/docs/technotes/guides/extensions/index.html .RE .LP