* Windsurf+PlantUMLでAWTエラーに遭遇した話 [#g521819a] ** 問題の状況 [#a0414950] Windsurfエディタ(旧Codeium)でPlantUMLプラグインを使用していると、以下のようなエラーメッセージが表示されることがあります。 ダイアグラム"パッチ処理のクラス図"にエラーが見つかりました Exception in thread "main" java.lang.UnsatisfiedLinkError: 'boolean sun.awt.PlatformGraphicsInfo.hasDisplays0()' at java.desktop/sun.awt.PlatformGraphicsInfo.hasDisplays0(Native Method) at java.desktop/sun.awt.PlatformGraphicsInfo.hasDisplays(PlatformGraphicsInfo.java:39) at java.desktop/java.awt.GraphicsEnvironment.getLocalGraphicsEnvironment(GraphicsEnvironment.java:91) at java.desktop/java.awt.GraphicsEnvironment$LocalGE.createGE(GraphicsEnvironment.java:102) at java.desktop/java.awt.GraphicsEnvironment.getLocalGraphicsEnvironment(GraphicsEnvironment.java:82) at java.desktop/java.awt.image.BufferedImage.createGraphics(BufferedImage.java:1182) at net.sourceforge.plantuml.FileFormat.(FileFormat.java:90) at net.sourceforge.plantuml.Option.(Option.java:101) at net.sourceforge.plantuml.Run.main(Run.java:97) このエラーは、Java AWTのネイティブメソッド「hasDisplays0()」が見つからないことを示しています。これはPlantUMLがAWTのグラフィック機能を使用する際に発生する問題です。 ** 原因の調査 [#gf7f21e0] 問題を調査するために「java -version」コマンドを実行すると、以下のような結果が得られました: $ java -version [0.028s][warning][cds] A jar file is not the one used while building the shared archive file: C:\Users\k-hayashi\AppData\Roaming\Windsurf\User\globalStorage\pleiades.java-extension-pack-jdk\java\21\lib\modules [0.029s][warning][cds] A jar file is not the one used while building the shared archive file: C:\Users\k-hayashi\AppData\Roaming\Windsurf\User\globalStorage\pleiades.java-extension-pack-jdk\java\21\lib\modules [0.029s][warning][cds] C:\Users\k-hayashi\AppData\Roaming\Windsurf\User\globalStorage\pleiades.java-extension-pack-jdk\java\21\lib\modules timestamp has changed. 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.7+6-LTS, mixed mode) WindsurfはTemurin OpenJDK 21を使用していることがわかりました。 ** 解決策 [#p6898e85] この問題は、PlantUMLのJava実行環境を変更することで解決しました。具体的には、以下の手順を実施しました: - 1. Windsurfの設定を開く - 2. PlantUMLプラグインの設定を探す - 3. Javaの実行環境を以下のパスに変更: "C:\Program Files\Java\jdk1.8.0_281\bin\java.exe" - 4. Windsurfを再起動 この変更により、PlantUMLのダイアグラム生成が正常に動作するようになりました。 ** 考察 [#b93f300c] *** なぜ解決したのか? [#o4b8ede5] JDK 8(1.8)を使用することで問題が解決した理由としては、以下の可能性が考えられます: - 1. JDK 8はAWTの実装がより安定しており、PlantUMLとの互換性が高い - 2. 最新のJDK(特にJDK 21)では、セキュリティやモジュール化の観点からAWTの実装が変更されている - 3. PlantUMLが内部的にJDK 8との互換性を前提に設計されている可能性がある また、別の解決策として、ヘッドレスモードを使用する方法もあります。設定に「-Djava.awt.headless=true」を追加することで、グラフィック環境なしでPlantUMLを実行することができます。 *** 他のIDEとの比較 [#j738817f] この問題はWindsurf特有のものではなく、VS Code、IntelliJ IDEA、Eclipseなど他のIDEでもPlantUMLを使う際に同様の問題が発生する可能性があります。特に、最新のJDKを使用している場合は注意が必要です。 ** まとめ [#pb45ed77] Windsurfエディタ(旧Codeium)でPlantUMLプラグインを使用する際にAWTの問題が発生した場合は、以下の対処法を試してみてください: - 1. PlantUMLのJava実行環境をJDK 8に変更する - 2. または、PlantUMLの設定でヘッドレスモード(-Djava.awt.headless=true)を有効にする こうした問題は、Java AWTのネイティブコンポーネントとの連携に関する問題であり、Java実装やバージョンによって動作が異なる場合があります。 ** 参考資料 [#v3edc047] - PlantUML公式FAQ: https://plantuml.com/faq - PlantUMLインストールFAQ: https://plantuml.com/faq-install - GraalVM Issue #2729: https://github.com/oracle/graal/issues/2729 - Java AWTヘッドレスモードについて: https://www.oracle.com/technical-resources/articles/javase/headless.html 著者: k-hayashi (khayashi4337@gmail.com) 著者: k-hayashi (khayashi4337@gmail.com) 日付: 2025-05-01