javac Javaのソースをコンパイルするコマンド

javacとは、Javaのソースコードをコンパイルしてクラスファイルを生成するコマンドである。

javacコマンドはJDK (Java Development Kit)に含まれるため、javacコマンドを使うためにはJDKをインストールする必要がある。JRE (Java Runtime Environment)にjavacコマンドは含まれていない。

コンパイル

Javaのソースファイルをテキストエディタ等で作成します。次にjava ソースファイルの例 HelloWorld.java を示します。

class HelloWorld {
  public static void main(String args[]) {
    System.out.println("Hello world");
  }
}

Javaのソースファイルをコンパイルするには、javac コマンドを使用します。

javac [option...] source

javacコマンドオプション一覧

javacコマンドに指定できるオプションの一覧を次に示す。

-g
すべてのデバッグ情報を生成する。
$ more Example.java
import java.util.Calendar;

public class Example {
  public static void main(String[] args) {
    Calendar calendar = Calendar.getInstance();
    System.out.println(calendar.get(Calendar.YEAR));
  }
}
$ javac -g Example.java
$ javap -l Example
Compiled from "Example.java"
public class Example {
  public Example();
    LineNumberTable:
      line 3: 0
    LocalVariableTable:
      Start  Length  Slot  Name   Signature
          0       5     0  this   LExample;

  public static void main(java.lang.String[]);
    LineNumberTable:
      line 5: 0
      line 6: 4
      line 7: 15
    LocalVariableTable:
      Start  Length  Slot  Name   Signature
          0      16     0  args   [Ljava/lang/String;
          4      12     1 calendar   Ljava/util/Calendar;
}
-g:none
デバッグ情報を生成しない。
-g:{lines,vars,source}
指定したデバッグ情報のみを生成する。
デバッグ情報
デバッグ情報 説明
lines ソースコードの行番号
source ソースファイル名
vars ローカル変数名
-nowarn
警告を発生させない。
-verbose
コンパイラの動作についてメッセージを出力する。
-deprecation
推奨されないAPIが使用されているソースの位置を出力する。
-classpath path
-cp path
ユーザークラスファイル及び注釈プロセッサを検索する位置を指定する。
$ javac -classpath /home/tsuka/example.jar Example.java
-sourcepath path
入力ソースファイルを検索する位置を指定する。
-bootclasspath path
ブートストラップクラスパスの位置をオーバーライドする。
-extdirs dirs
インストール済み拡張機能の位置をオーバーライドする。
-endorseddirs dir
推奨規格パスの位置をオーバーライドする。
-proc:{name,only}
注釈処理やコンパイルを実行するかどうかを制御する。
-processor class1[,class2...]
実行する注釈プロセッサの名前。デフォルトの検出処理をバイパスする。
-processorpath path
注釈プロセッサを検索する位置を指定する。
-d dir
生成したクラスファイルをdirで指定したディレクトリに格納する。
-s dir
生成されたソースファイルを格納する場所を指定する。
-implicit:{name,class}
暗黙的に参照されるファイルについてクラスファイルを生成するかどうかを指定する。
-encoding encoding
ソースファイルが使用する文字エンコーディングを指定する。
$ javac -encoding UTF-8 Example.java
-source release
指定されたリリースとソースの互換性を保つ。
-target release
特定のVMバージョン用のクラスファイルを生成する。
-version
バージョン情報を表示する。
$ javac -version
-help
標準オプションの概要を表示する。
$ javac -help
-Akey[:value]
注釈プロセッサに渡されるオプション
-X
非標準オプションの概要を表示する。
-Jflag
flagを実行システムに直接渡す。
-Werror
警告が発生した場合にコンパイルを終了する。
@filename
ファイルからの読み取りオプション及びファイル名

使用例

javac HelloWorld.java

認識されていません

Microsoft Windowsコマンドプロンプトからjavacコマンドを実行したときに「認識されていません」とのエラーメッセージが表示される場合、JDKがインストールされていないか、環境変数 Path にjavacコマンドが存在するフォルダのパスが設定されていない。

C:\>javac
'javac' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。

Microsoft WindowsPowerShellからjavacコマンドを実行したときに「認識されていません」とのエラーメッセージが表示される場合、JDKがインストールされていないか、環境変数 Path にjavacコマンドが存在するフォルダのパスが設定されていない。

PS C:\> javac
javac : 用語 'javac' は、コマンドレット、関数、スクリプト ファイル、または操作可能なプログラムの名前として認識されませ
ん。名前が正しく記述されていることを確認し、パスが含まれている場合はそのパスが正しいことを確認してから、再試行してくだ
さい。
発生場所 行:1 文字:1
+ javac
+ ~~~~~
    + CategoryInfo          : ObjectNotFound: (javac:String) [], CommandNotFoundException
    + FullyQualifiedErrorId : CommandNotFoundException

参考文献

Oracle (2020) "Supported Encodings" Internationalization Guide