それでも気分は高専生

元高専生が自分のやってきたことを記事として残すためのてきとーなブログ

macOSにsbt環境を入れようとしたら String.class is broken ...

sbtで動作するプロジェクトを動作させようとして、環境構築を行った際に

$ sbt run
> ...
> error: error while loading String, class file '/modules/java.base/java/lang/String.class' is broken (class java.lang.NullPointerException/null)
> ...

と出てしまい、動作しなくなる現象に直面してしまいました。

その解決方法について書いていこうと思います。

環境

現象

  • sbtenvを導入し、sbt1.2.7をインストール
  • scalaenvを導入し、scala2.13.0をインストール
  • jenvを導入し、brew install openjdkでインストールしたjava14.0.2jenv globalに指定

その状態でプロジェクトを動作させようとすると、以下のエラーに遭遇しました。

$ sbt run
> ...
> error: error while loading String, class file '/modules/java.base/java/lang/String.class' is broken (class java.lang.NullPointerException/null)
> ...

原因

調べてみると同様の質問がStack Over Flowに投稿されていました。

brewがJDK13に強く依存しており、他のバージョンのJavaがあっても、JDK13を参照しにいってしまう

とのことです。

自分はJavaScala周りを詳しく知らないので、なぜJDK13を参照してしまうのか、なぜJDK8/11がsbtに必要なのかは良くわかりませんが、やるべきことは書いてくれているのでやっていきましょう。

stackoverflow.com

解決手順

今回はJDK8を導入することにしました。

$ brew tap AdoptOpenJDK/openjdk
$ brew cask install adoptopenjdk8
$ jenv add /Library/Java/JavaVirtualMachines/zulu-8.jdk/Contents/Home
$ jenv versions
>  1.8
>  14
>  14.0
>*14.0.2

sbtのプロジェクトを動作確認するなら以下の通りです。

$ jenv local 1.8
$ jenv local
> 1.8
$ sbt run