アプリケーションサーバーでのJavaネイティブライブラリの使用

Javaネイティブライブラリ(JNL)は、オペレーティングシステムが共有ライブラリとしてロードできるJNIコードとオブジェクトを含むJARアーカイブです。 これにより、Javaアプリケーションからプラットフォーム固有のメソッドによって実装された関数を呼び出すことができます。 JNLを作成する方法は、別の大きな記事のトピックです。したがって、すでにJNLがあり、それをアプリケーションで使用したいと考えています。 アプリケーションサーバーで実行されるアプリケーションでJNLを使用する機能については、この記事で説明します。



JNLを使用すると、次のマイナスの影響があります。



ただし、JNLなしでは不可能な場合もあります。 例は次のとおりです。



スタンドアロンアプリケーションで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.x



JNLをdomain-dir / libまたはdomain-dir / lib / extにコピーする必要があります(この場合、JNLはすべてのアプリケーションで利用可能になります)。 Glassfish構成およびユーザーアプリケーションでは、追加の変更は必要ありません。



WildFly、Jboss



ここではすべてが少し複雑です。 アクションのシーケンスは次のとおりです。




All Articles