はじめに
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
をすれば次のようにサーバーが立ち上がるはずです
localhost:9000にアクセスして以下の画面が出れば成功です!