[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.ユニバーサルパッケージをダウンロードして、解凍
次の[ページ](https://www.scala-sbt.org/1.x/docs/ja/Installing-sbt-on-Mac.html#%E3%83%A6%E3%83%8B%E3%83%90%E3%83%BC%E3%82%B5%E3%83%AB%E3%83%91%E3%83%83%E3%82%B1%E3%83%BC%E3%82%B8%E3%81%8B%E3%82%89%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB)でZIPをダウンロードして、解凍します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/366323/4426d4f8-7e18-b651-1038-523fc342da87.png)

## 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/

次の[サイト](https://www.azul.com/downloads/?version=java-11-lts&os=macos&architecture=arm-64-bit&package=jdk)で以下のようにフィルタを設定して目的とするJDKをインストールします。
Java Version: Java 11(LTS)
Operating System: macOS
Architecture: ARM 64-bit. (M1であるため)
Java Package: JDK
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/366323/a292dc4d-978a-3b25-9b17-fb2f0470b304.png)
インストール後に`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に以下の変更を加えます。
[こちらの記事](https://qiita.com/Eustace/items/2589f7f102d54ec7111a
)を参考にさせていただきました。

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

修正をしたのち再び`sbt run`をすれば次のようにサーバーが立ち上がるはずです
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/366323/83c58059-992a-4f83-11fb-07671db9dede.png)

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/366323/2b800e38-7a1a-717b-181a-b1f655c5e322.png)



# 参考
- [macOS への sbt のインストール](https://www.scala-sbt.org/1.x/docs/ja/Installing-sbt-on-Mac.html)
- [ARM版JDKでPlayFrameworkを実行する方法](https://qiita.com/Eustace/items/2589f7f102d54ec7111a)
- [Download Azul Zulu Builds of OpenJDK](https://www.azul.com/downloads/?version=java-11-lts&os=macos&architecture=arm-64-bit&package=jdk)