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


先日、久しぶりに KiCad を起動したところ、KiCad のバージョンが v9.0.0 になっていました。特に考えもせず、最新バージョンに変更したのですが、freeroutingプラグインで引っかかったのでその共有をします。
freeroutingプラグインのインストール
- kiCadのトップページからプラグイン&コンテンツ マネージャーを選択
- フィルターにFreeroutingを入力
- Freeroutingのインストールボタンを押して、右下の保留中の変更を適用を押して、インストール完了。インストール済みに登録されていることを確認。
バージョンアップ後の問題
バージョンアップに伴い、以前利用していた freerouting プラグイン がインストールされていなかったため、再インストールを行いました。しかし、プラグインを導入し、freeroutingを使用しようとしたところ、以下のようなエラーメッセージが表示されるようになりました。
“Java JRE version 21 or higher is required …"
このエラーは、プラグイン内部で Java のバージョンをチェックする際に発生しており、実際には私の環境には Java 21 が正しくインストールされているにも関わらず、プラグインが誤ってバージョン不足と判断してしまうというものでした。
エラーの原因と調査
調査を進めると、問題の原因は Python スクリプト内のバージョンチェック処理にあることが判明しました。具体的には、プラグインは以下のような関数で Java のバージョンを取得しています。
ファイルはC:\Users\<USER>\Documents\KiCad\9.0\3rdparty\plugins\app_freerouting_kicad-plugin\plugin.pyにあります
上記のコードでは、subprocess.check_output()
を用いて java -version
コマンドを実行しています。しかし、subprocess.check_outputあたりが原因で、正しいバージョン情報が取得できないという問題がありました。
java -version
の出力は以下のようになっており、最初の行に正確なバージョン情報が含まれています。
修正方法
どうにかして、正しい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 のコード内部でのバージョン取得処理に起因していました。
暫定対応として強制的にバージョンを返す方法としましたが、根本的な解決はできていません。正しい修正方法がわかる方は教えてください。