javac でコンパイルはできるが、javaで実行時エラー
使用環境はWindows10です。
次のようなエラーが発生した。
Error: A JNI error has occurred, please check your installation and try again Exception in thread "main" java.lang.UnsupportedClassVersionError: HelloWorld has been compiled by a more recent version of the Java Runtime (class file version 57.0), this version of the Java Runtime only recognizes class file versions up to 52.0 at java.lang.ClassLoader.defineClass1(Native Method) at java.lang.ClassLoader.defineClass(Unknown Source) at java.security.SecureClassLoader.defineClass(Unknown Source) at java.net.URLClassLoader.defineClass(Unknown Source) at java.net.URLClassLoader.access$100(Unknown Source) at java.net.URLClassLoader$1.run(Unknown Source) at java.net.URLClassLoader$1.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) at sun.launcher.LauncherHelper.checkAndLoadMain(Unknown Source)
新しいバージョンのコンパイラでコンパイルしたクラスファイルは、古いランタイムでは解釈できないから実行できないみたいなことを言っている。 javaとjavacのバージョンを確認してもよくわからない。
C:\Users\syuh31\work\example\java\hello_world>java -version java version "1.8.0_241" Java(TM) SE Runtime Environment (build 1.8.0_241-b07) Java HotSpot(TM) 64-Bit Server VM (build 25.241-b07, mixed mode) C:\Users\syuh31\work\example\java\hello_world>javac -version javac 13.0.2
どこのファイル使ってるんだ?
C:\Users\syuh31\work\example\java\hello_world>where javac C:\Program Files\Java\jdk-13.0.2\bin\javac.exe C:\Users\syuh31\work\example\java\hello_world>where java C:\Program Files (x86)\Common Files\Oracle\Java\javapath\java.exe C:\Program Files\Java\jdk-13.0.2\bin\java.exe
なるほど、そういうことか、使っているjavaが違いますね。 私の場合は、システム環境変数のPATHに C:\Program Files (x86)\Common Files\Oracle\Java\javapath\java.exe が設定されていたので削除しました。 エラーによると、ランタイムのほうが古いといっているので、新しいランタイムを使うようにして問題ないでしょう。 下位互換性はあるはずですから。
修正後のwhichとversionを見ておきましょう
C:\Users\syuh31\work\example\java\hello_world>which java /c/Program Files/Java/jdk-13.0.2/bin/java C:\Users\syuh31\work\example\java\hello_world>which javac /c/Program Files/Java/jdk-13.0.2/bin/javac C:\Users\syuh31\work\example\java\hello_world>javac -version javac 13.0.2 C:\Users\syuh31\work\example\java\hello_world>java -version java version "13.0.2" 2020-01-14 Java(TM) SE Runtime Environment (build 13.0.2+8) Java HotSpot(TM) 64-Bit Server VM (build 13.0.2+8, mixed mode, sharing)
ちなみに今回使った。whichコマンドですが、ubuntuだとwhereコマンドに相当します。 使用しているコマンドがどのパスにあるか確認するときに結構使いますので覚えておいて損はないはずです。