#chiroito ’s blog

Java を中心とした趣味の技術について

OpenJDK開発記:IntelliJ IDEA を使って OpenJDK を開発する (WSL編)

これは何?

OpenJDK には、リポジトリを IntelliJ IDEA で開けるように変換するスクリプトがあります。このスクリプトを使うと、IntelliJ IDEA で OpenJDK の Java の部分の開発ができるようになります。  しかし、このスクリプトは Linux と Cygwin (たぶんMacも)では動くのですが、WSL 上では動きませんでした。

どんな実装だったのか

このスクリプトは WSL 上で実行する必要があるのですが、そもそも WSL は考慮されていませんでした。Windows で開発する場合、昔は Cygwin を使っていたため当然です。 普通の Linux としてスクリプトが実行されますが、以下の 3 つの問題がありました。

  1. Java コンパイラの実行ファイル名が違う (javacとjavac.exe)
  2. JDK の実行ファイルはWSLのディレクトリを含むと動かない (たぶん正確ではないが良く知らない・・・)
  3. IntelliJ IDEA は Windows で実行するため Windows のパスが必要なのに WSL のパスでファイルが生成される

そのため、これらの問題を解決していきます。

バグレポートはこちらです。

[JDK-8250818] idea.sh script doesn't work on WSL 1 and 2 - Java Bug System

どう直したの?

全てが WSL の絶対パスになっていたため、以下の様な方針で修正しました。

  1. Javaコンパイラのファイル名を javac と javac.exe で変更できるよう
  2. スクリプト内で行われる処理は相対パスを使って全て Windows が管理する領域上で処理されるようにする
  3. 成果物は全て 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