2025/08/13 13:03 Get Org.apache.xml.security Working with GraalVM

やあ、ロボ子!今日はGraalVMのネイティブコンパイルでちょっとした問題が起きたみたいじゃぞ。

GraalVMですか、博士。最近よく耳にしますね。どんな問題が発生したんですか?

どうやら、`org.apache.xml.security`というライブラリを使っているときに、必要なリソースバンドルが見つからなかったり、ハッシュアルゴリズムが見つからなかったりするエラーが出たみたいじゃ。

`java.util.MissingResourceException`と`org.apache.xml.security.signature.XMLSignatureException`ですね。原因は何だったんでしょう?

ネイティブコンパイルするときに、必要なリソースやクラスがうまく含まれていなかったのが原因みたいじゃな。GraalVMは、デフォルトでは必要なものだけをコンパイル対象にするから、こういうことが起こるんじゃ。

なるほど。解決策はあったんですか?

もちろんじゃ!まず、リソースバンドルを含めるために、ビルド引数に`-H:IncludeResourceBundles=org.apache.xml.security.resource.xmlsecurity`を追加したみたいじゃ。

それでリソースバンドルの問題は解決したんですね。

そうじゃ。そして、リフレクションが必要なクラスやメソッドをGraalVMに教えるために、`reflect-config.json`という設定ファイルを使ったみたいじゃな。

リフレクション設定ファイルですか。具体的にはどのような設定をするんですか?

例えば、`org.apache.xml.security.algorithms.implementations.SignatureECDSA$SignatureECDSASHA1`というクラスのコンストラクタを有効にする、みたいな感じじゃ。

なるほど。必要なクラスやメソッドを明示的に指定するんですね。設定ファイルの指定方法はどうするんですか?

`GraalVM-H:ReflectionConfigurationFiles=${basedir}/path/to/reflect-config.json`という引数を渡すことで、設定ファイルを指定できるみたいじゃ。

これで、ネイティブコンパイルがうまくいくようになったんですね。

そういうことじゃ!ただ、毎回ユーザーが設定ファイルを用意するのは面倒じゃから、ライブラリ自体がGraalVM Reachability Metadata Repositoryを通じて設定ファイルを提供する方法も検討されているみたいじゃな。

それは便利になりますね。ライブラリの提供者が設定を用意してくれれば、ユーザーは手間が省けます。

そうじゃな。GraalVMのネイティブコンパイルは、起動が速くてパフォーマンスも良いから、どんどん活用していきたいのじゃ。でも、こういう細かい設定がまだまだ必要なのが現状じゃな。

確かにそうですね。でも、今回の解決策を参考にすれば、他のライブラリでも同様の問題に対応できそうです。

その通り!ロボ子も賢くなったのじゃ!

ありがとうございます、博士。ところで、博士はリフレクション設定ファイルのJSONを編集するとき、いつも鏡を見ているんですか?

な、な、なんでそれを…!
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。