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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Heroku

HerokuはHeroku社が開発と運営を行っているPaaSの名称です。RubyやNode.js、Python、そしてJVMベース(Java、Scala、Clojureなど)の複数のプログラミング言語をサポートしている。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Apache Tomcat

Apache TomcatはApache Software Foundation (ASF)で開発されたオープンソースのWebコンテナです。

Q&A

解決済

1回答

3232閲覧

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

AIUeno

総合スコア15

Heroku

HerokuはHeroku社が開発と運営を行っているPaaSの名称です。RubyやNode.js、Python、そしてJVMベース(Java、Scala、Clojureなど)の複数のプログラミング言語をサポートしている。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Apache Tomcat

Apache TomcatはApache Software Foundation (ASF)で開発されたオープンソースのWebコンテナです。

0グッド

0クリップ

投稿2020/01/10 02:42

Heroku にjavaの動的Webアプリケーションをデプロイしました。
PDFlibというサードパーティ製のjarを組み込んでいますが、それがさらにpdflib_java.soを参照するため、
ネイティブライブラリの参照先を設定しているのですが、ロードできてません。

file

1├── Procfile 2├── README.md 3├── lib 4│   ├── libpdflib_java.so ←ここに参照させたいライブラリを設置 5│   └── pdflib.jar 6├── pom.xml 7├── src 8│   ├── log4j2.xml 9│   ├── main 10│   │   ├── java 11│   │   ├── resources 12│   │   │   └── application.properties 13│   │   └── webapp 14│   │   ├── WEB-INF 15│   │   │   ├── data 16│   │   │   │   ├── block_template.pdf 17│   │   │   └── web.xml 18│   │   ├── index.jsp 19│   └── test 20│   └── java 21

Herokuの環境変数
LD_LIBRARY_PATH に "/app/lib/" を設定しています。
最後のスラッシュはつけたり外したりと試しました。

アプリケーションを実行すると以下の様になってしまいます。

log

12020-01-10T02:35:40.420900+00:00 app[web.1]: Setting JAVA_TOOL_OPTIONS defaults based on dyno size. Custom settings will override them. 22020-01-10T02:35:40.438647+00:00 app[web.1]: Picked up JAVA_TOOL_OPTIONS: -Xmx300m -Xss512k -XX:CICompilerCount=2 -Dfile.encoding=UTF-8 32020-01-10T02:35:41.207914+00:00 app[web.1]: Cannot load the PDFlib shared library/DLL for Java. 42020-01-10T02:35:41.207923+00:00 app[web.1]: Make sure to properly install the native PDFlib library. 52020-01-10T02:35:41.207926+00:00 app[web.1]: 62020-01-10T02:35:41.207928+00:00 app[web.1]: For your information, the current value of java.library.path is: 72020-01-10T02:35:41.207931+00:00 app[web.1]: app/lib 82020-01-10T02:35:41.208207+00:00 app[web.1]: 92020-01-10T02:35:41.209576+00:00 app[web.1]: Exception in thread "main" java.lang.UnsatisfiedLinkError: no pdflib_java in java.library.path 102020-01-10T02:35:41.209898+00:00 app[web.1]: at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1860) 112020-01-10T02:35:41.210002+00:00 app[web.1]: at java.lang.Runtime.loadLibrary0(Runtime.java:870) 122020-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」
となっており、環境変数が読めていないようにも見えます。

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/01/10 03:11

仮想コンテナにアップされるのは war ファイルだけだとおもいましたが・・
退会済みユーザー

退会済みユーザー

2020/01/10 09:54

bootjarならね
AIUeno

2020/01/10 09:56

bootjarというのはspring boot のようにtomcatを含んで単体でサーバのように動けるjarのことでしょうか?
dameo

2020/01/11 04:24

Herokuで任意のnative shared libraryをインストールする方法は知りませんが、jarファイルの中にあるnativeライブラリの手動ロード方法についての質問を見つけたので紹介しておきます。 https://stackoverflow.com/questions/2937406/how-to-bundle-a-native-library-and-a-jni-library-inside-a-jar この中で回答した人が作ったコードが紹介されているのですが、見るべき場所が結構遠いので、その場所も載せておきます。 https://github.com/zeromq/jzmq/blob/master/jzmq-jni/src/main/java/org/zeromq/EmbeddedLibraryTools.java 起動時にjarファイル中のnativeライブラリを実行時に手動で一時ファイルとして展開・伸長し、ロードする、という手法のようです。 もちろん~.soはHerokuのコンテナ上でロード可能なライブラリでないといけませんし、コンテナがどれも同じ構成なのかも分かりません。 また手間が多いので私は確認していませんので、ご注意ください。あくまでただの情報です。
AIUeno

2020/01/11 04:40

有用な情報をありがとうございます。今回jarの中に.soが含まれているわけではなく、別出しでデプロイしています。 が、ネイティブライブラリのパスを追加した後、ldconfigというコマンドを実行する必要があるみたいです。 herokuのrun commandで実行したところ、コンソールからは権限がなく実行できず、buildpackをカスタマイズする必要がありそうでした。
dameo

2020/01/11 13:37

今までビルドはローカルでjarだけ置いていたのでnative shared libraryを手で設置する方法が分からなかったのですが、普通にgitリポジトリをpushし、heroku側でビルドさせれば、git内でコミットされたバイナリなら普通に参照することが出来ました。 loadの方法としてはProcfileで web: java -Djava.library.path=/app/lib -Dserver.port=$PORT $JAVA_OPTS -jar XXX/YYY.jar と指定するだけです(/app/libにライブラリがあります)。 Spring Bootで作ったプロジェクトをMavenでビルドする方式で作成しましたが、native shared libraryはlib/に直接バイナリを置いています。ldconfigは実施していません。java.library.pathで検索パスを指定するだけです。
退会済みユーザー

退会済みユーザー

2020/01/12 03:56

@dameo それだと JAVA_OPTS 環境変数にいれればいいのでは Procfile いじる必要ある?
dameo

2020/01/13 02:17

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

2020/01/13 02:56

Procfileに-Djava.library.path を追加したところ、ライブラリのロードエラーは解消されました。 ありがとうございました!!JAVA_OPTSの設定を知りませんので、Procfileにて設定することにしました。 お知恵をいただき、解決にいたりましたので、回答として投稿していただければベストアンサーに設定できるのですが。 なにか私の方で操作が必要なのでしょうか? 今回実はWebアプリケーションとしての構成は必要なかったようで、時間おきにバッチ起動(crontabのような感じで)の用途のためspring bootのパッケージにはしませんでした。 直接jar内のメインクラスが動けばOKなので、これでクローズにしたいと思います。
dameo

2020/01/13 07:15

自己解決でお願いします
guest

回答1

0

自己解決

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

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

投稿2020/01/15 05:16

AIUeno

総合スコア15

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問