[Scala,sbt,play] M1 mac で sbt を利用してPlayFrameworkのテンプレートを起動するまで


はじめに

M1 mac でscalaの環境構築をしようとしたら少し面倒だったのでメモ。
sbt,java sdkを入れて、sbtでplayFrameworkのテンプレートアプリケーションを起動するまでの方法を説明します。

1.sbtをユニバーサルパッケージ経由でインストールする

通常であればbrew install sbtなどで入れるだけだと思いますが、M1 macではそうは行きません。
上記コマンドを実行した場合は、

sbt: The x86_64 architecture is required for this software.
Error: An unsatisfied requirement failed this build.

と怒られてしまいます。

そこでhomebrew経由ではなく、sbtの公式でzip形式で提供されているユニバーサルパッケージを用いてインストールします。

1-1.ユニバーサルパッケージをダウンロードして、解凍

次のページでZIPをダウンロードして、解凍します

1-2.解凍したフォルダの中のbinをMacの/usr/local/binに移動する

解凍するとsbtというディレクトリが得られるので
その中のbinの中にいるsbtを移動させます。

※解凍したディレクトリを丸ごと移動させてもうまく認識されないので注意。

sudo mv your/path/to/sbt/bin/sbt /usr/local/bin

移動後にwhich sbtを実行して以下が得られれば成功です

/usr/local/bin/sbt

2.Java sdk をZuluのサイトからインストールする

ZuluとはAzul社が提供している100%オープンソースのOpenJDKだそうです。
https://jp.azul.com/products/zulu-enterprise/

次のサイトで以下のようにフィルタを設定して目的とするJDKをインストールします。
Java Version: Java 11(LTS)
Operating System: macOS
Architecture: ARM 64-bit. (M1であるため)
Java Package: JDK

インストール後にjava --versionを実行して、以下の出力が得られれば成功です

openjdk 11.0.12 2021-07-20 LTS
OpenJDK Runtime Environment Zulu11.50+19-CA (build 11.0.12+7-LTS)
OpenJDK 64-Bit Server VM Zulu11.50+19-CA (build 11.0.12+7-LTS, mixed mode)

3. テンプレートからPlayFrameworkのアプリケーションを起動する

以下のコマンドを実行すればPlayFrameworkのアプリケーションの雛形が作成されます。

sbt new playframework/play-scala-seed.g8

あとはsbt runするだけなのですが、
実はこのままだと次のようなエラーが出てうまく行きません。

[error] (Compile / run) java.lang.UnsatisfiedLinkError: /Users/username/Library/Caches/JNA/temp/jna14102376087650574632.tmp: dlopen(/Users/username/Library/Caches/JNA/temp/jna14102376087650574632.tmp, 1): no suitable image found.  Did find:
[error]     /Users/username/Library/Caches/JNA/temp/jna14102376087650574632.tmp: no matching architecture in universal wrapper
[error]     /Users/username/Library/Caches/JNA/temp/jna14102376087650574632.tmp: no matching architecture in universal wrapper

これを解決するためにbuild.sbtに以下の変更を加えます。
こちらの記事を参考にさせていただきました。

PlayKeys.fileWatchService := play.dev.filewatch.FileWatchService.jdk7(play.sbt.run.toLoggerProxy(sLog.value))

修正をしたのち再びsbt runをすれば次のようにサーバーが立ち上がるはずです
image.png

localhost:9000にアクセスして以下の画面が出れば成功です!

参考