Javaのコンパイラコマンドであるjavacコマンドについて
普段何気なく使っているこのコマンド。時々、ファイルエンコーディングのところとか、パッケージを指定したりする場合に単純にコンパイルできない時とかあるので、備忘としてまとめる。
実行環境について
これから記載していく内容は以下の環境で実行する。
OS:macOS Mojave(バージョン 10.14.4)
javacコマンド:バージョン 1.8.0_151
javacコマンドの使い方 実行例1
まずは、素直な使い方についてで、以下のようなJavaで書いたサンプルソースをコンパイルする場合について。
public class Sample {
public static void main(String[] args) {
System.out.println("Hello, world!!");
}
}
以下の通り、javacコマンドの引数に上記ファイルを指定して実行するだけ。特にエラーがなく正常にコンパイルができたら、プロンプトが表示される。
$ javac Sample.java
因みに、Javaの文法が間違っていたりすると、以下のようなエラーになる(main関数の戻り値のvoid綴り間違えの場合)。
意外とメッセージが親切で、ちゃんと読めばだいたい何でエラーになっているかわかると思う。
$ javac Sample.java
Sample.java:2: エラー: シンボルを見つけられません
public static viod main(String[] args) {
^
シンボル: クラス viod
場所: クラス Sample
エラー1個
javacコマンドの使い方 実行例2
次はJavaのコードを書いているソースファイルの文字エンコードと、クライアントの環境のシステムの文字エンコードが異なる場合について。例えば、Windows
だと、基本的にSJIS
なので、例えば日本語でこんにちは
とかをソースに記載したファイルをUTF-8
で保存してコンパイルするとエラーになってしまう。
エラーの例を示すために事前確認。まずは環境のデフォルト?ファイルエンコーディングを取得する。以下のソースを作成して、コンパイル後に実行する。実行すると、ファイルエンコーディングが標準出力に出力される。今回はUTF-8
と出力されました。
public class EncodingCheck {
public static void main(String[] args) {
System.out.println(System.getProperty("file.encoding"));
}
}
次に、以下の内容を記載したソースファイルを文字エンコーディングSJIS
で保存してコンパイルしてみる。これは上記で事前に調べたファイルエンコーディングとは別のものにするためにSJIS
としている。
public class Sample2 {
public static void main(String[] args) {
System.out.println("こんにちは");
}
}
実行結果としては、以下の通り。コンパイルエラーとなった。エラー内容をみると、UTF8では正常に表示できない文字コードが使われていたのでエラーとのこと。この場合は、javac
コマンドのオプションで文字エンコーディングを指定してやれば良い(今回の場合だと、もちろんファイルをUTF8で保存し直すのでも正常にコンパイルできる)。
(これ、なんで7個もエラーが表示されるのかはわからない。気が向いた時にでも調べたい)
$ javac Sample2.java
Sample2.java:3: エラー: この文字は、エンコーディングUTF8にマップできません
System.out.println("����ɂ���");
^
Sample2.java:3: エラー: この文字は、エンコーディングUTF8にマップできません
System.out.println("����ɂ���");
^
Sample2.java:3: エラー: この文字は、エンコーディングUTF8にマップできません
System.out.println("����ɂ���");
^
Sample2.java:3: エラー: この文字は、エンコーディングUTF8にマップできません
System.out.println("����ɂ���");
^
Sample2.java:3: エラー: この文字は、エンコーディングUTF8にマップできません
System.out.println("����ɂ���");
^
Sample2.java:3: エラー: この文字は、エンコーディングUTF8にマップできません
System.out.println("����ɂ���");
^
Sample2.java:3: エラー: この文字は、エンコーディングUTF8にマップできません
System.out.println("����ɂ���");
^
エラー7個
以下の通り、encoding
オプションの引数に、ファイル文字エンコーディングであるSJIS
を指定して実行してあげればコンパイルエラーにならない(因みに、encoding
オプションはファイル名の後ろに記載してても問題ない)。
$ javac -encoding sjis Sample2.java
あとがき
まだまだ他にも確認しておきたいことあるが、これ以上記載しても盛りだくさんになりすぎるので一旦終わり。あとで、クラスパスとかソースパスとかも確認しておきたいと思う。