質問: Heroku にjavaの動的Webアプリケーションをデプロイしました。 PDFlibというサードパーティ製のjarを組み込んでいますが、それがさらにpdflib_java.soを参照するため、 ネイティブライブラリの参照先を設定しているのですが、ロードできてません。 ``` ├── Procfile ├── README.md ├── lib │ ├── libpdflib_java.so ←ここに参照させたいライブラリを設置 │ └── pdflib.jar ├── pom.xml ├── src │ ├── log4j2.xml │ ├── main │ │ ├── java │ │ ├── resources │ │ │ └── application.properties │ │ └── webapp │ │ ├── WEB-INF │ │ │ ├── data │ │ │ │ ├── block_template.pdf │ │ │ └── web.xml │ │ ├── index.jsp │ └── test │ └── java ``` Herokuの環境変数 LD_LIBRARY_PATH に "/app/lib/" を設定しています。 最後のスラッシュはつけたり外したりと試しました。 アプリケーションを実行すると以下の様になってしまいます。 ``` 2020-01-10T02:35:40.420900+00:00 app[web.1]: Setting JAVA_TOOL_OPTIONS defaults based on dyno size. Custom settings will override them. 2020-01-10T02:35:40.438647+00:00 app[web.1]: Picked up JAVA_TOOL_OPTIONS: -Xmx300m -Xss512k -XX:CICompilerCount=2 -Dfile.encoding=UTF-8 2020-01-10T02:35:41.207914+00:00 app[web.1]: Cannot load the PDFlib shared library/DLL for Java. 2020-01-10T02:35:41.207923+00:00 app[web.1]: Make sure to properly install the native PDFlib library. 2020-01-10T02:35:41.207926+00:00 app[web.1]: 2020-01-10T02:35:41.207928+00:00 app[web.1]: For your information, the current value of java.library.path is: 2020-01-10T02:35:41.207931+00:00 app[web.1]: app/lib 2020-01-10T02:35:41.208207+00:00 app[web.1]: 2020-01-10T02:35:41.209576+00:00 app[web.1]: Exception in thread "main" java.lang.UnsatisfiedLinkError: no pdflib_java in java.library.path 2020-01-10T02:35:41.209898+00:00 app[web.1]: at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1860) 2020-01-10T02:35:41.210002+00:00 app[web.1]: at java.lang.Runtime.loadLibrary0(Runtime.java:870) 2020-01-10T02:35:41.210103+00:00 app[web.1]: at java.lang.System.loadLibrary(System.java:1122) ``` ライブラリのファイル名は先頭にlibをつけるという制約があるのか、 実際のファイル名はlibpdflib_java.soなのに「pdflib_java」が読めないというエラーでした。 ためしにpdflib_java.soでデプロイしても同じ結果です。 また、Herokuのconfig varsを変更してみても 「For your information, the current value of java.library.path is: app[web.1]: app/lib」 となっており、環境変数が読めていないようにも見えます。 ネイティブライブラリを読めるようにするにはどうしたらよいでしょうか? よろしくお願いいたします。
回答: 「Procfileで web: java -Djava.library.path=/app/lib -Dserver.port=$PORT $JAVA_OPTS -jar XXX/YYY.jar と指定するだけです(/app/libにライブラリがあります)。」 のアドバイスに従い修正。ライブラリのロードエラーは解消されました。