1

WindowのLoadLibraryとFreeLibraryへのアクセスを提供するDLLがあります(Javaがそれをアンロードできないことを回避するため)。このDLLは2回ロードできないため、各Webアプリケーション間で永続化する必要があります。

私はこれらの手順に従いました:

http://wiki.apache.org/tomcat/HowTo#I.27m_encountering_classloader_problems_when_using_JNI_under_Tomcat

static { System.loadLibrary() }$ {TOMCAT} / libの下の呼び出しでシングルトンクラスを(jarとして)配置しました。Tomcat Webアプリがこのシングルトンにアクセスしても、エラーがスローされます

UnsatisfiedLinkError: Native Library ${TOMCAT}\lib\Native.dll already loaded in another classloader

これは、Tomcatの一般的なクラスローダーがこのクラスをロードし、インスタンス化して(http://tomcat.apache.org/tomcat-7.0-doc/class-loader-howto.htmlのように)、への参照を渡すと考えるのは間違っていますか?したがって、webappはwebappクラスローダーをバイパスしますか?

シングルトンをインスタンス化するようにTomcatに指示し(一般的なクラスローダーに強制的に実行させる)、Webアプリケーションの依存関係を満たすためにそのインスタンスを提供する方法はありますか?

どんな議論でも大歓迎です。

4

1 に答える 1

0

このリンクに従って、dll をアンロードします。

http://www.codethesis.com/blog/unload-java-jni-dll

ウェブアーカイブ版

Tomcat で実行している Web アプリケーションで試してみたところ、うまくいきました。

簡単に言うと、リフレクションを使用して、カスタム クラス ローダーによってロードされたクラスから System.loadLibrary を呼び出します。その後、このクラスはガベージ コレクターによって削除されます。

于 2014-09-22T21:56:42.547 に答える