プライマリ・コンテンツに移動
Java Platform, Standard Editionツール・リファレンス
リリース10
E94992-01
目次へ移動
目次

前
次

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の引数ファイルの説明は「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

初期モジュールに加えて解決するルート・モジュール、またはmoduleALL-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]

カンマで区切られたキーワードのリストによって指定された種類のデバッグ情報のみを生成します。有効なキーワードは、次のとおりです。

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]

注釈処理とコンパイルが実行されるかどうかを制御します。-proc:noneは、注釈処理なしでコンパイルが実行されることを意味します。-proc:onlyは、注釈処理のみが実行され、後続のコンパイルは実行されないことを意味します。

-processor class1 [,class2,class3...]

実行する注釈プロセッサの名前。これを指定した場合、デフォルトの検索処理は省略されます。

--processor-module-path path or -p module-path

注釈プロセッサの検索に使用されるモジュール・パスを指定します。

--processor-path path or -processorpath path

注釈プロセッサを見つける場所を指定します。このオプションが使用されていない場合、クラス・パスでプロセッサが検索されます。

-profile profile

使用されるAPIが指定プロファイルで使用可能であることをチェックします。

注意:

JDK 9以降で--release releaseを使用してコンパイルする場合には、サポートされません。JDK 9よりも前のバージョンでのコンパイルの詳細は、--release releaseの説明を参照してください。

--release release

特定のVMバージョンについてサポートされるドキュメント化されたパブリックAPIに対してコンパイルします。サポートされるreleaseターゲットは、6789および10です。

注意:

モジュールをサポートする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が指定されているように動作します。

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で導入された機能を含むコードを受け付けます。

--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)*

指定のモジュールで必須と見なされる追加モジュールを指定します。

--default-module-for-created-files module-name

何も指定されていないか無効な場合に注釈プロセッサによって作成されるファイルのフォールバック・ターゲット・モジュールを指定します。

-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

変数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.javaRetentionPolicy.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および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
パスを使用した引数ファイル

引数ファイルにはパスを指定できますが、ファイル内のすべてのファイル名は、現在の作業ディレクトリに相対的になります(path1path2でなく)。

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によって参照されているListlsに代入されている場合、コンパイラは非チェック警告を生成します。コンパイル時に、コンパイラとJVMはlList<String>型を表すかどうかを判断できません。この場合、lList<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値は、javacexit値と同等です。

注意:

名前がcom.sun.tools.javacで始まるパッケージ(com.sun.tools.javacのサブパッケージ)に含まれるその他のすべてのクラスやメソッドは、厳密に内部用であり、いつでも変更される可能性があります。

複数ソース・ファイルのコンパイル例

この例では、greetingsパッケージ内のAloha.javaGutenTag.javaHello.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.Containerjava.awt.Componentおよびjava.lang.Object)も使用していることになります。

コンパイラは、型の情報が必要になると、その型を定義しているソース・ファイルまたはクラス・ファイルを探します。まず、ブートストラップ・クラスと拡張機能クラスを検索し、続いてユーザー・クラス・パス(デフォルトではカレント・ディレクトリ)を検索します。ユーザー・クラス・パスは、CLASSPATH環境変数を設定するか、または-classpathオプションを使用して定義します。

-sourcepathオプションを設定した場合、コンパイラは指定したパスでソース・ファイルを検索します。そうでない場合、コンパイラは、ユーザー・クラス・パスでクラス・ファイルとソース・コード・ファイルの両方を検索します。

-bootclasspathオプションと-extdirsオプションを使用すると、別のブートストラップ・クラスや拡張機能クラスを指定できます。「javacのクロスコンパイル・オプション」を参照してください。

型の検索に成功したときに得られる結果は、クラス・ファイル、ソース・ファイル、またはその両方である場合があります。両方が見つかった場合、そのどちらを使用すべきかを-Xpreferオプションでコンパイラに指示できます。newerが指定された場合、コンパイラは2つのファイルの新しい方を使用します。sourceが指定された場合、コンパイラはソース・ファイルを使用します。デフォルトはnewerです。

型の検索自体によって、または-Xpreferオプションが設定された結果として、必要な型のソース・ファイルが見つかった場合、コンパイラはそのソース・ファイルを読み取り、必要な情報を取得します。デフォルトで、コンパイラは、ソース・ファイルもコンパイルします。-implicitオプションを使えばその動作を指定できます。noneを指定した場合、ソース・ファイルのクラス・ファイルは生成されません。classを指定した場合、ソース・ファイルのクラス・ファイルが生成されます。

コンパイラは、注釈処理の完了後に、ある型情報の必要性を認識しない場合があります。型情報がソース・ファイル内に見つかり、かつ-implicitオプションが指定されていない場合、コンパイラは、そのファイルが注釈処理の対象とならずにコンパイルされることを警告します。この警告を無効にするには、(そのファイルが注釈処理の対象となるように)そのファイルをコマンド行に指定するか、あるいはそのようなソース・ファイルに対してクラス・ファイルを生成すべきかどうかを-implicitオプションを使って指定します。