IntelliJ IDEA (Windows, Java) & WSL2 開発環境構築（2022.11）

# なぜ IntelliJ IDEA & WSL2 なのか

1. VS Code や Eclipse ではなく IntelliJ IDEA で開発したいため
    - Java の開発体験が良いと複数人から聞いている
2. Windows 上ではなく使い慣れた WSL2 上で開発したいため
    - PowerShell？　Git BASH？　ご冗談でしょう？

少し検索したんですが絶妙に参考になる記事が存在しなかったため書き起こします。なお、現状 Windows 側の IntelliJ IDEA と JDK (WSL2) の組み合わせでの開発は発展途上感覚があり、他の選択肢の可能性も排除しない方が良さそうです。

## 既知の不具合

:::note warn
動作が極端に重い現象が発生しており、原因調査中です。Indexing が重いような気がしています。NFS でマウントされていて I/O が遅いんですかね。 **現状（最新版の？）IntelliJ IDEA & WSL2 は選択肢に入らない可能性があります。** 以下に記載する対策のいずれかを取る必要があります。公式サイトでは WSL2 上で開発できると謳っているのですが……。
:::

参考: [YouTrack: IntelliJ stuck at Scanning files to index](https://youtrack.jetbrains.com/issue/IDEA-266170/IntelliJ-stuck-at-Scanning-files-to-index#focus=Comments-27-6473837.0-0)

> **What is the expected result?**
> After a period of time (which may include indexing) IntelliJ is ready to use
> **What happens instead?**
> The "Scanning files to index" message is displayed for over 15 minutes with no progress made. Not much update in the logs either.
> I've tried restarting after invalidating all caches but this hasn't helped either.
> I've tried collecting logs but this also just hangs forever without resolving.

> Same problems on 2022.2 Intellij IDEA. Seem like the last step for me to code on Windows use java WSL2 environment.
The index for JDK takes forever. even all path i've checked is`\\wsl$\...`

IntelliJ IDEA 2022.2.x がダメな可能性があります（最新版の 2022.2.3 で同様の事象が発生しているため）。というかこの系統の不具合は JetBrains 系 IDE で頻出のようですね。もう諦めて **起動してから 1 時間くらいは放置しましょう。** WSL2 環境以外でも起きたら JetBrains 系 IDE はもう一生使いません（手のひらをクルクルさせながら）。
あ、それとは別に（DP ケーブルの場合？） **画面ロックが掛かると解像度がバグって FHD+α くらいのサイズの表示領域になって、かつ 4K 全画面のマウス操作領域がスケールしながら対応する** んですが、なんかもうどうでもよくなってきました。IDE を再起動すれば直るんですが、Indexing が最初からになるっぽいので禁忌です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2550810/a793a097-5ee9-eb9b-54e5-b4cf158b05bf.png)

### 対策

- **答え①: IntelliJ IDEA を WSL2 側にインストールして X Window System で GUI を転送**
    - やりたくねぇ～（自分はいいが、社内標準には出来ないな）
    - やってる人: [Zenn: WSL2で(Linux版の)intellij ideaを使う方法](https://zenn.dev/axt/articles/4b12a6517b66e8)
- **答え②: [Kotlin, ]Android plugins 等の無効化**
    - 要らないものはとにかく切る
    - 一回 Index を張り切ったのか二回目の起動が爆速（数分）になったので採用の可能性がある？
        - とりあえず PC を再起動をしても数分で開発可能な状態になることを確認
        - Gradle/Maven で dependencies を更新したらまた地獄では？（要確認）
        - ただの Create a new file に数分掛かるので Indexing だけが問題では無さそう
- **答え③: 対策は無い。現実は非情である。**
    - 心が折れた人: [scrapbox: WSL2のためにIntellijからVSCodeへ移行しようとした](https://scrapbox.io/mkizka/WSL2%E3%81%AE%E3%81%9F%E3%82%81%E3%81%ABIntellij%E3%81%8B%E3%82%89VSCode%E3%81%B8%E7%A7%BB%E8%A1%8C%E3%81%97%E3%82%88%E3%81%86%E3%81%A8%E3%81%97%E3%81%9F)
        - もうこの記事の投稿から 2 年以上経ってるんだぞ何とかしてくれ

VS Code って優秀だなぁ……。

---

## 前提

:::note info
WSL2 は有効化されており、かつ十分な開発環境が整備されていることを期待しています（でなければ本記事の目的 2 を満たさず、本記事の想定読者ではありません）。
:::

## IntelliJ IDEA のインストール

IDE 本体は Windows 側にインストールします。今回は無償利用可能な Community 版を使用しますが、Ultimate 版と比較して機能が少ないだけで原則商用利用可能です。

https://www.jetbrains.com/idea/download/#section=windows

[商用ソフトウェアを開発するために Community エディションの JetBrains IDE を使用できますか？](https://sales.jetbrains.com/hc/ja/articles/360021922640-%E5%95%86%E7%94%A8%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%E3%82%92%E9%96%8B%E7%99%BA%E3%81%99%E3%82%8B%E3%81%9F%E3%82%81%E3%81%AB-Community-%E3%82%A8%E3%83%87%E3%82%A3%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AE-JetBrains-IDE-%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%99%E3%81%8B-) 
> はい。（中略） 唯一の例外は、**派生製品の作成**または**Community IDE の商品化**です。

## Java 及び JDK のインストール

Ubuntu 20.04 での Open JDK 17 のインストール方法を書いておきます。その他のヴァージョンや Oracle JDK 等については適宜調べてください。

```sh
sudo apt update
sudo apt install openjdk-17-jdk openjdk-17-jre

# if you use bash/zsh shell
echo 'export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64' >> ~/.profile

# if you use fish shell
set -Ux JAVA_HOME /usr/lib/jvm/java-17-openjdk-amd64
```

参考: [RoseHosting: How to Install Java 17 LTS on Ubuntu 20.04](https://www.rosehosting.com/blog/how-to-install-java-17-lts-on-ubuntu-20-04/)

## IntelliJ IDEA に JDK (WSL) を認識させる

適当に New Project 等して JDK を選択する際に

```
\\wsl$\Ubuntu[-${version}]\usr\lib\jvm\java-17-openjdk-amd64
```

辺りのパスを指定してください。

:::note warn
WSL2 上の JDK のディレクトリを選択すると IDE が数分程度応答を停止しますが、気長に待ってあげてください。
:::

後は基本的に WSL2 上でうまく動くはずです。統合ターミナルも PowerShell ではなく WSL2 のデフォルトの shell が起動するようになります。

## 警告: External file changes sync may be slow

何も手当てをしないと以下のような警告が出ます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2550810/6b6404de-bb19-4393-f49f-88f96ffe5db6.png)
これは Linux がファイルの変更を検知するシステム inotify が検知できるファイル数の制限を超えてしまっていることに起因します。この警告に対処しましょう。

まず、

```sh
sudo touch /etc/sysctl.d/60-jetbrains.conf
sudo vim /etc/sysctl.d/60-jetbrains.conf
```

を実行し（好きなエディタで大丈夫です）、以下の内容を書き込みましょう（コメント部分は任意です）。

```/etc/sysctl.d/60-jetbrains.conf
# Set inotify watch limit high enough for IntelliJ IDEA (PhpStorm, PyCharm, RubyMine, WebStorm).
# Create this file as /etc/sysctl.d/60-jetbrains.conf (Debian, Ubuntu), and
# run `sudo service procps start` or reboot.
# Source: https://confluence.jetbrains.com/display/IDEADEV/Inotify+Watches+Limit
# 
# More information resources:
# -$ man inotify # manpage
# -$ man sysctl.conf # manpage
# -$ cat /proc/sys/fs/inotify/max_user_watches # print current value in use

fs.inotify.max_user_watches = 524288
```

ここでマジックナンバー `524288` はキリの良い数としての 512K であり、特段深い意味はありません。

参考: [stack overflow: How to fix these warnings "External file changes sync may be slow" and "The current inotify(7) watch limit is too low" in IntelliJ Project in Ubuntu](https://stackoverflow.com/questions/67927480/how-to-fix-these-warnings-external-file-changes-sync-may-be-slow-and-the-curr)

## 一生終わらない Indexing 対策？

起動時のオプションを弄る解決法が記載されているサイトを発見し、以下の通りに実施しました。
結果としては **Indexing には数時間単位の時間が掛かるまま** です。

```
C:\Program Files\JetBrains\IntelliJ IDEA Community Edition ${YYYY.X.Y}\bin\idea64.exe.vmoptions
```

を編集し、起動時の VM に割り当てるメモリを増やします。

```idea64.exe.vmoptions
-Xms1024m
-Xmx4096m
-XX:ReservedCodeCacheSize=1024m
（以下略）
```

参考: [stack overflow: How to set memory for the VM in IntelliJ? Do I have to set Tomcat memory options separately?](https://stackoverflow.com/questions/8542299/how-to-set-memory-for-the-vm-in-intellij-do-i-have-to-set-tomcat-memory-options/8542344#8542344)

結局 **最も効果的だった対策は Kotlin, Android plugins 等を無効化すること** です。

以上で環境構築は一段落です。お疲れ様でした。

---

## 余談

旧い記事に記載されている以下の設定は**不要**です。

```~\\.wslconfig
[wsl2]
localhostForwarding=true
```

WSL2 導入初期は `localhostForwarding` はデフォルトで `false` となっていましたが、現在ではデフォルトは `true` になっています。なお、最新の情報については以下を確認してください。

https://learn.microsoft.com/ja-jp/windows/wsl/wsl-config#configuration-setting-for-wslconfig

## その他メモ

### プラグイン

https://www.jetbrains.com/help/idea/managing-plugins.html

入れたもの

- IdeaVim
- VSCode Keymap
- VSCode Theme [3rd party plugin]
- Rainbow Brackets

`Ctrl+Shift+S` (Open Settings)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2550810/ef293c89-bb00-95c1-2458-5f1c9e0fae75.png)

### 動作確認（Getting Started of Spring Boot）

https://spring.pleiades.io/guides/gs/spring-boot/#scratch

ビルドできて動いたので動作上は問題無さそうですが、まぁとにかく重いですね。警告多めなので必要に応じて linter 設定を無効化していきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2550810/bf44593d-11f9-05b9-3efb-a67ceea0c315.png)