これは何?
OpenJDK には、リポジトリを IntelliJ IDEA で開けるように変換するスクリプトがあります。このスクリプトを使うと、IntelliJ IDEA で OpenJDK の Java の部分の開発ができるようになります。 しかし、このスクリプトは Linux と Cygwin (たぶんMacも)では動くのですが、WSL 上では動きませんでした。
どんな実装だったのか
このスクリプトは WSL 上で実行する必要があるのですが、そもそも WSL は考慮されていませんでした。Windows で開発する場合、昔は Cygwin を使っていたため当然です。 普通の Linux としてスクリプトが実行されますが、以下の 3 つの問題がありました。
- Java コンパイラの実行ファイル名が違う (javacとjavac.exe)
- JDK の実行ファイルはWSLのディレクトリを含むと動かない (たぶん正確ではないが良く知らない・・・)
- IntelliJ IDEA は Windows で実行するため Windows のパスが必要なのに WSL のパスでファイルが生成される
そのため、これらの問題を解決していきます。
バグレポートはこちらです。
[JDK-8250818] idea.sh script doesn't work on WSL 1 and 2 - Java Bug System
どう直したの?
全てが WSL の絶対パスになっていたため、以下の様な方針で修正しました。
- Javaコンパイラのファイル名を javac と javac.exe で変更できるよう
- スクリプト内で行われる処理は相対パスを使って全て Windows が管理する領域上で処理されるようにする
- 成果物は全て Windows のパスになるようにする
WSL_DISTRO_NAME
という環境変数がある場合は WSL 上での実行としています。その場合は、パスを相対パスにしてくれる realpath
と、パスを Windows のパスにしてくれる wslpath
を使って変換しています。
相対パスにしたものは以下の環境変数に格納されてるパスです。
- JAVAC_CP:クラスパス
- JAVAC_CLASSES:クラスファイルの出力先ディレクトリ
- JAVAC_SOURCE_FILE:コンパイル対象のクラス
- JAVAC_SOURCE_PATH:クラスまたはインタフェースの定義を検索するソースパス
ここまで修正すると、スクリプトは実行できるようになります。ただ、成果物内のパスは WSL のパスのままなので、成果物に含まれるパスを Windows のパスになるようにします。以下の環境変数に格納されているパスを修正しています。
- MODULE_ROOTS 内の各要素
- SPEC_DIR
- TOPLEVEL_DIR
- IDEA_OUTPUT
- JT_HOME
パッチはこちらです。
8250818: idea.sh script doesn't work on WSL 1 and 2 · openjdk/jdk@ee5dc7c · GitHub