bff

フルスタックエンジニアを目指して学んだことなどを記録しています

「クラス・ファイルのバージョンXX.Xは不正です」の対処方法

WebAuthnを勉強しようと思って、()[]を動かそうとしていたところ、Javaのクラスファイルのバージョンが不正というエラーが出てしまいました。 解決までにすこし手間取ったので、簡単にまとめておきます。

ひとことで言うと

JDKのバージョンがMavenで指定されているものと違ったためエラーがでました。 適切なJDKのバージョン(今回は1.8)をインストールし、環境変数JAVA_HOMEのパスを1.8に向けることで解消できます。 なお、Javaのバージョン表記はややこしいので(java8まではjava --versionで見ると1.8と表示される)、以下ではjava8という表記で統一しています。

発生したエラー

[ERROR] COMPILATION ERROR : 

[INFO] -------------------------------------------------------------

[ERROR] /Users/foobar/local/webauthndemo/src/main/java/com/google/webauthn/gaedemo/objects/PublicKeyCredentialEntity.java:[19,8] java.lang.Objectにアクセスできません
  クラス・ファイル/modules/java.base/java/lang/Object.classは不正です
    クラス・ファイルのバージョン55.0は不正です。53.0である必要があります
    削除するか、クラスパスの正しいサブディレクトリにあるかを確認してください。

[INFO] 1 error

[INFO] -------------------------------------------------------------

[INFO] ------------------------------------------------------------------------

[INFO] BUILD FAILURE

[INFO] ------------------------------------------------------------------------

[INFO] Total time:  4.872 s

[INFO] Finished at: 2019-02-20T08:26:46+09:00

[INFO] ------------------------------------------------------------------------

[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.3:compile(default-compile) on project gaedemo: Compilation failure

[ERROR] /Users/foobar/local/webauthndemo/src/main/java/com/google/webauthn/gaedemo/objects/PublicKeyCredentialEntity.java:[19,8] java.lang.Objectにアクセスできません

[ERROR]   クラス・ファイル/modules/java.base/java/lang/Object.classは不正です

[ERROR]     クラス・ファイルのバージョン55.0は不正です。53.0である必要があります

[ERROR]     削除するか、クラスパスの正しいサブディレクトリにあるかを確認してください。

前提

OS: macos インストール済みのJavaのバージョン: 11, 8(所用があってもともと2バージョンいれていました。以下のような構成です。)

$ ls /Library/Java/JavaVirtualMachines/

jdk-11.0.2.jdk   jdk1.8.0_201.jdk

原因

WebAuthnDemoのpom.xmlを見ると以下のような記載があり、java8でコンパイルするようになっています。

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>

一方で、Javaのバージョンを確認すると11となっていました。

$ javac --version

javac 11.0.2

対応方法

Java11が利用されてしまっていたので、Java8に向き先を変えます。 環境変数JAVA_HOMEの設定によるものなので、以下のように向き先を変更しております。

一時的にJava8に向き先変更

$ export JAVA_HOME=`/usr/libexec/java_home -v "1.8"`
$ echo $JAVA_HOME
/Library/Java/JavaVirtualMachines/jdk1.8.0_201.jdk/Contents/Home
$ PATH=$JAVA_HOME/bin:$PATH

なお、すでにJAVA_HOMEが設定されている場合は、最後の1行は不要です。 今回は一時的にビルドするために必要だったので上記コマンドにしていますが、常にJava8を利用したい場合は、以下のコマンドを実行するか~/.bash_profileにJAVA_HOMEとPATHを追記してください。

永続的にJava8に向き先変更

$ echo "JAVA_HOME=`/usr/libexec/java_home -v "1.8"`
PATH=$JAVA_HOME/bin:$PATH" >> ~/.bash_profile