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
の引数ファイルの説明は「javacのコマンド行引数ファイル」を参照してください。
ソース・コードのファイル名には.java
接尾辞が必要で、クラスのファイル名には.class
接尾辞が必要であり、ソース・ファイルとクラス・ファイルのどちらも、クラスを識別するルート名が必要です。たとえば、MyClass
という名前のクラスは、MyClass.java
というソース・ファイルに記述され、MyClass.class
というバイトコード・クラス・ファイルにコンパイルされます。
内部クラスが定義されていると、追加のクラス・ファイルが生成されます。これらのクラス・ファイルの名前は、MyClass$MyInnerClass.class
のように、内部クラス名と外部クラス名を組み合わせたものになります。
ソース・ファイルは、パッケージ・ツリーを反映したディレクトリ・ツリーに配置する必要があります。例:
Oracle Solaris、LinuxおよびOS X: すべてのソース・ファイルを/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の標準オプション」を参照)で別の出力先ディレクトリを指定できます。
プログラマティック・インタフェース
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
の様々なオプション・セットは、次の各項で説明します。
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 release
を使用してコンパイルする場合、サポートされません。JDK 9以外のバージョンでのコンパイルの詳細は、--release release
の説明を参照してください。
--class-path path
、-classpath path
または-cp path
ユーザー・クラス・ファイルと注釈プロセッサを検索する場所を指定します。このクラス・パスはCLASSPATH
環境変数のユーザー・クラス・パスをオーバーライドします。
--class-path
、-classpath
または-cp
が指定指定されていない場合、ユーザー・クラス・パスは現在のディレクトリになります。
-sourcepath
オプションが指定されていない場合は、ソース・ファイルもユーザー・クラス・パスから検索されます。
-processorpath
オプションが指定されていない場合は、注釈プロセッサもクラス・パスから検索されます。
-d directory
クラス・ファイルの出力先ディレクトリを設定します。クラスがパッケージに含まれる場合、javac
は、パッケージ名を反映したサブディレクトリにクラス・ファイルを置き、必要に応じてディレクトリを作成します。例:
Oracle Solaris、LinuxおよびOS X: -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
の省略表記です。
-encoding encoding
ソース・ファイルで使用される文字エンコーディング(EUC-JPやUTF-8など)を指定します。-encoding
オプションが指定されていない場合は、プラットフォームのデフォルト・コンバータが使用されます。
-endorseddirs directories
承認された標準パスの位置をオーバーライドします。
注意:
このオプションは、JDK 9で--release release
を使用してコンパイルする場合、サポートされません。JDK 9以外のバージョンでのコンパイルの詳細は、--release release
の説明を参照してください。
-extdirs directories
インストールされた拡張機能の位置をオーバーライドします。directories
変数は、コロンで区切ったディレクトリのリストです。指定したディレクトリ内の各JARファイルから、クラス・ファイルが検索されます。見つかったすべてのJARファイルがクラス・パスの一部になります。
クロスコンパイルを行う場合、このオプションには拡張クラスが格納されているディレクトリを指定します。「javacのクロスコンパイル・オプション」を参照してください。
注意:
このオプションは、JDK 9で--release release
を使用してコンパイルする場合、サポートされません。JDK 9以外のバージョンでのコンパイルの詳細は、--release release
の説明を参照してください。
-g
ローカル変数を含むすべてのデバッグ情報を生成します。デフォルトでは、行番号およびソース・ファイル情報だけが生成されます。
-g:[lines, vars, source],[lines, vars, source],[lines, vars, source]
カンマで区切られたキーワードのリストによって指定された種類のデバッグ情報のみを生成します。有効なキーワードは、次のとおりです。
-g:none
デバッグ情報を生成しません。
-h directory
生成されるネイティブ・ヘッダー・ファイルを格納する場所を指定します。
このオプションを指定すると、ネイティブ・メソッドが含まれるクラスまたはjava.lang.annotation.Native注釈で注釈付けられた定数が1つ以上あるクラスごとにネイティブ・ヘッダー・ファイルが生成されます。クラスがパッケージに含まれる場合、コンパイラは、パッケージ名を反映したサブディレクトリにネイティブ・ヘッダー・ファイルを置き、必要に応じてディレクトリを作成します。
--help
または–help
標準オプションの形式を出力します。
--help-extra
または-X
追加オプションのヘルプを出力します。
-implicit:{[none, class],[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] , [none, only]
注釈処理とコンパイルが実行されるかどうかを制御します。-proc:none
は、注釈処理なしでコンパイルが実行されることを意味します。-proc:only
は、注釈処理のみが実行され、後続のコンパイルは実行されないことを意味します。
-processor class1 [,class2,class3...]
実行する注釈プロセッサの名前。これを指定した場合、デフォルトの検索処理は省略されます。
--processor-module—path path
または-p module-path
注釈プロセッサの検索に使用されるモジュール・パスを指定します。
--processor—path path
または-processorpath path
注釈プロセッサを見つける場所を指定します。このオプションが使用されていない場合、クラス・パスでプロセッサが検索されます。
-profile profile
使用されるAPIが指定プロファイルで使用可能であることをチェックします。
注意:
JDK 9で--release release
を使用してコンパイルする場合、サポートされません。JDK 9以外のバージョンでのコンパイルの詳細は、--release release
の説明を参照してください。
--release release
特定のVMバージョンについてサポートされるドキュメント化されたパブリックAPIに対してコンパイルします。サポートされるrelease
ターゲットは、6
、7
、8
および9
です。
注意:
モジュールをサポートするJava Platformのバージョンに--release
を使用すると、--add-modules
を使用して内部JDKモジュールにアクセスすることも、--add-exports
を使用してモジュールの内部JDK APIにアクセスすることもできません。
-s directory
生成されたソース・ファイルの格納に使用されるディレクトリを指定します。クラスがパッケージに含まれる場合、コンパイラは、パッケージ名を反映したサブディレクトリにソース・ファイルを置き、必要に応じてディレクトリを作成します。例:
Oracle Solaris、LinuxおよびOS X: -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
が指定されているように動作します。
--source-path path
または-sourcepath path
入力ソース・ファイルの検索場所を指定します。これは、クラスまたはインタフェースの定義の検索に使用されるソース・コード・パスです。ユーザー・クラス・パスと同様に、ソース・パスのエントリは、Oracle Solarisではコロン(:)で、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 release
を使用してコンパイルする場合、サポートされません。JDK 9以外のバージョンでのコンパイルの詳細は、--release release
の説明を参照してください。
javacの追加オプション
--add-exports module/package=other-module(,other-module)
*定義モジュールから追加モジュールに、あるいはother-module
の値がALL-UNNAMED
の場合はすべての名前のないモジュールにエクスポートされると見なされるパッケージを指定します。
--add-reads module=other-module(,other-module)
*指定のモジュールで必須と見なされる追加モジュールを指定します。
-Djava.endorsed.dirs=dirs
承認された標準パスの位置をオーバーライドします。
注意:
JDK 9で--release release
を使用してコンパイルする場合、サポートされません。JDK 9以外のバージョンでのコンパイルの詳細は、--release release
の説明を参照してください。
-Djava.ext.dirs=dirs
インストールされた拡張機能の位置をオーバーライドします。
注意:
このオプションは、JDK 9で--release release
を使用してコンパイルする場合、サポートされません。JDK 9以外のバージョンでのコンパイルの詳細は、--release release
の説明を参照してください。
--doclint-format [html4|html5]
ドキュメント・コメントの形式を指定します。
--patch-module module=file(:file)
*JARファイルまたはディレクトリ内のクラスおよびリソースでモジュールをオーバーライドまたは拡張します。
-Xbootclasspath:path
ブートストラップ・クラス・ファイルの位置をオーバーライドします。
注意:
このオプションは、JDK 9で--release release
を使用してコンパイルする場合、サポートされません。JDK 9以外のバージョンでのコンパイルの詳細は、--release release
の説明を参照してください。
-Xbootclasspath/a:path
ブートストラップ・クラス・パスに接尾辞を追加します。
注意:
このオプションは、JDK 9で--release release
を使用してコンパイルする場合、サポートされません。JDK 9以外のバージョンでのコンパイルの詳細は、--release release
の説明を参照してください。
-Xbootclasspath/p:path
ブートストラップ・クラス・パスに接頭辞を追加します。
注意:
このオプションは、JDK 9で--release release
を使用してコンパイルする場合、サポートされません。JDK 9以外のバージョンでのコンパイルの詳細は、--release release
の説明を参照してください。
-Xdiags:[compact, verbose]
診断モードを選択します。
-Xdoclint
javadoc
コメントの問題に関する推奨チェックを有効にします
-Xdoclint:(all|none|[-]group) [/access]
特定のグループのチェックを有効または無効にします(group
は次の値のいずれかです)。
accessibility
html
missing
reference
syntax
これらのチェックのグループの詳細は、javadoc
コマンドの-Xdoclint
オプションを参照してください。javac
コマンドで-Xdoclint
オプションはデフォルトで無効にされています。
変数access
は、-Xdoclint
オプションでチェックするクラスとメンバーの最低の可視性レベルを指定します。これは、(最大から最低の可視性の順序で)次の値のいずれかになります。
public
protected
package
private
デフォルトのアクセス・レベルはprivate
です。
たとえば、次のオプションは、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の使用について警告します。
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で示されている両方のファイルの内容を格納できます。
たとえば、javac
オプション用に1ファイル、ソース・ファイル名用に1ファイルというように、2つの引数ファイルを作成できます。次のリストでは、行の継続文字を使用していないことに注意してください。
次を含むoptionsというファイルを作成します。
Oracle Solaris、LinuxおよびOS X:
-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およびOS X: 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およびOS X:
% 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およびOS X:
pwd /examples javac greetings/Hi.java
Windows:
C:\>cd \examples C:\>javac greetings\Hi.java
greetings.Hi
は、greetings
パッケージ内の他のクラスを参照しているため、コンパイラはこれらのその他のクラスを探す必要があります。前の例は、デフォルトのユーザー・クラス・パスが、パッケージ・ディレクトリを含むディレクトリであるため機能します。現在のディレクトリに関係なく、このファイルを再コンパイルする場合、CLASSPATH
を設定して、例のディレクトリをユーザー・クラス・パスに追加します。この例では-classpath
オプションを使用します。
Oracle Solaris、LinuxおよびOS X:
javac -classpath /examples /examples/greetings/Hi.java
Windows:
C:\>javac -classpath \examples \examples\greetings\Hi.java
greetings.Hi
を変更してバナー・ユーティリティを使用するようにした場合、このユーティリティもユーザー・クラス・パスを通じてアクセスできる必要があります。
Oracle Solaris、LinuxおよびOS X:
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およびOS X:
java -classpath /examples:/lib/Banners.jar greetings.Hi
Windows:
C:\>java -classpath \examples;\lib\Banners.jar greetings.Hi
-source 1.7
オプションにより、OldCode.javaのコンパイルにはリリース1.7(または7)のJavaプログラミング言語を使用する必要があることが指定されます。-target 1.7
オプションにより、JVM 1.7と互換性のあるクラス・ファイルが生成されます。
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
オプションを使って指定します。