動かして覚える山

エンジニアリング関連のことについて色々書いていきます。これは、自分が何ができるかを外部に公開すること。アウトプットの場にすること。他のエンジニアの参考になるものを投稿すること。自分用のメモとしてなどを目的として書いています。ですので、投稿の頻度や質は今の所まばらです。

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コマンドに相当します。 使用しているコマンドがどのパスにあるか確認するときに結構使いますので覚えておいて損はないはずです。