PowerShellでencoding指定してJava動かしたら失敗した話

Java

はじめに

Java Bronze学習用に、Visual Studio Code(以降 VS Code)を使ってJavaの環境を作っているのですが、ターミナルを使ってJavaを実行した際に、ClassNotFoundExceptionが発生して実行に失敗しました。

その時の解決方法がいくつかあったので、まとめておこうと思い記事にしています。

コンパイルしたコード

とっても簡単なプログラムを用意して実行しています。

class Hello {
  public static void main(String[] args) {
    System.out.println("Welcome to VSCode Coding!!");
    System.out.println("にほんごだよー");
  }
}

エラーの内容

javaコマンド実行時にencodingを指定し、失敗してます。

PS C:\JavaWorkspace> javac -encoding UTF-8 Hello.java
PS C:\JavaWorkspace> java -Dfile.encoding=UTF-8 Hello
エラー: メイン・クラス.encoding=UTF-8を検出およびロードできませんでした
原因: java.lang.ClassNotFoundException: /encoding=UTF-8

解決方法

この記事では解決方法を3点挙げます。

  1. ダブルクォーテーションで括る
  2. コマンドオプションの順番を変える
  3. Javaファイルの文字コードを変える

1. ダブルクォーテーションで括る

エンコードを指定するオプション「-Dfile.encoding=UTF-8」をダブルクォーテーションで括ると動作します。

実行例

PS C:\JavaWorkspace> java "-Dfile.encoding=UTF-8" Hello
Welcome to VSCode Coding!!
にほんごだよー

2. コマンドオプションの順番を変える

javaコマンドの直後にクラス名を指定し、エンコードを指定するオプション「-Dfile.encoding=UTF-8」を最後尾に記述しても動作しました。

実行例

PS C:\JavaWorkspace> java Hello -Dfile.encoding=UTF-8      
Welcome to VSCode Coding!!
にほんごだよー

3. Javaファイルの文字コードを変える

VS Codeはファイルを作成する際、文字コードはUTF-8がデフォルトになっています。したがって、Shift-Jisに文字コードを変更してファイルを保存しなおし、コンパイル => 実行すれば、そもそもエンコードを指定するオプション「-Dfile.encoding=UTF-8」自体の指定が不要です。

次の実行例は、文字コードをShift-Jisに変更したHelloSjis.javaを用意してコンパイル・実行したものです。

実行例

PS C:\JavaWorkspace> javac HelloSjis.java
PS C:\JavaWorkspace> java HelloSjis
Welcome to VSCode Coding!!
にほんごだよー

最後に

Java Bronze受験をされる方が環境構築でつまづいてしまうくらいなら、と思ってVS Codeを進めることが多いのです。ただ、PowerShellの挙動によって、テキストに書いてあるJavaコマンドが実行できないのは悲しすぎるので、自分がサポートする際の知識メモとして置いておければと思いました。

ちなみにこの件は、2015年くらいからPowerShellの挙動としては認知されているようで、ちょこちょこ同じような地雷を踏んづけている方はいらっしゃいますね。。2022年までこの挙動が解消されていないってことは、仕様なんでしょうかね。。。?ほんと?

参考文献

StackOverflow

Why does PowerShell split arguments containing hyphens and periods?
In a PowerShell window: PS C:\> echo -abc.def.ghi -abc .def.ghi For some reason, the combination of a hyphen and period cause Powershell to split the argument i...

日本語のStackOverflow

tensorflowをJDKで動かしたいが,エラーが出る
javaでtensorflowを使用しようとしているのですが, チュートリアル:中のTensorFlow with the JDKの通りに必要なものをダウンロードし,コンパイルまではできたのですが, java -cp libtensorflow-1.11.0.jar;. -Djava.library.p...

[Windows]PowerShellコマンド環境で引っかかったこと(torutkのブログ)

コメント

タイトルとURLをコピーしました