HOWTO: JNI 依存ライブラリ用のライブラリパスの設定方法

対応バージョン :2.2.9
対応エディション :プロフェッショナル版スタンダード版コミュニティー版
対応プラットフォーム :WindowsMac OSXLinuxIBM AIXFreeBSDHP-UXSolarisIBM z/Linux

Java は、[java.library.path.] システムプロパティで定義されたパスを検索して、ネイティブライブラリ(JNI)をロード(読み込み)します。 Java Service Wrapper では、 [wrapper.java.library.path.<n>] プロパティを活用することで、プラットフォームに依存しない独立型でも、とても簡単にこのパスの設定することができます。

次の例では、「../lib/」と「../lib2/」 ディレクトリーで JNI ライブラリを検索するライブラリパスを設定しています:

wrapper.java.library.path.1=../lib/
wrapper.java.library.path.1=../lib2/

ほとんどの JNI ライブラリでは、これで十分ですが、 一部のライブラリでは、その他のリンクされたライブラリをダイナミック(動的)に活用します。 Java は、Java ライブラリパスを使い、初期 JNI ライブラリを配置しますが、 セカンダリーライブラリは、そのプラットフォームのデフォルトメカニズムを使い、ロード(読み込み)されます。

Windows システムでは、まず現在の作業ディレクトリー (「wrapper.exe」の配置場所)を覗き、その後、 「Windows system32」ディレクトリーと Windows ディレクトリーを覗きます。 最後に、システムパス「PATH」全体を検索します。 もし両方の DLL ファイルが自分のアプリケーションの「lib」ディレクトリー に配置されていた場合、次のように、そのパスをシステムパスに追加する必要があるかもしれません。 その「set.PATH」は Windows 用の設定であり、 「set.LD_LIBRARY_PATH」は、 クロスプラットフォーム向けのコンフィギュレーションファイル用の設定であるため、UNIX システム上でも同様に動作します。 macOS では、「set.DYLD_LIBRARY_PATH」変数も活用できます。

set.PATH=..%WRAPPER_FILE_SEPARATOR%lib%WRAPPER_PATH_SEPARATOR%%PATH%
set.LD_LIBRARY_PATH=..%WRAPPER_FILE_SEPARATOR%lib%WRAPPER_PATH_SEPARATOR%%LD_LIBRARY_PATH%
set.DYLD_LIBRARY_PATH=..%WRAPPER_FILE_SEPARATOR%lib%WRAPPER_PATH_SEPARATOR%%DYLD_LIBRARY_PATH%

現在の作業ディレクトリーの中でなく、 「PATH」上に、セカンダリーライブラリを配置すると、 他のアプリケーションによってインストールされた古いバージョンのライブラリが、 「Windows system32」ディレクトリーで 競合するかもしれないというリスクがありますので、ご注意ください。 これは、システムがファイルを検索する順番によるものです。

この問題は、システム上に SAP アプリケーションもインストールされている場合に、 SAP の JCO ライブラリの動作にも見られることです。

さらに詳細は[wrapper.java.library.path.<n>]プロパティ をご覧ください。