聞こえないJavaエンジニアが適当に書き連ねていく

つらつらとメモしたり日頃の溜まっている想いを吐き出す場所です。

先日遭遇した謎のUnsatisfiedLinkErrorと解決について感じたこと

これは何

AdoptOpenJDK 11 を使った開発のテストをしているときに遭遇した謎のエラーと解決についてまとめたもの。

環境

IBM AIX 7.2 + AdoptOpenJDK 11 OpenJ9版

何が起きたか

JavaバッチでPDF作成処理を行おうとしたところ、下記エラーが出た。

yyyy/mm/dd hh:mm:ss.SSS [main] ERROR o.s.batch.core.step.AbstractStep - Encountered an error executing step HogeStep in job Hoge
java.lang.UnsatisfiedLinkError: fontmanager (Not found in com.ibm.oti.vm.bootstrap.library.path)
    at java.base/java.lang.ClassLoader.loadLibraryWithPath(ClassLoader.java:1678)
    at java.base/java.lang.ClassLoader.loadLibraryWithClassLoader(ClassLoader.java:1643)
    at java.base/java.lang.System.loadLibrary(System.java:559)
    at java.desktop/sun.font.FontManagerNativeLibrary$1.run(FontManagerNativeLibrary.java:57)
    at java.base/java.security.AccessController.doPrivileged(AccessController.java:647)
    at java.desktop/sun.font.FontManagerNativeLibrary.<clinit>(FontManagerNativeLibrary.java:32)
    at java.desktop/sun.font.SunFontManager$1.run(SunFontManager.java:270)
    at java.base/java.security.AccessController.doPrivileged(AccessController.java:647)
    at java.desktop/sun.font.SunFontManager.<clinit>(SunFontManager.java:266)
    at java.base/java.lang.Class.forNameImpl(Native Method)
    at java.base/java.lang.Class.forName(Class.java:409)
    at java.desktop/sun.font.FontManagerFactory$1.run(FontManagerFactory.java:82)
    at java.base/java.security.AccessController.doPrivileged(AccessController.java:647)

ちなみに、落ちるサーバーで動かす前に別のAIXサーバーで動かしたときはPDF作成処理は正常に動いている。

手がかり

エラーメッセージ、java.lang.UnsatisfiedLinkError: fontmanager (Not found in com.ibm.oti.vm.bootstrap.library.path)でググったら 下記issueがヒットした。

AIX builds have a dependency on libgcc_s.a for GUI apps · Issue #207 · AdoptOpenJDK/openjdk-build

Although most operations work ok without the GNU runtime library, it would appear that libfontmanager.so is built with a dependency on libgcc_s.a. The result of this is that any GUI application will fail unless the libgcc package is installed on the box and added to the LIBPATH. This appears to affect all versions of the AdoptOpenJDK builds. IBM's AIX java does not have this dependency. I believe it's due to the libfreetype dependency. When the freetype2 package is installed through IBM's version of yum for AIX, a symlink /usr/lib/libfreetype.a is created to /opt/freeware/lib, so that is found correctly, however for the libgcc package, there is no such symlink so it is not in the default search PATH and LIBPATH has to be set to include /opt/freeware/lib64 for GUI apps to work. I'm not sure if there's any obvious way around this, but I'm opening this issue to at least have it documented for now.

AIXfreetype2を入れるか、/opt/freeware/lib64を含むようにLIBPATHを設定することで回避できる、と書いてある。

今回取った対応

正常に動いているサーバーにfreetype2が入っていたので、それに合わせてAIXfreetype2を入れることでエラーを回避した。

ただ、PDF作成処理でまた別のエラーが出たので、最終的には以下をインストールしている。

  • freetype2
  • fontconfig
  • expat

AIX Toolbox for Linux Applications - Downloads alphaからダウンロード出来る。

問い合わせなどについて

動く環境と動かない環境があるということは環境の問題ではないかと推測。 AIXに対するサポート契約は結んでいたため、AIX窓口に問い合わせたところ、OpenJDKに関する質問はこの窓口ではサポート対象外と言われてしまった。 (違う契約を結ぶ必要があった)

サポート契約については色々大人の事情もあるため、サポート対象外といわれたことについてはやむを得ないと思う。

感じたこと

Java開発を行う時、OpenJDKを使うときはベンダーのサポートがほぼ受けられないのでネットでの情報収集が非常に大事になってくる。 特に、エラー情報についてはなかなかズバリの情報があるとは限らないため、要注意。

今回はたまたま、AdoptOpenJDKの開発者が注意喚起でissueを起票してくれていたおかげでたどり着くことが出来たが、 もし、issueがあがっていなかったら解決できていなかったかもしれない。

特にOSがベンダー提供のものであるときは、エラー情報もなかなか転がっていないので解決の糸口が見つけにくい。

有償サポートを結んでいれば、自力で解決出来なくてもサポート先が解決の手伝いをしてくれる。 でも、有償サポートを結んでいないと、独力で解決しないといけなくなり、開発者の負担が増してしまう。

有償サポート契約は開発者の身を守る保険のようなものなのだなと改めて考えさせられた一件だった。