Javaネイティブライブラリ(JNL)は、オペレーティングシステムが共有ライブラリとしてロードできるJNIコードとオブジェクトを含むJARアーカイブです。 これにより、Javaアプリケーションからプラットフォーム固有のメソッドによって実装された関数を呼び出すことができます。 JNLを作成する方法は、別の大きな記事のトピックです。したがって、すでにJNLがあり、それをアプリケーションで使用したいと考えています。 アプリケーションサーバーで実行されるアプリケーションでJNLを使用する機能については、この記事で説明します。
JNLを使用すると、次のマイナスの影響があります。
- JNLコードはJavaマシンの外部で実行されるため、セキュリティ上の問題が発生する可能性があります。
- JNL自体には、サポートされているプラットフォームの数が限られている可能性があります(「オペレーティングシステム」と「プロセッサ」の組み合わせ)。 したがって、JNLをサポートしていないプラットフォームでJNLを使用してアプリケーションを起動しようとすると失敗します。
ただし、JNLなしでは不可能な場合もあります。 例は次のとおりです。
- JavaアプリケーションからオペレーティングシステムAPIを直接使用する必要がある(たとえば、シリアルI / Oポートでの作業を実装する)
- 重いアルゴリズム(メディアのトランスコーディングなど)を実装する必要性。
スタンドアロンアプリケーションでJNLを使用することは、通常のJavaライブラリを使用することと実質的に変わりません。 つまり 前提条件は、クラスローダーに既知の場所にあるJNLの場所です(通常、クラスパスのどこかにライブラリを配置するだけで十分です)。 ただし、システムブートローダーから直接アクセスできるディレクトリにJNLを配置する必要がある場合があります。
ただし、アプリケーションが任意のアプリケーションサーバーで実行されるように設計されている場合、JNL WAR / EARファイルをポップして、サーバーにアプリケーションと共にインストールするだけでは失敗します。 その理由は明らかです:セキュリティホールの可能性。 JNLを使用するアプリケーションは、アプリケーションサーバーの権限でオペレーティングシステムにアクセスできます(少なくともこれが必要です)。 アプリケーションサーバーには独自のセキュリティシステムがあり、それをユーザーのアプリケーションにバイパスすることは、どういうわけか面倒ではありません。
したがって、JNLをEARまたはWARに直接接続すると、アプリケーションはもちろんクラッシュします。 ただし、JNIコードを呼び出そうとすると、例外が発生します(ほとんどの場合、
java.lang.UnsatisfiedLinkError
で、ネイティブライブラリ診断が別のクラスローダーに既にロードされてい
java.lang.UnsatisfiedLinkError
)。
それでは、アプリケーションサーバーでJNLを使用することは絶対に不可能ですか? 実際、これはそうではありません。 JNLが合法的に使用されていることをアプリケーションサーバー自体に説明する必要があります(おそらく、アプリケーションサーバー自体にJNLを使用することは多かれ少なかれ安全です)。 さらに、特定のアプリケーションサーバーに応じて微妙な点が始まります。
いずれにせよ、Javaコードをコンパイルするときは、使用するJNLへのパスを指定する必要があります(それに含まれるJavaクラスを参照できるようにするため)が、デプロイメント用のEAR / WARまたはJARファイル内にパッケージ化する必要はありません。 次に行うことは、宛先アプリケーションサーバーによって異なります。
Glassfish 3.x、4.xJNLをdomain-dir / libまたはdomain-dir / lib / extにコピーする必要があります(この場合、JNLはすべてのアプリケーションで利用可能になります)。 Glassfish構成およびユーザーアプリケーションでは、追加の変更は必要ありません。
WildFly、Jbossここではすべてが少し複雑です。 アクションのシーケンスは次のとおりです。
- $ JBOSS_ROOT / modules内にフォームのディレクトリセットを作成します。
$ JBOSS_ROOT / modules / path / to / my / module / main
- 必要なJNLをディレクトリにコピーします。
$ JBOSS_ROOT / modules / path / to / my / module / main
- 同じ場所に、module.xmlという名前と次の内容のテキストファイルを作成します。
<?xml version="1.0" encoding="UTF-8"?> <module xmlns="urn:jboss:module:1.3" name="..."> <resources> <resource-root path="_JNL.jar"/> </resources> </module>
- JNLを使用するアプリケーションで、MANIFEST.MFファイル(/ META-INFにある)に次の行を追加します。
依存関係:望ましいモジュールエクスポートの名前
JNLを現在のモジュールだけでなく、それに含まれる他のモジュール(EAR内など)でも使用できるようにする場合は、「export」パラメーターを追加します。