javac
javac
ツールとそのオプションは、Javaクラスとインタフェースの定義を読み取り、バイトコードおよびクラス・ファイルにコンパイルする場合に使用できます。
形式
javac [options] [sourcefiles]
-
options
-
コマンド行オプション。「javacのオプションの概要」を参照してください。
-
sourcefiles
-
コンパイル対象となる1つ以上のファイル(
MyClass.java
など)または注釈の処理対象となる1つ以上のファイル(MyPackage.MyClass
など)。
説明
javac
コマンドは、Javaプログラミング言語で記述されたクラスとインタフェースの定義を読み取り、バイト・コードのクラス・ファイルにコンパイルします。また、javac
コマンドは、Javaソース・ファイルおよびクラス内の注釈も処理できます。
JDK 9でランチャ環境変数JDK_JAVAC_OPTIONS
が導入され、その内容がjavac
へのコマンド行の先頭に追加されるようになりました。「JDK_JAVAC_OPTIONS環境変数の使用方法」を参照してください。
ソース・コードのファイル名をjavac
に渡すには、2つの方法があります。
-
ソース・ファイルの数が少ない場合は、ファイル名をコマンド行に指定できます。
-
ソース・ファイルの数が多い場合は、
javac
コマンド行で@filename
オプションを使用して、ソース・ファイル名をリストしたファイルを指定できます。オプションの説明は「標準オプション」を、javac
の引数ファイルの説明は「javacのコマンド行引数ファイル」を参照してください。
ソース・コードのファイル名には.java
接尾辞が必要で、クラスのファイル名には.class
接尾辞が必要であり、ソース・ファイルとクラス・ファイルのどちらも、クラスを識別するルート名が必要です。たとえば、MyClass
という名前のクラスは、MyClass.java
というソース・ファイルに記述され、MyClass.class
というバイトコード・クラス・ファイルにコンパイルされます。
内部クラスが定義されていると、追加のクラス・ファイルが生成されます。これらのクラス・ファイルの名前は、MyClass$MyInnerClass.class
のように、内部クラス名と外部クラス名を組み合わせたものになります。
ソース・ファイルは、パッケージ・ツリーを反映したディレクトリ・ツリーに配置する必要があります。たとえば:
-
Oracle Solaris、LinuxおよびmacOS: すべてのソース・ファイルを
/workspace
に置いている場合、com.mysoft.mypack.MyClass
のソース・コードは/workspace/com/mysoft/mypack/MyClass.java
に置きます。 -
Windows: すべてのソース・ファイルを
\workspace
に置いている場合、com.mysoft.mypack.MyClass
のソース・コードは\workspace\com\mysoft\mypack\MyClass.java
に置きます。
デフォルトでは、コンパイラは、各クラス・ファイルを対応するソース・ファイルと同じディレクトリに置きます。-d
オプション(「標準オプション」を参照)で別の出力先ディレクトリを指定できます。
プログラマティック・インタフェース
javac
コマンドは、javax.tools
パッケージ内のクラスとインタフェースによって定義される新しいJava Compiler APIをサポートします。
暗黙的にロードされたソース・ファイル
コンパイラは、一連のソース・ファイルをコンパイルする際に、別のソース・ファイルを暗黙的にロードしなければならない場合があります。「型の検索」を参照してください。そのようなファイルは、現時点では注釈処理の対象になりません。デフォルトでは、注釈処理が実行され、かつ暗黙的にロードされたソース・ファイルが1つでもコンパイルされた場合にコンパイラは警告を発行します。-implicit
オプションは、警告を抑制する方法を提供します。
JDK_JAVAC_OPTIONS環境変数の使用方法
JDK_JAVAC_OPTIONS
環境変数の空白( )または空白文字(\n
、\t
、\r
または\f
)で区切られた内容は、javac
に渡されるコマンド行引数の先頭に引数のリストとして追加されます。
環境変数のエンコーディング要件は、システムのjavac
コマンド行と同じです。JDK_JAVAC_OPTIONS
環境変数の内容は、コマンド行に指定した場合と同じ方法で処理されます。
一重引用符('
)または二重引用符("
)を使用して、空白文字が含まれる引数を囲むことができます。開始引用符と対応する最初の終了引用符の間の内容すべてが引用符のペアを除いて保存されます。対応する引用符が見つからなかった場合、ランチャはエラー・メッセージを発行して停止します。@files
は、コマンド行に指定するとサポートされます。ただし、@files
内と同様、ワイルドカードの使用はサポートされません。
空白が含まれる引数を引用符で囲む例:
export JDK_JAVAC_OPTIONS='@"C:\white spaces\argfile"'
export JDK_JAVAC_OPTIONS='"@C:\white spaces\argfile"'
export JDK_JAVAC_OPTIONS='@C:\"white spaces"\argfile'
javacのオプションの概要
コンパイラには、現在の開発環境でサポートされている一連の標準オプションと、クロスコンパイル・オプションがあります。また、現在の仮想マシンおよびコンパイラの実装に固有のオプションで、将来に変更される可能性がある一連の非標準オプションもあります。非標準オプションは、-X
で始まります。javac
の様々なオプション・セットは、次の各項で説明します。
標準オプション
-
@filename
-
ファイルからオプションおよびファイル名を読み取ります。
javac
コマンドを短くしたり簡潔にしたりするために、javac
コマンドへの引数(-J
オプションを除く)を含んだ1つ以上のファイルを指定できます。これにより、任意のオペレーティング・システムで、任意の長さのjavac
コマンドを作成できます。「javacのコマンド行引数ファイル」を参照してください。 -
-Akey[=value]
-
注釈プロセッサに渡すオプションを指定します。これらのオプションは、
javac
が直接解釈するのではなく、それぞれのプロセッサによって使用できるようにします。key
値はドット(.)によって区切られた1つ以上の識別子にすべきです。 -
--add-modules module,module
-
初期モジュールに加えて解決するルート・モジュール、または
module
がALL-MODULE-PATH
の場合はモジュール・パスのすべてのモジュールを指定します。 -
--boot-class-path path
または-bootclasspath path
-
ブートストラップ・クラス・ファイルの位置をオーバーライドします。
ノート:
これを使用できるのは、JDK 9より前のバージョンをコンパイルする場合のみです。必要に応じて、詳細は
--release
、-source
または-target
の説明を参照してください。 -
--class-path path
、-classpath path
または-cp path
-
ユーザー・クラス・ファイルと注釈プロセッサを検索する場所を指定します。このクラス・パスは
CLASSPATH
環境変数のユーザー・クラス・パスをオーバーライドします。-
--class-path
、-classpath
または-cp
が指定指定されていない場合、ユーザー・クラス・パスは現在のディレクトリになります。 -
-sourcepath
オプションが指定されていない場合は、ソース・ファイルもユーザー・クラス・パスから検索されます。 -
-processorpath
オプションが指定されていない場合は、注釈プロセッサもクラス・パスから検索されます。
-
-
-d directory
-
クラス・ファイルの出力先ディレクトリを設定します。クラスがパッケージに含まれる場合、
javac
は、パッケージ名を反映したサブディレクトリにクラス・ファイルを置き、必要に応じてディレクトリを作成します。たとえば:-
Oracle Solaris、LinuxおよびmacOS:
-d
/home/myclasses
と指定した場合、クラスの名前がcom.mypackage.MyClass
であれば、クラス・ファイルは/home/myclasses/com/mypackage/MyClass.class
になります。 -
Windows:
-d
C:\myclasses
と指定し、クラスの名前がcom.mypackage.MyClass
である場合、クラス・ファイルはC:\myclasses\com\mypackage\MyClass.class
になります。
-d
オプションが指定されていない場合、javac
は各クラス・ファイルを、その生成元となるソース・ファイルと同じディレクトリ内に格納します。ノート:
-d
オプションで指定したディレクトリはユーザー・クラス・パスに自動的には追加されません。 -
-
-deprecation
-
非推奨のメンバーやクラスの使用またはオーバーライドのたびに説明を表示します。
-deprecation
オプションが指定されていない場合、javac
は、非推奨のメンバーやクラスを使用またはオーバーライドしているソース・ファイルのサマリーを表示します。-deprecation
オプションは-Xlint:deprecation
の省略表記です。 -
--enable-preview
-
プレビュー言語機能を有効にします。
-source
または--release
と組み合わせて使用します。 -
-encoding encoding
-
ソース・ファイルで使用される文字エンコーディング(EUC-JPやUTF-8など)を指定します。
-encoding
オプションが指定されていない場合は、プラットフォームのデフォルトのエンコーディングが使用されます。 -
-endorseddirs directories
-
承認された標準パスの位置をオーバーライドします。
ノート:
これを使用できるのは、JDK 9より前のバージョンをコンパイルする場合のみです。必要に応じて、詳細は
--release
、-source
または-target
の説明を参照してください。 -
-extdirs directories
-
インストールされた拡張機能の位置をオーバーライドします。
directories
変数は、コロンで区切ったディレクトリのリストです。指定したディレクトリ内の各JARファイルから、クラス・ファイルが検索されます。見つかったすべてのJARファイルがクラス・パスの一部になります。クロスコンパイルを行う場合、このオプションには拡張クラスが格納されているディレクトリを指定します。「javacのクロスコンパイル・オプション」を参照してください。
ノート:
これを使用できるのは、JDK 9より前のバージョンをコンパイルする場合のみです。必要に応じて、詳細は
--release
、-source
または-target
の説明を参照してください。 -
-g
-
ローカル変数を含むすべてのデバッグ情報を生成します。デフォルトでは、行番号およびソース・ファイル情報だけが生成されます。
-
-g:[lines, vars, source]
-
カンマで区切られたキーワードのリストによって指定された種類のデバッグ情報のみを生成します。有効なキーワードは、次のとおりです。
-
-g:none
-
デバッグ情報を生成しません。
-
-h directory
-
生成されるネイティブ・ヘッダー・ファイルを格納する場所を指定します。
このオプションを指定すると、ネイティブ・メソッドが含まれるクラスまたはjava.lang.annotation.Native注釈で注釈付けられた定数が1つ以上あるクラスごとにネイティブ・ヘッダー・ファイルが生成されます。クラスがパッケージに含まれる場合、コンパイラは、パッケージ名を反映したサブディレクトリにネイティブ・ヘッダー・ファイルを置き、必要に応じてディレクトリを作成します。
-
--help
、–help
または-?
-
標準オプションの形式を出力します。
-
--help-extra
または-X
-
追加オプションのヘルプを出力します。
-
-implicit:[none, class]
-
暗黙的に参照されるファイルについてクラス・ファイルを生成するかどうか指定します。
-
-implicit:class
— クラス・ファイルを自動的に生成します。 -
-implicit:none
— クラス・ファイルの生成を抑制します。
このオプションを指定しなかった場合、デフォルトではクラス・ファイルが自動的に生成されます。その場合、クラス・ファイルが生成されたときに注釈処理も実行されると、コンパイラから警告が発行されます。
-implicit
オプションが明示的に設定された場合には、警告は発行されません。「型の検索」を参照してください。 -
-
-Joption
-
option
をランタイム・システムに渡します(option
は、javaコマンドで説明されているjavaのオプションのいずれかです)。たとえば、-J-Xms48m
と指定すると、スタートアップ・メモリーは48Mバイトに設定されます。ノート:
CLASSPATH
環境変数、-classpath
オプション、-bootclasspath
オプションおよび-extdirs
オプションは、javac
の実行に使用するクラスを指定しません。これらのオプションや変数でコンパイラ実装をカスタマイズしようとすることは危険であり、目的が実現されないことがあります。コンパイラ実装をカスタマイズする必要がある場合は、-J
オプションを使用して、オプションを基礎となるJavaランチャに渡してください。 -
--limit-modules module,module
* -
参照可能なモジュールの領域を制限します。
-
--module module-name
または-m module-name
-
指定されたモジュールのみをコンパイルし、タイムスタンプをチェックします。
-
--module-path path
または-p path
-
アプリケーション・モジュールの参照先を指定します。
-
--module-source-path module-source-path
-
複数のモジュールの入力ソース・ファイルの参照先を指定します。
-
--module-version version
-
コンパイルされるモジュールのバージョンを指定します。
-
-nowarn
-
警告メッセージを無効にします。このオプションは、
-Xlint:none
オプションと同じように動作します。 -
-parameters
-
メソッド・パラメータにリフレクション用のメタデータを生成します。Reflection APIのメソッド
java.lang.reflect.Executable.getParameters
が取得できるように、コンストラクタやメソッドの仮パラメータ名を、生成されたクラス・ファイルに格納します。 -
-proc:[none, only]
-
注釈処理とコンパイルが実行されるかどうかを制御します。
-proc:none
は、注釈処理なしでコンパイルが実行されることを意味します。-proc:only
は、注釈処理のみが実行され、後続のコンパイルは実行されないことを意味します。 -
-processor class1[,class2,class3...]
-
実行する注釈プロセッサの名前。これを指定した場合、デフォルトの検索処理は省略されます。
-
--processor-module-path path
-
注釈プロセッサの検索に使用されるモジュール・パスを指定します。
-
--processor-path path
or-processorpath path
-
注釈プロセッサを見つける場所を指定します。このオプションが使用されていない場合、クラス・パスでプロセッサが検索されます。
-
-profile profile
-
使用されるAPIが指定プロファイルで使用可能であることをチェックします。
ノート:
これを使用できるのは、JDK 9より前のバージョンをコンパイルする場合のみです。必要に応じて、詳細は
--release
、-source
または-target
の説明を参照してください。 -
--release release
-
特定のVMバージョンについてサポートされるドキュメント化されたパブリックAPIに対してコンパイルします。サポートされる
release
ターゲットは、6
、7
、8
、9
、10
, および11
です。ノート:
モジュールをサポートするJava Platformのバージョンに
--release
を使用すると、--add-modules
を使用して内部JDKモジュールにアクセスすることも、--add-exports
を使用してモジュールの内部JDK APIにアクセスすることもできません。 -
-s directory
-
生成されたソース・ファイルの格納に使用されるディレクトリを指定します。クラスがパッケージに含まれる場合、コンパイラは、パッケージ名を反映したサブディレクトリにソース・ファイルを置き、必要に応じてディレクトリを作成します。たとえば:
-
Oracle Solaris、LinuxおよびmacOS
-s /home/mysrc
と指定し、クラスの名前がcom.mypackage.MyClass
である場合、ソース・ファイルは/home/mysrc/com/mypackage/MyClass.java
に格納されます。 -
Windows:
-s C:\mysrc
と指定し、クラスの名前がcom.mypackage.MyClass
である場合、ソース・ファイルはC:\mysrc\com\mypackage\MyClass.java
に格納されます。
-
-
-source release
-
受け付けるソース・コードのバージョンを指定します。
release
には次の値を指定できます。ノート:
JDK 9以降、
javac
では5
以下の-source
リリース設定がサポートされなくなりました。5
以下の設定が使用されると、javac
コマンドは-source 6
が指定されているように動作します。-
1.6
-
Java SE 6では言語に対する変更は導入されませんでした。ただし、ソース・ファイル内のエンコーディング・エラーが、Java Platform, Standard Editionの以前のリリースで行われたような警告ではなく、エラーとして報告されるようになりました。
-
6
-
1.6と同義です。
-
1.7
-
Java SE 7で導入された機能を含むコードを受け付けます。
-
7
-
1.7と同義です。
-
1.8
-
Java SE 8で導入された機能を含むコードを受け付けます。
-
8
-
1.8と同義です。
-
9
-
Java SE 9で導入された機能を含むコードを受け付けます。
-
10
-
Java SE 10で導入された機能を含むコードを受け付けます。
-
11
-
デフォルト値です。Java SE 11で導入された機能を含むコードを受け付けます。
-
-
--source-path path
または-sourcepath path
-
入力ソース・ファイルの検索場所を指定します。これは、クラスまたはインタフェースの定義の検索に使用されるソース・コード・パスです。ユーザー・クラス・パスと同様に、ソース・パスのエントリは、Oracle Solaris、LinuxおよびmacOSではコロン(
:
)で、Windowsではセミコロン(;
)で区切ります。ディレクトリ、JARアーカイブまたはZIPアーカイブを指定できます。パッケージを使用している場合は、ディレクトリまたはアーカイブ内のローカル・パス名がパッケージ名を反映していなければなりません。ノート:
クラス・パスを通じて見つかったクラスは、それらのソース・ファイルも見つかった場合にコンパイルできます。「型の検索」を参照してください。
-
--system jdk | none
-
システム・モジュールの場所をオーバーライドします。
-
-target release
-
特定のVMバージョンについてクラス・ファイルを生成します。
-
--upgrade-module—path path
-
アップグレード可能モジュールの場所をオーバーライドします。
-
-verbose
-
コンパイラが実行している処理に関するメッセージを出力します。メッセージには、ロードされるクラスおよびコンパイルされるソース・ファイルごとの情報が含まれます。
-
--version
または-version
-
バージョン情報を出力します。
-
-Werror
-
警告が発生したらコンパイルを終了します。
javacのクロスコンパイル・オプション
デフォルトでは、JDK 9より前のリリースの場合、クラスのコンパイルは、javac
コマンドに付属するプラットフォームのブートストラップ・クラスに対して行われます。ただし、javac
はクロスコンパイルもサポートしており、このコンパイルでは異なるJavaプラットフォーム実装のブートストラップ・クラスに対してクラスのコンパイルを行います。クロスコンパイルを行う場合は、-bootclasspath
オプションおよび-extdirs
オプションを使用することが重要です。
ノート:
これを使用できるのは、JDK 9より前のバージョンをコンパイルする場合のみです。必要に応じて、詳細は--release
、-source
または-target
の説明を参照してください。
追加オプション
-
--add-exports module/package=other-module(,other-module)
* -
定義モジュールから追加モジュールに、あるいは
other-module
の値がALL-UNNAMED
の場合はすべての名前のないモジュールにエクスポートされると見なされるパッケージを指定します。 -
--add-reads module=other-module(,other-module)
* -
指定のモジュールで必須と見なされる追加モジュールを指定します。
-
--default-module-for-created-files module-name
-
何も指定されていないか無効な場合に注釈プロセッサによって作成されるファイルのフォールバック・ターゲット・モジュールを指定します。
-
-Djava.endorsed.dirs=dirs
-
承認された標準パスの位置をオーバーライドします。
ノート:
これを使用できるのは、JDK 9より前のバージョンをコンパイルする場合のみです。必要に応じて、詳細は
--release
、-source
または-target
の説明を参照してください。 -
-Djava.ext.dirs=dirs
-
インストールされた拡張機能の位置をオーバーライドします。
ノート:
これを使用できるのは、JDK 9より前のバージョンをコンパイルする場合のみです。必要に応じて、詳細は
--release
、-source
または-target
の説明を参照してください。 -
--doclint-format [html4|html5]
-
ドキュメント・コメントの形式を指定します。
-
--patch-module module=file(:file)
* -
JARファイルまたはディレクトリ内のクラスおよびリソースでモジュールをオーバーライドまたは拡張します。
-
-Xbootclasspath:path
-
ブートストラップ・クラス・ファイルの位置をオーバーライドします。
ノート:
これを使用できるのは、JDK 9より前のバージョンをコンパイルする場合のみです。必要に応じて、詳細は
--release
、-source
または-target
の説明を参照してください。 -
-Xbootclasspath/a:path
-
ブートストラップ・クラス・パスに接尾辞を追加します。
ノート:
これを使用できるのは、JDK 9より前のバージョンをコンパイルする場合のみです。必要に応じて、詳細は
--release
、-source
または-target
の説明を参照してください。 -
-Xbootclasspath/p:path
-
ブートストラップ・クラス・パスに接頭辞を追加します。
ノート:
これを使用できるのは、JDK 9より前のバージョンをコンパイルする場合のみです。必要に応じて、詳細は
--release
、-source
または-target
の説明を参照してください。 -
-Xdiags:[compact, verbose]
-
診断モードを選択します。
-
-Xdoclint
-
javadoc
コメントの問題に関する推奨チェックを有効にします -
-Xdoclint:(all|none|[-]group)[/access]
-
特定のグループのチェックを有効または無効にします。
group
には、次のいずれかの値を指定できます。-
accessibility
-
html
-
missing
-
reference
-
syntax
access
は、-Xdoclint
オプションでチェックするクラスとメンバーの最低の可視性レベルを指定します。これは、次の値のいずれかにできます(可視性が最大から最小の順序で示しています)。-
public
-
protected
-
package
-
private
デフォルトの
access
レベルはprivate
です。これらのチェックのグループの詳細は、
javadoc
コマンドの-Xdoclint
オプションを参照してください。javac
コマンドで-Xdoclint
オプションはデフォルトで無効にされています。たとえば、次のオプションは、protected以上のアクセス・レベル(protectedおよびpublicを含む)を持つクラスおよびメンバー(すべてのチェックのグループで)をチェックします。
-Xdoclint:all/protected
次のオプションは、アクセス・レベルがpackage以上(package、protectedおよびpublicを含む)のクラスとメンバーのHTMLエラーをチェックしないことを除いて、すべてのアクセス・レベルのすべてのグループのチェックを有効にします。
-Xdoclint:all,-html/package
-
-
-Xdoclint/package:[-]packages(,[-]package)
* -
特定のパッケージのチェックを有効または無効にします。各
package
は、パッケージの修飾名またはパッケージ名の接頭辞の後にピリオドとアスタリスク*
を指定(指定されたパッケージのすべてのサブパッケージまで拡張)したものです。各package
の前にハイフン(-
)を指定すると、1つまたは複数の指定されたパッケージに関するチェックを無効にできます。 -
-Xlint
-
推奨されるすべての警告を有効にします。このリリースでは、利用可能なすべての警告を有効にすることが推奨されています。
-
-Xlint:[-]key(,[-]key)
* -
有効または無効にする警告をカンマ(
,
)で区切って指定します。指定した警告を無効にするには、キーの前にハイフン(-
)を指定します。サポートされている
key
の値は、次のとおりです。-
all
: すべての警告を有効にします。 -
auxiliaryclass
: ソース・ファイルでは非表示で、他のファイルから使用される補助クラスについて警告します。 -
cast
: 不要なキャストの使用について警告します。 -
classfile
: クラス・ファイルの内容に関連した問題について警告します。 -
deprecation
: 非推奨項目の使用について警告します。 -
dep-ann
:javadoc
で非推奨とマークされているのに@Deprecated
注釈を使用していない項目について警告します。 -
divzero
: 定整数0による除算について警告します。 -
empty
:if
以降が空の文であることについて警告します。 -
exports
: モジュールのエクスポートに関する問題について警告します。 -
fallthrough
: switch文の1つのcaseから次へのフォール・スルーについて警告します。 -
finally
: 正常に完了しないfinally
節について警告します。 -
module
: モジュール・システム関連の問題について警告します。 -
opens
: モジュールのオープンに関する問題について警告します。 -
options
: コマンド行オプションの使用に関する問題について警告します。 -
overloads
: メソッドのオーバーロードに関する問題について警告します。 -
overrides
: メソッドのオーバーライドに関する問題について警告します。 -
path
: コマンド行の無効なパス要素について警告します。 -
processing
: 注釈処理に関する問題について警告します。 -
rawtypes
: raw型の使用について警告します。 -
removal
: 削除用にマークされたAPIの使用について警告します。 -
requires-automatic
: requires句内の自動モジュールの使用について開発者に警告します。 -
requires-transitive-automatic
: requires transitive内の自動モジュールについて警告します。 -
serial
: シリアル・バージョンIDを指定しない直列化可能なクラスについて警告します。また、直列化可能要素からpublic以外のメンバーへのアクセスについて警告します。 -
static
: インスタンスを使用したstaticメンバーへのアクセスについて警告します。 -
try
: tryブロック(try-with-resources)の使用に関する問題について警告します。 -
unchecked
: 無検査操作について警告します。 -
varargs
: 安全ではない可能性があるvararg
メソッドについて警告します。 -
none
: すべての警告を無効にします。
「-Xlintのキーの使用例」を参照してください。
-
-
-Xmaxerrs number
-
印刷するエラーの最大数を設定します。
-
-Xmaxwarns number
-
印刷する警告の最大数を設定します。
-
-Xpkginfo:[always, legacy, nonempty]
-
javac
コマンドが次のオプションのいずれかを使用してpackage-info.java
ファイルからpackage-info.class
ファイルを生成する場合とその方法を指定します。-
always
-
すべての
package-info.java
ファイルに対して、package-info.class
ファイルを生成します。このオプションは、各.java
ファイルに対応する.class
ファイルがあることをチェックするAntなどのビルド・システムを使用する場合に役立つことがあります。 -
legacy
-
package-info.java
に注釈が含まれる場合にのみ、package-info.class
ファイルを生成します。このオプションでは、package-info.java
にコメントのみが含まれる場合は、package-info.class
ファイルを生成しません。ノート:
package-info.class
ファイルのすべての注釈にRetentionPolicy.SOURCE
がある場合、package-info.class
ファイルは生成されますが、空になります。 -
nonempty
-
package-info.java
にRetentionPolicy.CLASS
またはRetentionPolicy.RUNTIME
のある注釈が含まれる場合にのみ、package-info.class
ファイルを生成します。
-
-
-Xplugin:name args
-
実行されるプラグインの名前およびオプションの引数を指定します。
-
-Xprefer:[source
,newer]
-
次のオプションのいずれかを使用して、暗黙的にコンパイルされるクラスについて、てソース・ファイルとクラス・ファイルの両方が見つかった場合、どのファイルを読み取るかを指定します。「型の検索」を参照してください。
-
-Xprefer:newer
: ある型に対するソース・ファイルとクラス・ファイルの新しい方が読み取られます(デフォルト)。 -
-Xprefer:source
: ソース・ファイルが読み取られます。SOURCE
の保存ポリシーを使用して宣言された注釈に任意の注釈プロセッサがアクセスできるようにする場合は、-Xprefer:source
を使用してください。
-
-
-Xprint
-
指定された型のテキスト表現をデバッグ目的で出力します。注釈処理もコンパイルも実行しません。出力形式は変更される可能性があります。
-
-XprintProcessorInfo
-
ある特定のプロセッサが処理を依頼されている注釈に関する情報を出力します。
-
-XprintRounds
-
初回および後続の注釈処理のラウンドに関する情報を出力します。
-
-Xstdout filename
-
コンパイラのメッセージを、指定されたファイルに送ります。デフォルトでは、コンパイラのメッセージは
System.err
に送られます。
javacのコマンド行引数ファイル
引数ファイルには、javac
のオプションとソース・ファイル名を自由に組み合わせて記述できます。ファイル内の引数は、空白文字または改行文字で区切ることができます。ファイル名に空白が含まれている場合は、そのファイル名全体を二重引用符で囲みます。
引数ファイル内のファイル名は、現在のディレクトリから相対的で、引数ファイルの場所に対してではありません。このようなリストでは、ワイルドカード(*
)は使用できません(たとえば、*.java
とは指定できません)。ファイルを再帰的に解釈するためのアット記号(@
)の使用はサポートされていません。-J
オプションはサポートされていません(このオプションはランチャに渡されますが、ランチャでは引数ファイルをサポートしていないためです)。
javac
コマンドを実行するときに、各引数ファイルのパスとファイル名の先頭にアット記号(@
)を付けて渡します。javac
コマンドは、アット記号(@
)で始まる引数を検出すると、そのファイルの内容を引数リストに展開します。
javac @filenameの使用例
- 単一の引数ファイル
-
すべての
javac
引数を保持するargfile
という名前の単一の引数ファイルを使用できます。javac @argfile
この引数ファイルには、次の2つの引数ファイルの例で示されている両方のファイルの内容を含めることができます。
- 2つの引数ファイル
-
たとえば、
javac
オプション用に1ファイル、ソース・ファイル名用に1ファイルというように、2つの引数ファイルを作成できます。次のリストでは、行の継続文字を使用していないことに注意してください。次を含む
options
というファイルを作成します。Oracle Solaris、LinuxおよびmacOS:
-d classes -g -sourcepath /java/pubs/ws/1.3/src/share/classes
Windows:
-d classes -g -sourcepath C:\java\pubs\ws\1.3\src\share\classes
次を含む
classes
というファイルを作成します。MyClass1.java MyClass2.java MyClass3.java
次に、次のように
javac
コマンドを実行します。javac @options @classes
- パスを使用した引数ファイル
-
引数ファイルにはパスを指定できますが、ファイル内のすべてのファイル名は、現在の作業ディレクトリに相対的になります(
path1
やpath2
でなく)。javac @path1/options @path2/classes
-Xlintのキーの使用例
-
cast
-
不要で冗長なキャストについて警告します。たとえば:
String s = (String) "Hello!"
-
classfile
-
クラス・ファイルの内容に関する問題について警告します。
-
deprecation
-
非推奨項目の使用について警告します。たとえば:
java.util.Date myDate = new java.util.Date(); int currentDay = myDate.getDay();
メソッド
java.util.Date.getDay
は、JDK 1.1以降、非推奨になりました。 -
dep-ann
-
@deprecated
Javadocコメントでドキュメント化されているが、@Deprecated
注釈が付いていない項目について警告します。たとえば:/** * @deprecated As of Java SE 7, replaced by {@link #newMethod()} */ public static void deprecatedMethod() { } public static void newMethod() { }
-
divzero
-
定整数0による除算について警告します。たとえば:
int divideByZero = 42 / 0;
-
empty
-
if
文以降が空の文であることについて警告します。たとえば、次のようになります。class E { void m() { if (true) ; } }
-
fallthrough
-
fall-through caseのswitchブロックをチェックし、検出されたものに対して警告メッセージを表示します。Fall-through caseは、switchブロック内の最後のcaseを除くcaseです。このコードにはbreak文は含まれず、コードの実行をそのcaseから次のcaseへ移動できます。たとえば、このswitchブロック内のcase 1ラベルに続くコードは、break文で終わっていません。
switch (x) { case 1: System.out.println("1"); // No break statement here. case 2: System.out.println("2"); }
このコードのコンパイル時に
-Xlint:fallthrough
オプションが使用されていた場合、コンパイラは該当するcaseの行番号とともに、caseにfall-throughする可能性があることを示す警告を発行します。 -
finally
-
正常に完了できない
finally
節について警告します。たとえば:public static int m() { try { throw new NullPointerException(); } catch (NullPointerException(); { System.err.println("Caught NullPointerException."); return 1; } finally { return 0; } }
この例では、コンパイラは
finally
ブロックに関する警告を生成します。int
メソッドが呼び出されると、0の値が返されます。finally
ブロックは、try
ブロックが終了すると実行されます。この例では、catch
ブロックに制御が移されると、int
メソッドは終了します。ただし、finally
ブロックは実行される必要があるため、制御がすでにこのメソッドの外部に移されていても、このブロックは実行されます。 -
options
-
コマンド行オプションの使用に関する問題について警告します。「javacのクロスコンパイル・オプション」を参照してください。
-
overrides
-
メソッドのオーバーライドに関する問題について警告します。たとえば、次の2つのクラスがあるとします。
public class ClassWithVarargsMethod { void varargsMethod(String... s) { } } public class ClassWithOverridingMethod extends ClassWithVarargsMethod { @Override void varargsMethod(String[] s) { } }
コンパイラは次のような警告を生成します。
warning: [override] varargsMethod(String[]) in ClassWithOverridingMethod overrides varargsMethod(String...) in ClassWithVarargsMethod; overriding method is missing '...'
コンパイラが
varargs
メソッドを検出すると、varargs
の仮パラメータを配列に変換します。メソッドClassWithVarargsMethod.varargsMethod
では、コンパイラはvarargs
の仮パラメータString... s
を仮パラメータString[] s
(配列)に変換しますが、この配列はメソッドClassWithOverridingMethod.varargsMethod
の仮パラメータと一致します。その結果、この例ではコンパイルが行われます。 -
path
-
コマンド行のクラス・パス、ソース・パスおよびその他のパスとして指定された無効なパス要素と存在しないパス・ディレクトリについて警告します。このような警告を
@SuppressWarnings
注釈で抑制することはできません。たとえば:-
Oracle Solaris、LinuxおよびmacOS:
javac -Xlint:path -classpath /nonexistentpath Example.java
-
Windows:
javac -Xlint:path -classpath C:\nonexistentpath Example.java
-
-
processing
-
注釈処理に関する問題について警告します。コンパイラがこの警告を生成するのは、注釈を含むクラスがあり、そのタイプの例外を処理できない注釈プロセッサを使用している場合です。たとえば、次のものは簡単な注釈プロセッサです:
ソース・ファイルAnnocProc.java:
import java.util.*; import javax.annotation.processing.*; import javax.lang.model.*; import javaz.lang.model.element.*; @SupportedAnnotationTypes("NotAnno") public class AnnoProc extends AbstractProcessor { public boolean process(Set<? extends TypeElement> elems, RoundEnvironment renv){ return true; } public SourceVersion getSupportedSourceVersion() { return SourceVersion.latest(); } }
ソース・ファイルAnnosWithoutProcessors.java:
@interface Anno { } @Anno class AnnosWithoutProcessors { }
次のコマンドは、注釈プロセッサ
AnnoProc
をコンパイルしたあと、ソース・ファイルAnnosWithoutProcessors.java
に対してこの注釈プロセッサを実行します。javac AnnoProc.java javac -cp . -Xlint:processing -processor AnnoProc -proc:only AnnosWithoutProcessors.java
ソース・ファイル
AnnosWithoutProcessors.java
に対して注釈プロセッサを実行すると、コンパイラは次の警告を生成します。warning: [processing] No processor claimed any of these annotations: Anno
この問題を解決するには、
AnnosWithoutProcessors
クラスで定義および使用されている注釈の名前をAnno
からNotAnno
に変更します。 -
rawtypes
-
raw型に対する未チェック操作について警告します。次の文では、
rawtypes
警告が生成されます。void countElements(List l) { ... }
次の例は、
rawtypes
警告が生成されません。void countElements(List<?> l) { ... }
List
はraw型です。ただし、List<?>
はバインドなしのパラメータ化されたワイルドカード型です。List
はパラメータ化されたインタフェースなので、必ずその型引数を指定するようにしてください。この例では、List
の仮引数はバインドなしのワイルドカード(?
)を使用してその仮型パラメータとして指定されています。つまり、countElements
メソッドはList
インタフェースの任意のインスタンス化を受け入れることができます。 -
serial
-
直列化可能クラスに
serialVersionUID
定義がないことを警告します。たとえば:public class PersistentTime implements Serializable { private Date time; public PersistentTime() { time = Calendar.getInstance().getTime(); } public Date getTime() { return time; } }
コンパイラで次のような警告が生成されます。
warning: [serial] serializable class PersistentTime has no definition of serialVersionUID
直列化可能クラスが
serialVersionUID
という名前のフィールドを明示的に宣言しない場合、直列化ランタイム環境は『Javaオブジェクト直列化仕様』で説明されているように、クラスの様々な側面に基づいて、クラスのserialVersionUID
のデフォルト値を計算します。ただし、すべての直列化可能クラスでserialVersionUID
値を明示的に宣言することをお薦めします。これは、serialVersionUID
値を計算するデフォルトのプロセスが、コンパイラの実装によって異なる可能性のあるクラスの詳細にきわめて影響を受けやすいためです。その結果、デシリアライズ中に予期しないInvalidClassExceptions
が発生する可能性があります。様々なjavaコンパイラ実装間でserialVersionUID
値の一貫性を確保にするには、直列化可能クラスでserialVersionUID
値を明示的に宣言しなければいけません。 -
static
-
静的変数の使用に関する問題について警告します。たとえば:
class XLintStatic { static void m1() { } void m2() { this.m1(); } }
コンパイラで次のような警告が生成されます。
warning: [static] static method should be qualified by type name, XLintStatic, instead of by an expression
この問題を解決するために、次のように
static
メソッドm1
を呼び出すことができます。XLintStatic.m1();
あるいは、
static
キーワードをメソッドm1
の宣言から削除することもできます。 -
try
-
try-with-resources文を含む、
try
ブロックの使用に関する問題について警告します。たとえば、try
ブロックで宣言されたリソースac
が使用されていないため、次の文に対して警告が生成されます。try ( AutoCloseable ac = getResource() ) { // do nothing}
-
unchecked
-
Java言語仕様で指定されている未チェック変換警告の詳細を示します。たとえば:
List l = new ArrayList<Number>(); List<String> ls = l; // unchecked warning
型の消去中に、型
ArrayList<Number>
およびList<String>
はそれぞれArrayList
およびList
になります。ls
コマンドはパラメータ化された型List<String>
を持ちます。l
によって参照されているList
がls
に代入されている場合、コンパイラは非チェック警告を生成します。コンパイル時に、コンパイラとJVMはl
がList<String>
型を表すかどうかを判断できません。この場合、l
はList<String>
型を表しません。結果として、ヒープ汚染が発生します。ヒープ汚染状態が発生するのは、
List
オブジェクトl
(そのstatic型はList<Number>
)が別のList
オブジェクトls
(異なるstatic型List<String>
を持つ)に代入される場合です。しかし、コンパイラはこの代入をいまだに許可しています。この代入を許可する必要があるのは、ジェネリックスをサポートしないJava SEのリリースとの下位互換性を確保するためです。型消去のために、List<Number>
とList<String>
はList
になります。その結果、コンパイラはオブジェクトl
(List
というraw型を持つ)をオブジェクトls
に代入することを許可します。 -
varargs
-
可変引数(
varargs
)メソッド、特に非具象化可能引数を含むメソッドの安全でない使用を警告します。たとえば:public class ArrayBuilder { public static <T> void addToList (List<T> listArg, T... elements) { for (T x : elements) { listArg.add(x); } } }
非具象化可能型は、実行時に型情報を完全に使用できない型です。
コンパイラは、メソッド
ArrayBuilder.addToList
の定義に関する次の警告を生成します。:warning: [varargs] Possible heap pollution from parameterized vararg type T
コンパイラがvarargsメソッドを検出すると、
varargs
仮パラメータを配列に変換します。しかし、Javaプログラミング言語では、パラメータ化された型の配列の作成は許可されません。メソッドArrayBuilder.addToList
では、コンパイラはvarargs
の仮パラメータT... elements
要素を仮パラメータT[] elements
要素(配列)に変換します。しかし、型消去のために、コンパイラはvarargs
の仮パラメータをObject[]
要素に変換します。その結果、ヒープ汚染が発生する可能性があります。
コマンド行引数の使用によるコンパイル例
コマンド行引数を指定したかのようにコンパイルするには、次の構文を使用します。
JavaCompiler javac = ToolProvider.getSystemJavaCompiler();
例では、診断を標準出力ストリームに書き込み、コマンド行から呼び出された場合にjavac
コマンドが提供する終了コードを返します。
javax.tools.JavaCompiler
インタフェースで他のメソッドを使えば、診断の処理やファイルの読取り元/書込み先の制御などを行えます。
旧式のインタフェース
ノート:
このAPIは下位互換性の目的でのみ保持されています。新しいコードでは、Java Compiler APIを使用してください。
com.sun.tools.javac.Main
クラスには、プログラム内からコンパイラを呼び出すためのstaticメソッドが2つ用意されています。
public static int compile(String[] args);
public static int compile(String[] args, PrintWriter out);
args
パラメータは、一般にコンパイラに渡される任意のコマンド行引数を表します。
out
パラメータは、コンパイラの診断の出力先を示します。
return
値は、javac
のexit
値と同等です。
ノート:
名前がcom.sun.tools.javac
で始まるパッケージ(com.sun.tools.javac
のサブパッケージ)に含まれるその他のすべてのクラスやメソッドは、厳密に内部用であり、いつでも変更される可能性があります。
複数ソース・ファイルのコンパイル例
この例では、greetings
パッケージ内のAloha.java
、GutenTag.java
、Hello.java
およびHi.java
ソース・ファイルをコンパイルします。
Oracle Solaris、LinuxおよびmacOS:
% javac greetings/*.java
% ls greetings
Aloha.class GutenTag.class Hello.class Hi.class
Aloha.java GutenTag.java Hello.java Hi.java
Windows:
C:\>javac greetings\*.java
C:\>dir greetings
Aloha.class GutenTag.class Hello.class Hi.class
Aloha.java GutenTag.java Hello.java Hi.java
ユーザー・クラス・パスの指定例
前の例のいずれかのソース・ファイルの変更後、それを再コンパイルします。
Oracle Solaris、LinuxおよびmacOS:
pwd
/examples
javac greetings/Hi.java
Windows:
C:\>cd
\examples
C:\>javac greetings\Hi.java
greetings.Hi
は、greetings
パッケージ内の他のクラスを参照しているため、コンパイラはこれらのその他のクラスを探す必要があります。前の例は、デフォルトのユーザー・クラス・パスが、パッケージ・ディレクトリを含むディレクトリであるため機能します。現在のディレクトリに関係なく、このファイルを再コンパイルする場合、CLASSPATH
を設定して、examples
ディレクトリをユーザー・クラス・パスに追加します。この例では-classpath
オプションを使用します。
Oracle Solaris、LinuxおよびmacOS:
javac -classpath /examples /examples/greetings/Hi.java
Windows:
C:\>javac -classpath \examples \examples\greetings\Hi.java
greetings.Hi
を変更してバナー・ユーティリティを使用するようにした場合、このユーティリティもユーザー・クラス・パスを通じてアクセスできる必要があります。
Oracle Solaris、LinuxおよびmacOS:
javac -classpath /examples:/lib/Banners.jar \
/examples/greetings/Hi.java
Windows:
C:\>javac -classpath \examples;\lib\Banners.jar ^
\examples\greetings\Hi.java
greetings
パッケージのクラスを実行するには、プログラムがgreetings
パッケージおよびgreetings
クラスが使用するクラスにアクセスする必要があります。
Oracle Solaris、LinuxおよびmacOS:
java -classpath /examples:/lib/Banners.jar greetings.Hi
Windows:
C:\>java -classpath \examples;\lib\Banners.jar greetings.Hi
注釈処理
javac
コマンドが注釈処理を直接サポートしているため、個別の注釈処理コマンドのapt
を使用する必要がなくなりました。
注釈処理のAPIは、javax.annotation.processing
およびjavax.lang.model
パッケージとそのサブパッケージ内に定義されています。
注釈処理のしくみ
-proc:none
オプションによって注釈処理が無効化されないかぎり、コンパイラは使用可能なすべての注釈プロセッサを検索します。検索パスは-processorpath
オプションを使用して指定できます。パスが指定されていない場合は、ユーザー・クラス・パスが使用されます。プロセッサの検索は、META-INF/services/javax.annotation.processing.Processor
という名前のサービス・プロバイダ構成ファイルを使用して行われます。このファイルは検索パス上にあります。このようなファイルには、使用するすべての注釈プロセッサの名前を、1行に1つずつ含めてください。または、-processor
オプションを使用してプロセッサを明示的に指定することもできます。
コンパイラは、コマンド行のソース・ファイルやクラスをスキャンすることで、どのような注釈が存在しているかを確認し終わると、プロセッサに対して問合わせを行い、それらのプロセッサがどの注釈を処理できるのかを確認します。一致するものが見つかった場合、そのプロセッサが呼び出されます。各プロセッサは、自身が処理する注釈を要求できます。その場合、それらの注釈に対する別のプロセッサを見つける試みは行われません。すべての注釈が要求された後に、コンパイラは追加のプロセッサを検索しません。
いずれかのプロセッサによって新しいソース・ファイルが生成されると、もう1ラウンド注釈処理が行われます。新しく生成されたソース・ファイルがスキャンされ、注釈が前と同じように処理されます。以前のラウンドで呼び出されたプロセッサはすべて、後続のすべてのラウンドでも呼び出されます。これが、新しいソース・ファイルが生成されなくなるまで続きます。
あるラウンドで新しいソース・ファイルが生成されなかった場合、注釈プロセッサがあと1回だけ呼び出され、残りの処理を実行する機会が与えられます。最後に、-proc:only
オプションが使用されなければ、コンパイラは、元のソース・ファイルと生成されたすべてのソース・ファイルをコンパイルします。
型の検索
ソース・ファイルをコンパイルするため、コンパイラは型に関する情報を必要とする場合がありますが、コマンド行で指定されるソース・ファイルに型の定義がありません。
コンパイラは、ソース・ファイルで使われているクラスまたはインタフェース、拡張されているクラスまたはインタフェース、あるいは実装されているクラスまたはインタフェースすべてについて、型の情報を必要とします。これには、ソース・ファイルで明示的には言及されていなくても、継承を通じて情報を提供するクラスとインタフェースも含まれます。
たとえば、java.awt.Window
サブクラスを作成する場合、Window
の祖先のクラス(java.awt.Container
、java.awt.Component
およびjava.lang.Object
)も使用していることになります。
コンパイラは、型の情報が必要になると、その型を定義しているソース・ファイルまたはクラス・ファイルを探します。まず、ブートストラップ・クラスと拡張機能クラスを検索し、続いてユーザー・クラス・パス(デフォルトではカレント・ディレクトリ)を検索します。ユーザー・クラス・パスは、CLASSPATH
環境変数を設定するか、または-classpath
オプションを使用して定義します。
-sourcepath
オプションを設定した場合、コンパイラは指定したパスでソース・ファイルを検索します。そうでない場合、コンパイラは、ユーザー・クラス・パスでクラス・ファイルとソース・コード・ファイルの両方を検索します。
-bootclasspath
オプションと-extdirs
オプションを使用すると、別のブートストラップ・クラスや拡張機能クラスを指定できます。
「javacのクロスコンパイル・オプション」を参照してください。
型の検索に成功したときに得られる結果は、クラス・ファイル、ソース・ファイル、またはその両方である場合があります。両方が見つかった場合、そのどちらを使用すべきかを-Xprefer
オプションでコンパイラに指示できます。newer
が指定された場合、コンパイラは2つのファイルの新しい方を使用します。source
が指定された場合、コンパイラはソース・ファイルを使用します。デフォルトはnewer
です。
型の検索自体によって、または-Xprefer
オプションが設定された結果として、必要な型のソース・ファイルが見つかった場合、コンパイラはそのソース・ファイルを読み取り、必要な情報を取得します。デフォルトで、コンパイラは、ソース・ファイルもコンパイルします。-implicit
オプションを使えばその動作を指定できます。none
を指定した場合、ソース・ファイルのクラス・ファイルは生成されません。class
を指定した場合、ソース・ファイルのクラス・ファイルが生成されます。
コンパイラは、注釈処理の完了後に、ある型情報の必要性を認識しない場合があります。型情報がソース・ファイル内に見つかり、かつ-implicit
オプションが指定されていない場合、コンパイラは、そのファイルが注釈処理の対象とならずにコンパイルされることを警告します。この警告を無効にするには、(そのファイルが注釈処理の対象となるように)そのファイルをコマンド行に指定するか、あるいはそのようなソース・ファイルに対してクラス・ファイルを生成すべきかどうかを-implicit
オプションを使って指定します。