myproject.war
JBoss にデプロイされた Java Web アプリケーションがあります。アプリケーションの一部は、JNI を使用して C++ DLL に接続し、サードパーティ ライブラリのセットから関数を呼び出します。このアプリケーションを x32 サーバーから x64 サーバーに移行しています。
以前の環境ビルド
- 32 ビット Windows Server 2003
- JBoss 6.X
- Java 1.6.X
新しい環境の構築
- 64 ビット Windows Server 2008 R2、SP1 (6.1.7601)
- JBoss AS 7.2.0 最終「ヤヌス」
- Java ランタイム 1.7.0_45-b18。
- Visual Studio 2010 再頒布可能 x64 インストール済み
古いシステムでは、カスタム DLL とサードパーティ ライブラリが不用意にダンプされC:\Windows\System32\
、アプリケーションは JNI 経由でそれらに正常に接続できました。サードパーティ ライブラリには、いくつかの DLL、いくつかの ICC プロファイル、および True-type フォント、構成、その他のファイルを含むファイルのサブフォルダーを含む Resource フォルダーが含まれています。
移行のために、JNI コードを含む JBoss モジュールが作成されました。Java / JNI コードは に移動されMyModule.jar
、MyDriver.dll
x64 に再コンパイルされました。サードパーティ ライブラリの x64 バージョンが取得されました。
私は持っている
MyDriver.dll
Visual Studio 2010 (10.0.40219.1 SP1Rel) を使用して 64 ビット用に再コンパイルMyDriver.dll
サードパーティの DLL とリソース フォルダーの 64 ビット バージョンをモジュール フォルダーに配置..\main\lib\win-x86_64\
- モジュールファイルを
modules
フォルダーの下のパスにコピーしました - 作成した
module.xml
- 適切なリソースで
MyModule.jar
。MyDriverLoader
をロードするクラスを持っていますMyDriver.dll
。
- モジュールへの参照を使用して
sun.jdk
、JNIに必要であると100%確信していません。
- 適切なリソースで
DLL は以下でコンパイルされます。
- MFC の使用: 標準の Windows ライブラリを使用する
何をしても、アプリケーションを起動すると、JBoss は次の Java エラーをスローします。
java.lang.UnsatisfiedLinkError: D:\Jboss\jboss-7.2.0.Final\modules\com\mymodule\main\lib\win-x86_64\MyDriver.dll: 依存ライブラリが見つかりません
これが教えてくれるのは
- JBoss はモジュールから正しい DLL を検出できるため、モジュールを正しく構成できました。
- 一部の依存ライブラリが JBoss のパスにありません。
次の解決策を試しましたが、どれも機能せず、エラーが続きます。
- Visual Studio 2010 Redistributable x64 をインストールしましたが、これはおそらく既にパッケージ化されています。
{JBOSS_HOME}\modules\com\mymodule\main\lib\win-x86_64
Windows 環境変数に明示的に追加し、これを含むPATH
ことを確認しましecho %PATH%
た:D:\Java\jdk1.7.0_45\bin;D:\Jboss\jboss-7.2.0.Final\modules\com\mymodule\main\lib\win-x86_64;
.- x64 Dependency Walker を実行しましたが
MSVCP100D.DLL
、見つかりません。と の両方のフォルダーに両方のファイルが見つかりましたが、それぞれのファイル サイズが異なります。Dependency Walker は、存在する他のファイルのパスを検出したため、ファイルが見つからない理由がわかりません。テストするために、 と同じフォルダーにそれらを投げましたが、何も変わりませんでした。MSVCR100D.DLL
IESHIMS.DLL
MSCV*.DLL
c:\Windows\System32
C:\Windows\SysWOW64
system32
MSCV*.DLL
...\lib\win-x86_64
MyDriver.dll
これを解決するにはどうすればよいですか?
module.xml
<module xmlns="urn:jboss:module:1.1" name="com.mymodule">
<main-class name="com.mymodule.DriverClassName"/>
<resources>
<resource-root path="MyModule.jar"/>
</resources>
<dependencies>
<module name="sun.jdk"/>
</dependencies>
</module>
MyDriverLoader.java
public class MyDriverLoader {
/**
* Load C++ Library
*/
static {
System.loadLibrary("MyDriver");
}
/**
* Native Method to return the version of the C++ DLL.
*/
public native static String getVersion();
/**
* Main method calls getVersion.
*
* @param args
*/
public static void main(String args[]) {
System.out.println("MyDriverLoader calling MyDriver.dll version " + getVersion());
}
}
jboss-deployment-structure
<jboss-deployment-structure>
<deployment>
<dependencies>
<module name="com.mymodule" />
</dependencies>
</deployment>
</jboss-deployment-structure>
モジュールのフォルダ構造mymodule
:
{JBOSS_HOME}\modules\com\mymodule\main
- MyModule.jar
- モジュール.xml
- \lib\win-x86_64\
- MyDriver.dll
- サードパーティA.dll
- ThirdPartyB.dll
- ThirdPartyC.dll
- サードパーティD.dll
- \リソース\データ\設定\
- foo.optionfile
- bar.optionfile