Scala+PlayをIntelliJで快適に開発するための設定

Java8とsbtは入れてる前提。

## Playのゲット

コメントがたくさん入ったサンプルのほうが嬉しいので、Starter Projectsをベースにする。

```
$ git clone git@github.com:playframework/play-scala-starter-example.git
$ cd play-scala-starter-example/
```

## IntelliJで取り込む

IntelliJ Ultimate Editionを前提にする。

1. IntelliJを開く > Import Project > 「プロジェクトのルートディレクトリ」を選択  
<img width="773" alt="スクリーンショット 2017-07-22 11.02.37.png" src="https://qiita-image-store.s3.amazonaws.com/0/39241/ab45b1ac-aba7-13a7-872e-40786cde9ea8.png">
2. 「Import project from external model」にチェックを入れて「SBT」を選択  
<img width="736" alt="スクリーンショット 2017-07-22 11.03.32.png" src="https://qiita-image-store.s3.amazonaws.com/0/39241/295ff0f6-861d-7f83-cd7b-932a644760b0.png">
3. 「Import Project」画面でDownloadの「Library sources」「SBT sources」「Use SBT shell for build and import」にチェック（もしJDKが設定されてなかったらセット）  
<img width="942" alt="スクリーンショット 2017-11-20 9.16.33.png" src="https://qiita-image-store.s3.amazonaws.com/0/39241/6c05479a-8093-1096-083c-498d6e7af1dc.png">



## IntelliJの実行設定

### 通常実行

1. メインメニューから Run -> Edit Configurations を選択  
<img width="328" alt="スクリーンショット 2017-07-17 15.17.58.png" src="https://qiita-image-store.s3.amazonaws.com/0/39241/7b37665d-b40b-66b7-b0c2-a64e3e66b73c.png">
2. 左上にある `+` をクリックして、出てきたリストから "SBT Task" を選択する  
<img width="221" alt="スクリーンショット 2017-07-22 11.14.44.png" src="https://qiita-image-store.s3.amazonaws.com/0/39241/88a568d5-865d-2d7d-7c19-b987b34f6fd1.png">
3. "Name" と "Tasks" 入力ボックス内に “run” を追加し、OKを選択  
<img width="1070" alt="スクリーンショット 2017-07-22 11.15.13.png" src="https://qiita-image-store.s3.amazonaws.com/0/39241/6b76cd58-dbcd-dda5-64d4-c4b9bafc457d.png">
4. IntelliJのツールバーに先程設定した `run` タスクが出現するので右三角の緑のボタンを押す  
<img width="123" alt="スクリーンショット 2017-07-22 11.17.53.png" src="https://qiita-image-store.s3.amazonaws.com/0/39241/743badd1-9301-08bc-35b6-68a534ee76ed.png">
5. http://localhost:9000/ をブラウザで開いて確認

### デバッグ実行

* IntelliJ Ultimate Editionの場合
  * ブレークポイント設定して、ツールバーの虫マーク経由で実行するだけでOK  
  <img width="119" alt="スクリーンショット 2017-07-17 15.21.35.png" src="https://qiita-image-store.s3.amazonaws.com/0/39241/29e7148d-4652-0c8c-80e3-e28f7679491f.png">
* Community Editionの場合
  * [なんか頑張らないといけないらしい（未検証）](http://nenono.hatenablog.com/entry/2015/03/12/160209)



## IntelliJの設定

こっからは好みで。

### 行番号表示

```
Preferences > Editor > General > Appearance > Show line numbersにチェック
```

### ファイル保存時に最後の行に改行追加

```
Preferences > Editor > General > Ensure line feed at file end on Saveにチェック
```

### ヘッダコメント削除

クラスとか作るたびに、いちいち不要なコメントを付けてくるので消す。

```
Preference > Editor > File and Code Template > Includes > File Header
```

右側に下記のようなコードが書かれているので、全部削除すればOK。

```
/**
 * @author ${USER}
 */
```

### 自動コードフォーマット＆import文最適化

ファイルを保存したときに自動的に、コードフォーマットとimport文を最適化をしてしまうのが最強に便利。

### マクロ作成

##### 1. マクロの記録を開始する

```
Edit -> Macros -> Start Macro Recording
```

##### 2．import文を最適化

```
Code -> Optimize Imports
```

##### 3．コードフォーマット

```
Code -> Reformat Code
```

##### 4．全てのファイルを保存

```
File -> Save all
```

##### 5．マクロの記録を終了する

```
Edit -> Macros -> Stop Macro Recording
```

##### 6．記録したマクロを名前をつけて保存

「Enter Macro Name」ダイアログに適当に名前を入力して(例：formatted save)、「OK」ボタンを押す  

<img width="450" alt="スクリーンショット 2017-07-22 12.17.11.png" src="https://qiita-image-store.s3.amazonaws.com/0/39241/4894bc05-ece2-384b-247d-b9d77c286a84.png">


### キーボードショートカットへの割り当て

##### 1. キーボードにショートカット追加

```
Preferences > Keymap > Macros
```

先ほど入力した名前（formatted save）が出てくるので、右クリックして、「Add Keyboard Shorcut」をクリック

![1.png](https://qiita-image-store.s3.amazonaws.com/0/39241/d1a5d085-f80f-c25a-01a1-03495dd0fc0c.png)

##### 2. ショートカットの入力

First Strokeで「Command + s」（実際のキーボード操作が反映される）

「Assigned to [Main menu | File | Save All]」と表示されるが無視して「OK」ボタンをクリック

<img width="297" alt="スクリーンショット 2017-07-22 12.27.24.png" src="https://qiita-image-store.s3.amazonaws.com/0/39241/159dad09-2633-47de-6c7f-15745702f54c.png">

##### 3. 警告無視

再びWarningが出るが、これも華麗にスルーして「Remove」ボタンをクリック

<img width="399" alt="スクリーンショット 2017-07-22 12.27.48.png" src="https://qiita-image-store.s3.amazonaws.com/0/39241/afffaa43-268b-ec98-ea8a-b41200519a13.png">

##### 4. 設定反映

「OK」ボタンを押して終了

<img width="807" alt="スクリーンショット 2017-07-22 12.28.13.png" src="https://qiita-image-store.s3.amazonaws.com/0/39241/ebaa86bd-23ef-7b0a-80a8-cb9c51817a16.png">


## トラブルシューティング

### jboss-interceptor-apiがないってエラーが出る

IntelliJでビルドするとエラーが出る場合がある。

```
[error] (*:updateSbtClassifiers) sbt.ResolveException: unresolved dependency:
sbt.ResolveException: unresolved dependency: org.jboss.interceptor#jboss-interceptor-api;1.1: not found
```
[stackoverflowを参考](https://stackoverflow.com/questions/41966066/jboss-interceptor-api-1-1-not-found-when-added-as-sbt-dependency)に、`~/.sbt/0.13/global.sbt`に下記設定を記述すれば良い。

```
resolvers += "JBoss" at "https://repository.jboss.org/"
```

なお、`~/.sbt/0.13/global.sbt`がない場合は、ファイル自体を新規作成する。

ちなみに、IntelliJで使用するライブラリのようで、build.sbtに書いてもムダだった。そのため、global.sbtに書いてしまっているが、一回書いたら忘れて良い。


### Scala SDK の設定

はじめてScalaプロジェクトを作ったときに遭遇した。が、二回目以降出なくなったので、必須かどうかは不明。一応、参考までに実施したことを残しておく。

1. scalaファイルを開くと `Setup Scala SDK` と表示されるのでクリック  
<img width="605" alt="スクリーンショット 2017-07-22 12.49.28.png" src="https://qiita-image-store.s3.amazonaws.com/0/39241/74684863-c7cc-e8fa-c547-49b42a938b87.png">
2. Createボタンクリック  
<img width="391" alt="スクリーンショット 2017-07-22 12.50.28.png" src="https://qiita-image-store.s3.amazonaws.com/0/39241/0318bf1f-9142-c506-11c6-feea9895967e.png">
3. scalaのバージョンを選択（build.sbtに書いてあるバージョンを選択）  
<img width="469" alt="スクリーンショット 2017-07-22 12.50.45.png" src="https://qiita-image-store.s3.amazonaws.com/0/39241/7ff4ecac-2e5a-c441-5731-ebea36dcd83a.png">
4. OKボタンクリック  
<img width="391" alt="スクリーンショット 2017-07-22 12.50.28.png" src="https://qiita-image-store.s3.amazonaws.com/0/39241/0318bf1f-9142-c506-11c6-feea9895967e.png">


## 参考：sbtのインストール

sbtが入ってない場合は、sdkman経由で入れるのが便利。sdkmanを使うと、JVM系の言語やFWのインストールが楽に入れられるので、最初にインストールする。

### sdkmanインストール

```bash
$ curl -s "https://get.sdkman.io" | bash
$ source "$HOME/.sdkman/bin/sdkman-init.sh"
```

### Golangの管理にgvmを使っている人のみ

歴史的経緯からgvmにエイリアスが貼られてしまうので無効化する。

```~/.sdkman/etc/config
sdkman_disable_gvm_alias=true
```

### Scalaとsbtのインストール

先程入れた、sdkmanを使ってインストールする。

```
$ sdk install scala
$ sdk install sbt
```