KiCad Freerouting プラグインの Java バージョン検出エラーが発生と対策

kicad Freerouting Plugin

先日、久しぶりに KiCad を起動したところ、KiCad のバージョンが v9.0.0 になっていました。特に考えもせず、最新バージョンに変更したのですが、freeroutingプラグインで引っかかったのでその共有をします。

目次

freeroutingプラグインのインストール

  1. kiCadのトップページからプラグイン&コンテンツ マネージャーを選択
  2. フィルターにFreeroutingを入力
  3. Freeroutingのインストールボタンを押して、右下の保留中の変更を適用を押して、インストール完了。インストール済みに登録されていることを確認。
    Freerouting plugin

バージョンアップ後の問題

バージョンアップに伴い、以前利用していた freerouting プラグイン がインストールされていなかったため、再インストールを行いました。しかし、プラグインを導入し、freeroutingを使用しようとしたところ、以下のようなエラーメッセージが表示されるようになりました。

要求バージョン

“Java JRE version 21 or higher is required …"

このエラーは、プラグイン内部で Java のバージョンをチェックする際に発生しており、実際には私の環境には Java 21 が正しくインストールされているにも関わらず、プラグインが誤ってバージョン不足と判断してしまうというものでした。
JRE

エラーの原因と調査

調査を進めると、問題の原因は Python スクリプト内のバージョンチェック処理にあることが判明しました。具体的には、プラグインは以下のような関数で Java のバージョンを取得しています。
ファイルはC:\Users\<USER>\Documents\KiCad\9.0\3rdparty\plugins\app_freerouting_kicad-plugin\plugin.pyにあります

def get_java_version(javaPath):
    try:
         javaInfo = subprocess.check_output(javaPath + ' -version', shell=True, stderr=subprocess.STDOUT)
         javaVersions = [re.search(r'([0-9\._]+)', v).group(1).replace('"', '') for v in javaInfo.decode().splitlines()]
         for v in javaVersions:
             if v.split(".")[0].isdigit():
                 return v
    except:
         pass
    return "0.0.0.0"

上記のコードでは、subprocess.check_output() を用いて java -version コマンドを実行しています。しかし、subprocess.check_outputあたりが原因で、正しいバージョン情報が取得できないという問題がありました。

java -version の出力は以下のようになっており、最初の行に正確なバージョン情報が含まれています。

openjdk version "21.0.6" 2025-01-21 LTS
OpenJDK Runtime Environment Temurin-21.0.6+7 (build 21.0.6+7-LTS)
OpenJDK 64-Bit Server VM Temurin-21.0.6+7 (build 21.0.6+7-LTS, mixed mode, sharing)

修正方法

どうにかして、正しいjavaのバージョンを取得できるように変更しようと試行錯誤しましたが、結論としてうまくいきませんでした。あきらめて、一時的な回避策として、強制的に get_java_version()"21.0.6" を返すようにして動作させる方法で暫定対応しました。しかし、将来的な互換性や他バージョン対応のためにも、正しくバージョン情報を抽出する実装に修正するのが望ましいです。

修正後のコード例

以下は、上記の改善点を反映させた修正例です。

def get_java_version(javaPath):
    try:
         # パスにスペースが含まれると誤動作する可能性あり
         javaInfo = subprocess.check_output(javaPath + ' -version', shell=True, stderr=subprocess.STDOUT)
         javaVersions = [re.search(r'([0-9\._]+)', v).group(1).replace('"', '') for v in javaInfo.decode().splitlines()]
         for v in javaVersions:
             if v.split(".")[0].isdigit():
                 return v
    except:
         pass
    # 強制的に21.0.6を応答
    return "21.0.6"

この修正により、java -version の出力から正確に "21.0.6" を抽出できるようになり、プラグインが実際のバージョンを正しく認識できるようになります。

おわりに

KiCad のバージョンアップやプラグインの再インストールに伴い、思わぬエラーに遭遇することもありますが、今回のケースでは Python のコード内部でのバージョン取得処理に起因していました。
暫定対応として強制的にバージョンを返す方法としましたが、根本的な解決はできていません。正しい修正方法がわかる方は教えてください。

2025-04-30サーバ&テクノロジ

Posted by 納戸 工房