質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.03%

Heroku上のjavaアプリケーションで、ネイティブライブラリが参照できない

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 916

score 15

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」
となっており、環境変数が読めていないようにも見えます。

ネイティブライブラリを読めるようにするにはどうしたらよいでしょうか?
よろしくお願いいたします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • dameo

    2020/01/13 11:17

    @asahina1979さん
    ここは質問者さん以外の書き込みで通知が来ないみたいなので、気づくのが遅れました。
    JAVA_OPTSでもいいのかもですね。なんかJVM用の設定ってイメージがあってこうしました。

    キャンセル

  • AIUeno

    2020/01/13 11:56

    Procfileに-Djava.library.path を追加したところ、ライブラリのロードエラーは解消されました。
    ありがとうございました!!JAVA_OPTSの設定を知りませんので、Procfileにて設定することにしました。

    お知恵をいただき、解決にいたりましたので、回答として投稿していただければベストアンサーに設定できるのですが。
    なにか私の方で操作が必要なのでしょうか?

    今回実はWebアプリケーションとしての構成は必要なかったようで、時間おきにバッチ起動(crontabのような感じで)の用途のためspring bootのパッケージにはしませんでした。
    直接jar内のメインクラスが動けばOKなので、これでクローズにしたいと思います。

    キャンセル

  • dameo

    2020/01/13 16:15

    自己解決でお願いします

    キャンセル

回答 1

check解決した方法

0

「Procfileで
web: java -Djava.library.path=/app/lib -Dserver.port=$PORT $JAVA_OPTS -jar XXX/YYY.jar
と指定するだけです(/app/libにライブラリがあります)。」

のアドバイスに従い修正。ライブラリのロードエラーは解消されました。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.03%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る